ТЗ
Тип ядра — это или обычное ядро (gentoo-sources) или ядро vserver (vserver-sources).
Конфиг ядра по умолчанию (config.default) — это конфиг ядра получающийся для данного типа ядра после вызов команды "make defconfig".
Глобальный патч — это патч, расположенный на сервере (download.trueoffice.org) и имеющий следующие параметры:
- тип ядра (определяется директорией, в которой патч располагается);
- версия ядра (определяется директорией, в которой патч располагается);
- имя патча (имя файла с патчем, например: base, router или opteron).
Локальный патч — это патч, расположенный локально на каждом сервере. В нем определяются специфичные для данного конкретного сервера параметры.
Список глобальных патчей — это параметр, определяемый в make.conf. Наследуется из профилей подобно USE-флагам (алгоритм "наследования" продумать отдельно). Этот параметр характеризует перечень и очередность наложения патчей на конфигурационный файл ядра.
Конфигурация ядра на конкретном сервере — это совокупность:
- типа ядра (указывается в make.conf);
- версии ядра (указывается в make.conf);
- списка глобальных патчей для конфига (например: base, server, opteron, router);
- локального патча (если есть).
Необходимо реализовать команду kernconfig (придумать нормальное имя). Команда должна:
- Без параметров. "Конфигурировать ядро":
- если не установлено — устанавливать ядро выбранного типа и версии (из make.conf);
- вызывать make defconfig;
- накладывать на конфиг ядра все глобальные патчи (по make.conf, скачавая патчи с сервера);
- накладывать на конфиг ядра локальный патч.
- С параметром --default. "Конфигурировать ядро по умолчанию". Тоже, что "конфигурировать ядро", только локальный патч НЕ накладывается.
- С параметром --save. "Создавать локальный патч".
Улититы
KConfMan
Kernel Configs/Configuration Manager.
diffconfig — Средство для создания патча путем сравнения 2 конфигов ядра:
$ diffconfig .config.old .config.new
kcpatch — Средство для пропатчивания ядра использующее файл патча:
$ kcpatch --config /usr/src/linux/.config --kcpatch /etc/kconfman/local/gentoo-sources/2.6.29-gentoo-r5/opteron.kcpatch
Структура каталогов на сервере
тип_ядра/версия_ядра/имя_патча.kcpatch .
|-- gentoo-sources
| `-- 2.6.29-gentoo-r5
| |-- base.kcpatch
| |-- config.default
| |-- opteron.kcpatch
| `-- router.kcpatch
`-- vserver-sources
`-- 2.6.29-vserver-2.3.0.36.14
|-- base.kcpatch
| |-- config.default
|-- opteron.kcpatch
`-- router.kcpatch
Формат файла патчей
-X86_INTEL_USERCOPY=y -X86_P6_NOP=y -X86_USE_PPRO_CHECKSUM=y =AMD_IOMMU=n>y =CALGARY_IOMMU=n>y =DEBUG_FS=n>y =GENERIC_CPU=n>y =HZ=100>1000 =HZ_100=y>n =HZ_1000=n>y =I7300_IDLE=n>m =IOMMU_API=n>y =JFS_FS=n>m =MCORE2=y>n =MSDOS_FS=n>m =NTFS_DEBUG=n>y =NTFS_FS=y>m =NTFS_RW=n>y =USB_EHCI_HCD=y>m =X86_INTERNODE_CACHE_BYTES=64>128 =X86_L1_CACHE_BYTES=64>128 =X86_L1_CACHE_SHIFT=6>7 +AMD_IOMMU_STATS=y +CALGARY_IOMMU_ENABLED_BY_DEFAULT=y +I7300_IDLE_IOAT_CHANNEL=y +JBD2_DEBUG=n +JFS_DEBUG=y +JFS_POSIX_ACL=y +JFS_SECURITY=y +JFS_STATISTICS=y
Обозначения:
"+" — добавить параметр (т.е. его вообще не было);
"-" — удалить параметр (т.е. вобще убрать);
"=" — изменить параметр. (->);
"y" — вкомпилировать в ядро;
"m" — собрать модулем;
"n" — выключить. Т.е. выставить "is not set".
Алгоритм создания локальных патчей
Локальный патч будет создаваться путем сравнения локального конфига с конфигом ядра по умолчанию (config.default) на который наложены глобальные и прочие патчи.
Алгоритм "наследования" списка патчей
/etc/make.profile/kc.conf
KERNTYPE="gentoo-sources" KERNVER="2.6.29-gentoo-r5" LISTKCPATCH="base opteron router"
Проект написан, осталось разработать патчи.