LINUX.ORG.RU
ФорумAdmin

diff/patch для конфигов ядра

 config diff,


0

2

Есть необходимость иметь несколько конфигов ядра, с относительно небольшими различиями между ними.

Сейчас юзаю обычный diff + patch, но есть неудобства - размер патча порой сопоставим с размером конфига, и при смене версии ядра, когда в конфиги добавляется туча новых опций, приходится тратить много времени на напилинг изменений вручную.

Хотелось бы иметь простой diff с измененными строками (+ комментариями), грубо говоря - конфиг из которого вырезаны идентичные другому конфигу переменные (в идеале - еще и со старыми значениями), и утилиту для накладывания этого патча. Что-то типа такого:

# Some options
-# CONFIG_OPT5 is not set
+CONFIG_OPT5=y
+CONFIG_OPT6=m
# Some drivers
+CONFIG_DRIVER9=m
-# CONFIG_DRIVER12 is not set

Собссно вопрос - есть ли сабж в природе? Или нужно пилить? На первый взгляд - вроде не сложно, на пару вечеров покодить...

★★★★★
Ответ на: + от anonymous

Как вариант, хотя не совсем человекоудобно (хотелось бы иметь картинку по секциям конфига - для дальнейшего сравнения/обслуживания).

NiTr0 ★★★★★
() автор топика

make help

...
oldconfig - Update current config utilising a provided .config as base
silentoldconfig - Same as oldconfig, but quietly, additionally update deps
listnewconfig - List new options
olddefconfig - Same as silentoldconfig but sets new symbols to their default value
...

не ?

anTaRes ★★★★
()

Эй, у меня кое-что есть. Не совсем то, что ты хочешь, но может оно лучше решит твою проблему?

Обновление ядра. (комментарий)

Конкретно посмотри на kernel-configurator (тривиальная обёртка).

Детали опишу завтра, или постучи в жаббер.

Если кратко - можно держать в каталоге /etc/kernel/configs (или указав вручную каталог) конфиги типа https://gitlab.com/chaser/kernel-configs/tree/master

# ls -1 /etc/kernel/configs/
crypt
desktop
general
lvm
systemd
И на их основе генерировать .config примерно так
#!/bin/bash
set +x
KERNEL_SRC="/usr/src/linux"
CUSTOM_CONFIG="my.config"

cd $KERNEL_SRC &&
rm -f .config &&
make defconfig &&
kernel-configurator &&
mv .config $CUSTOM_CONFIG &&
KCONFIG_ALLCONFIG=$CUSTOM_CONFIG make allnoconfig

Результат работы kernel-configurator на моем десктопе

*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#
/usr/src/linux
scripts/config
/etc/kernel/configs
   "/etc/kernel/configs/andromeda"
/usr/src/linux/scripts/config --file /usr/src/linux/.config -d CONFIG_GENERIC_CPU
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_MK8
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_TRANSPARENT_HUGEPAGE
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_TRANSPARENT_HUGEPAGE_MADVISE
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_SND_DYNAMIC_MINORS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_EDAC_DECODE_MCE
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_I2C_PIIX4
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_I2C_CHARDEV
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_DRM                                                                                                                                          
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_DRM_RADEON                                                                                                                                   
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_DRM_NOUVEAU                                                                                                                                  
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_USB_XHCI_HCD                                                                                                                                 
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_R8169                                                                                                                                        
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_USB_STORAGE_REALTEK                                                                                                                          
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_SENSORS_IT87                                                                                                                                 
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_SENSORS_K10TEMP                                                                                                                              
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_SND_HDA_INTEL                                                                                                                                
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_SND_HDA_CODEC_REALTEK                                                                                                                        
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_SND_HDA_CODEC_HDMI                                                                                                                           
   "/etc/kernel/configs/crypt"                                                                                                                                                                                     
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_DM_CRYPT                                                                                                                                     
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_CRYPTO_USER_API_SKCIPHER
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_CRYPTO_XTS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_CRYPTO_TWOFISH_X86_64_3WAY
   "/etc/kernel/configs/desktop"
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_IOSCHED_BFQ
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_DEFAULT_BFQ
   "/etc/kernel/configs/general"
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_DEVTMPFS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_IKCONFIG
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_IKCONFIG_PROC
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_EXT4_FS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_FUSE_FS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_UDF_FS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_F2FS_FS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_NETFILTER_ADVANCED
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_TUN
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_NETFILTER_XT_MATCH_COMMENT
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_NETFILTER_XT_MATCH_HASHLIMIT
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_PM_RUNTIME
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_EXT4_FS_SECURITY
   "/etc/kernel/configs/lvm"
/usr/src/linux/scripts/config --file /usr/src/linux/.config -m CONFIG_DM_SNAPSHOT
   "/etc/kernel/configs/systemd"
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_AUDITSYSCALL
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_BLK_DEV_BSG
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_CGROUPS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_NET
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_NET_NS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_DEVTMPFS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_INOTIFY_USER
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_FANOTIFY
/usr/src/linux/scripts/config --file /usr/src/linux/.config -d CONFIG_SYSFS_DEPRECATED
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_FHANDLE
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_SECCOMP
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_IPV6
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_DMIID
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_AUTOFS4_FS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_TMPFS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_TMPFS_POSIX_ACL
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_TMPFS_XATTR
/usr/src/linux/scripts/config --file /usr/src/linux/.config --set-str CONFIG_UEVENT_HELPER_PATH ""
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_SCHEDSTATS
/usr/src/linux/scripts/config --file /usr/src/linux/.config -e CONFIG_SCHED_DEBUG
scripts/kconfig/conf  --allnoconfig Kconfig
#
# configuration written to .config
#

Ты можешь отдельно держать каталог с конфигами для каждой конфигурации. Общие конфиги можно вынести в отдельный файл и сделать симлинки. Как-то так.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от anTaRes

Не из той оперы. Я выше написал, что нужно - аналог diff/patch, но 1) без учета контекста и 2) с разделением по секциям (т.е. комментарии конфигов остаются на местах).

Основная задача, как я уже писал - иметь N конфигов, близких друг к другу по основным настройкам (набор модулей iptables и т.п.), и различающихся по части настроек платформы/наборам драйверов; легко проверять их различия и не иметь геморроя с апдейтами ядра.

NiTr0 ★★★★★
() автор топика
Ответ на: комментарий от NiTr0

так понасоздавай конфигов и при сборке ядра подсовывать нужный и make oldconfig или make olddefconfig , чтоб не спрашивало значения новых опций

ну, или запилить скриптик, который будет читать твои CONFIG_OPT5 и пр. из файлов и подставлять их в шаблонный конфиг ядра для соотв. конфига N
пять минут писанины

anTaRes ★★★★
()
Ответ на: комментарий от anTaRes

Мсье теоретик пробовал make oldconfig сделать между 3.14 и 4.1 хотя бы ядрами? Кол-во опций посчитать? Там их более сотни будет. И не все мне нужно ставить в дефолт, многие - включать или отключать принудительно (драйверы к примеру).

И да - сейчас примерно так же обновление ядра происходит, и хотелось бы эту процедуру упростить, не теряя кучу времени на обезьянью работу.

Повторяюсь - пробуйте прочитать хотя бы то, что нужно, а не предлагать то, что заведомо не подходит. Изначально - вопрос стоял «есть ли готовое с четкими критериями, или придется пилить велосипед самому».

NiTr0 ★★★★★
() автор топика
Ответ на: комментарий от NiTr0

Оно как раз автоматически генерирует конфиги при каждом обновлении ядра. Глянь хотя бы, как выглядят сами конфиги.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от anonymous

к чему эти плюсовые поделки?

Хранение конфигов в директории /etc/kernel/configs в произвольном количестве файлов, возможность указания иной директории конфигов, пути к сорцам, в куче с make defconfig + make allnoconfig можно всё генерировать и собирать хоть по крону.

Плюсовая поделка - это лишь обёртка над scripts/config. Можно было бы написать на bash, python, perl и т.д. Но на плюсах мне проще и быстрее.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от anonymous

scripts/config или scripts/kconfig/merge_config.sh - в любом случае пришлось бы обернуть в более удобную оболочку, потому что merge_config.sh из коробки всё равно не умеет то, что мне надо.

В случае с merge_config.sh мы обрабатываем опции пачкой. В случае scripts/config мы обрабатываем по одной опции за раз. Разве не так?

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от anonymous

Впрочем, в обёртке можно попробовать заменить scripts/config на scripts/kconfig/merge_config.sh. Надо продумать ещё юзкейсы, точно ли мне не понадобится поэлементная обработка конфигов...

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

и какой смысл обрабатывать по одной опции? впрочем ты и сам задался этим же вопросом....

anonymous
()

В общем, понял что того, что мне нужно, в природе нет, набросал на питоне примерно нужное в первом приближении - разве что удаляемые/добавляемые опции конфига целиком, не по «секциям», пихает, но вроде работает. Допилить немного осталось еще (чтобы помойку новых опций в конце файла не делал). Потом выложу результат куда-то, может кому сгодится.

NiTr0 ★★★★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

https://sourceforge.net/p/leaf/bering-uclibc/ci/linux-4.1/tree/tools/confdiff.py и https://sourceforge.net/p/leaf/bering-uclibc/ci/linux-4.1/tree/tools/confpatc...

генерит что-то типа такого, при патчевании - ругается на неверные строки исходного файла (отсутствующие/с другим значением) но не обламывается:

#
# Memory mapped GPIO drivers
#
-# CONFIG_GPIO_LYNXPOINT is not set

#
# PCI GPIO expanders
#
-CONFIG_GPIO_ML_IOH=m
+# CONFIG_GPIO_ML_IOH is not set
-CONFIG_GPIO_PCH=m
+# CONFIG_GPIO_PCH is not set
-CONFIG_GPIO_RDC321X=m
+# CONFIG_GPIO_RDC321X is not set

#
# USB GPIO expanders
#
-# CONFIG_POWER_SUPPLY is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_TEST_POWER is not set
+# CONFIG_BATTERY_DS2780 is not set
+# CONFIG_BATTERY_DS2781 is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_GAUGE_LTC2941 is not set
+# CONFIG_POWER_RESET is not set

#
# Native drivers
#
-# CONFIG_SENSORS_I5K_AMB is not set
+CONFIG_SENSORS_I5K_AMB=m
-# CONFIG_SENSORS_G762 is not set
+CONFIG_SENSORS_G762=m
-CONFIG_SENSORS_VIA_CPUTEMP=m
+# CONFIG_SENSORS_VIA_CPUTEMP is not set
-CONFIG_SENSORS_VIA686A=m
+# CONFIG_SENSORS_VIA686A is not set
-CONFIG_SENSORS_W83781D=m
+# CONFIG_SENSORS_W83781D is not set

NiTr0 ★★★★★
() автор топика
Ответ на: комментарий от NiTr0

Хех, ну ты так сделал велосипед :)

Часть написанного тобой функционала есть в сорцах ядра в scripts/config или в scrips/kconfig/merge_config.sh. Но поскольку ты делаешь построчную обработку, то смотреть надо таки на scripts/config.

Chaser_Andrey ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.