LINUX.ORG.RU

Тулза для автоматизации конфигурирования ядра — я всё правильно делаю?

 , ,


0

4

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

Для примера я буду рассматривать архитектуру amd64. Defconfig 86_64_defconfig находится в arch/x86/configs/x86_64_defconfig.

При запуске make menuconfig начальный .config генерируется исходя из значений в x86_64_defconfig. При запуске make defconfig происходит то же самое. Я проверил — сгенерированные конфиги идентичны.

В чём заключается идея.

Допустим, у меня есть шаблон для моего компа http://pastebin.com/MXpAf9qD. Я хочу натравить его на x86_64_defconfig, изменив или добавив необходимые опции. Я написал небольшую тулзу. На данный момент выхлоп примерно такой

Pass CONFIG_DEVTMPFS
Pass CONFIG_DEVTMPFS_MOUNT
Add CONFIG_IKCONFIG [m]
Add CONFIG_IKCONFIG_PROC [y]
Pass CONFIG_EXT4_FS
Add CONFIG_FUSE_FS [m]
Add CONFIG_UDF_FS [m]
Add CONFIG_TUN [y]
Add CONFIG_NET_SCH_HTB [m]
Add CONFIG_NET_SCH_INGRESS [m]
Add CONFIG_NETFILTER_XT_MATCH_COMMENT [m]
Add CONFIG_NETFILTER_XT_MATCH_HASHLIMIT [m]
Add CONFIG_PM_RUNTIME [y]
Pass CONFIG_EXT4_FS_SECURITY
Add CONFIG_I2C_PIIX4 [m]
Add CONFIG_I2C_CHARDEV [m]
Add CONFIG_MK8 [y]
Change CONFIG_DRM [y->m]
Add CONFIG_DRM_RADEON [m]
Add CONFIG_DRM_NOUVEAU [m]
Add CONFIG_USB_XHCI_HCD [m]
Add CONFIG_CONFIG_R8169 [m]
Add CONFIG_USB_STORAGE_REALTEK [m]
Add CONFIG_SENSORS_IT87 [m]
Add CONFIG_SENSORS_K10TEMP [m]
Add CONFIG_BONDING [m]
Add CONFIG_TRANSPARENT_HUGEPAGE [y]
Add CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS [y]
Add CONFIG_DM_SNAPSHOT [m]
Add CONFIG_EDAC_DECODE_MCE [y]

После этого идет запуск

make defconfig
Пока что всё вроде работает. Только предварительно надо делать резервную копию x86_64_defconfig.

Примеры синтаксиса в утилиты:

DEFCONF=arch/x86/configs/x86_64_defconfig
cp $DEFCONF $DEFCONF.bac

# обычное использование
kernel-config-patcher -v -o $DEFCONF $DEFCONF.bac -s ~/my.config

#или можно указать несколько пользовательских конфигов
kernel-config-patcher -v -o $DEFCONF $DEFCONF.bac -s ~/base.config -s ~/desktop.config -s ~/router.config

#или можно указывать опции прямо как аргумент (на стадии доработки)
kernel-config-patcher -v -o $DEFCONF $DEFCONF.bac CONFIG_EXT4_FS=n CONFIG_TUN=y

Вопрос: что я мог упустить?

★★★★★

Последнее исправление: Chaser_Andrey (всего исправлений: 1)

gentoo

cd /usr/src/linux
zcat /proc/config.gz >.config
genkernel --kernel-config=/usr/src/linux/.config --clean --no-mrproper --oldconfig --menuconfig --bootloader=grub2 --install all

Остальные опции genkernel добавить по вкусу, например у меня там еще splash, busybox, lvm,...

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

make oldconfig не подходит, по следующим причинам:

  • make oldconfig не учитывает дефолтные значения опций из x86_64_defconfig. Пример: некоторые опции стали deprecated и их убрали из x86_64_defconfig, но их ещё можно юзать. Что сделает make oldconfig, если в старом конфиге они были включены? Или другой пример, некоторые опции были в статусе experimental, но через пару выпусков ядра стабилизировались, и их решили включить в x86_64_defconfig, но в старом конфиге они могли остаться выключенными. Как будет вести себя make oldconfig?
  • Если у меня несколько машин, и при обновлении нового ядра я решу включить новые плюшки (или выключить), то мне придется вручную устанавливать эти плюшки на каждом компе. С моим решением я могу держать для всех компов общий конфиг base.conf, где достаточно занести нужную опцию и синхронизировать по всем компам (git мне в помощь, например).
  • с make oldconfig я не могу скриптовать сборку, проверяя разные параметры в каком-то скрипте и выставляя нужные опции динамически, без ручного вмешательства
Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от Lavos

genkernel слишком дубовый, и в нем нет возможности тонкого тюнинга параметров.

zcat /proc/config.gz >.config

Выше я уже написал, почему я не хочу опираться на текущий конфиг и делать oldconfig.

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

вот если бы ты изобрёл автоопределитель всего, чтоб оно само включало/выключало нужное, тогда это было бы менее ненужно. сейчас у тебя то же самое, что

zcat /proc/config.gz > /usr/src/linux/.config || /mnt/data/backup/config > /usr/src/linux/.config
ничего примечательного, абсолютно.

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

genkernel слишком дубовый, и в нем нет возможности тонкого тюнинга параметров.

Лолшто? vi .config - недостаточно тонкая настройка ядра?

Black_Shadow ★★★★★
()
Последнее исправление: Black_Shadow (всего исправлений: 1)
Ответ на: комментарий от Black_Shadow

Мне нужна автоматизация и скриптование, а так же отсутствие side-эффектов из-за старых конфигов.

Допустим, у меня есть несколько тачек с Gentoo. Мне достаточно на одной следить за новыми опциями в ядре, а остальные пусть обновляются без моей ручной работы, лишь присылая отчёты на мыльник.

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

Собсно, я обратился лишь с вопросом, нет ли каких-то подводных камней при использовании make defconfig и редактирования arch/x86/configs/x86_64_defconfig.

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

genkernel слишком дубовый, и в нем нет возможности тонкого тюнинга параметров.

С генкернелом можно и мейк менюконфиг использовать для тонкой до настройки относительно дефолта, и использовать готовый кофиг, кудо тоньше то?

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

Менюконфиг - это ручная работа, от которой я хочу избавиться.

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

Про опции генкернела же.

genkernel слишком дубовый, и в нем нет возможности тонкого тюнинга параметров.

Меня интересуют полностью скриптуемые решения без ручного вмешательства, которое можно закинуть в кронтаб или запускать одним единственным скриптом, на выхлопе которого посмотреть, что всё ок, конфиг ядра сгенерировался, ядро собралось, скопировано в /boot и конфиг grub перегенерирован.

Любые интерактивные редакторы или конфигураторы не катят, это слишком утомительно, монотонно, и оно не может запускаться в кронтабе.

oldconfig приводит к побочным эффектам из-за старых опций.

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

Тред не о том, почему мне это не нужно, а о том, что я мог упустить, полагаясь на редактирование arch/x86/configs/x86_64_defconfig и использование make defconfig (или make x86_64_defconfig).

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

я не понял. ты каждый раз редактируешь конфиг с нуля? зачем тебе defconfig?

пока ты толком (хотя бы как мегабакс: выложил — тыкайте, материтесь) не объяснишь, что ты там костыляешь, тебе дальше oldconfig и /proc/config.gz ничего не насоветуют, я так думаю. ты набыдлокодил накую-то неведомую фигню, которая (как я понял) правит дефолт, который что? что дальше? ЯННП.

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

я не понял. ты каждый раз редактируешь конфиг с нуля?

Да, чтобы не было влияния старых опций. Прочитай тред, я уже объяснял.

зачем тебе defconfig?

Он генерирует стандартный конфиг, исходя из arch/x86/configs/x86_64_defconfig (например).

правит дефолт, который что?

Который влияет на создание .config. Если в arch/x86/configs/x86_64_defconfig указано CONFIG_TUN=y, то и в сгенерированном .config будет CONFIG_TUN=y, а также все нужные зависимости.

что дальше?

После предыдущих пунктов получил нужный мне .config, и можно уже запускать make && make modules_install

По сути, всё можно свести до

KERNEL_SRC=/usr/src/linux
DEFCONF=arch/x86/configs/x86_64_defconfig

emerge -1 gentoo-sources &&
cd KERNEL_SRC &&
cp $DEFCONF $DEFCONF.bac &&
kernel-config-patcher -v -o $DEFCONF $DEFCONF.bac -s ~/base.config -s ~/desktop.config -s ~/router.config &&
make defconfig &&
make -j4 &&
make modules_install ||
exit 1

KERNEL_VERSION=`strings $KERNEL_SRC/arch/x86/boot/compressed/vmlinux.bin  | grep -F "Linux version" | awk '{print $3}'`

cp $KERNEL_SRC/arch/x86/boot/bzImage /boot/kernel-$KERNEL_VERSION &&
grub2-mkconfig -o /boot/grub/grub.cfg &&
exit 0

выложил — тыкайте, материтесь

В процессе.

Chaser_Andrey ★★★★★
() автор топика
Последнее исправление: Chaser_Andrey (всего исправлений: 2)
Ответ на: комментарий от anonymous

Предложи решения получше. Без oldconfig и любой интерактивщины.

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

вот если бы ты изобрёл автоопределитель всего, чтоб оно само включало/выключало нужное

дык, давно прикрутили :

$ cd /usr/src/linux
$ make help | grep local
  localmodconfig  - Update current config disabling modules not loaded
  localyesconfig  - Update current config converting local mods to core

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

теперь понял. пили.

только ты в приведённом коде забыл eselict kernel set [версия_нового_ядра], на всякий случай, если ты dkms-gentoo не пользуешь, например.

и ещё: назвал патчером, пускай патчит, а не подменяет defconfig. тогда ты смодешь использовать без костылей epatch_user, а не изобретать велосипед.

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