ТЗ

Тип ядра — это или обычное ядро (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"

Проект написан, осталось разработать патчи.