Подготовка и компиляция ядра

Первым делом надо наложить патч, отвечающий за работу Extended Attributes. Желательно сохранить предыдущее ядро (естественно все последующие действия должны совершаться с правами root'а):


cd /usr/src cp -Rv linux-2.2.17 linux-2.2.17.orig

Перейди в каталог, где ты сохранил файлы, и распакуй linux-2.2.17ea-0.7.2.patch.gz и linux-2.2.17acl-0.7.3.patch.gz:


gunzip linux-2.2.17ea-0.7.2.patch.gz gunzip linux-2.2.17acl-0.7.3.patch.gz

Затем скопируй их в /usr/src:


cp linux-2.2.17ea-0.7.2.patch linux-2.2.17acl-0.7.3.patch /usr/src

Теперь можно пропатчить ядро:


cd /usr/src/linux patch -p1 <../linux-2.2.17ea-0.7.2.patch >../patch1.err

Все сообщения о результатах работы сохранятся в файле /usr/src/patch1.err. Просмотри его на предмет содержания фраз типа ... FAILED -- saving rejects .... Наличие таких фраз означает, что установленное у тебя ядро не совпадает с оригинальным с Kernel.Org. Вероятнее всего, ядро, установленное у тебя на машине, уже было изменено разработчиками используемого тобой дистрибутива. Есть два выхода - скачать оригинальное ядро с ftp.kernel.org и использовать его (в этом случае существует вероятность того, что некоторые функции, поддерживаемые твоим текущим ядром, перестанут работать), или вручную изменить текущее.

Во втором случае необходимо определить на каких файлах patch выдал ошибку и вручную внести в них изменения. Покажу это на примере.

При пропатчивании ядра 2.2.17, входящего в дистрибутив Trustix Secure Linux, я получил следующее сообщение об ошибке:


patching file fs/ext2/inode.c
Hunk #1 FAILED at 47.
Hunk #3 succeeded at 564 (offset 9 lines).
1 out of 3 hunks FAILED -- saving rejects to file fs/ext2/inode.c.rej

Т.е. команда patch не смогла внести изменения в файл /usr/src/linux/fs/ext2/inode.c, т.к. он не совпадает с оригинальным. Все невнесенные изменения вместе со строчками оригинального кода сохранены в файле /usr/src/linux/fs/ext2/inode.c.rej. Вот содержимое такого файла:


*************** *** 47,55 **** */ void ext2_delete_inode (struct inode * inode) { - if (inode->i_ino == EXT2_ACL_IDX_INO || - inode->i_ino == EXT2_ACL_DATA_INO) - return; inode->u.ext2_i.i_dtime = CURRENT_TIME; /* When we delete an inode, we increment its i_version. If it is ever read in from disk again, it will have a different --- 47,52 ---- */ void ext2_delete_inode (struct inode * inode) { inode->u.ext2_i.i_dtime = CURRENT_TIME; /* When we delete an inode, we increment its i_version. If it is ever read in from disk again, it will have a different

Первая часть файла (от "*** 47,55 ****" до "--- 47,52 ----") - это строки файла-оригинала, строки, начинающие с "-" подлежат удалению, вторая часть - это уже измененные строки, строки, начинающиеся с "+" подлежат добавлению (в данном примере они отсутствуют). Цифры "47" и "55" в начале означают номера строк (с какой по какую), которые подлежат изменению.

Найдем в файле /usr/src/linux/fs/ext2/inode.c функцию ext2_delete_inode. Как видно из предыдущего листинга, код ее должен начинаться с 48-й строки (47-я содержит конец предыдущего комментария). Вот начало функции в моем /usr/src/linux/fs/ext2/inode.c:


... void ext2_delete_inode (struct inode * inode) { if (is_bad_inode(inode) || inode->i_ino == EXT2_ACL_IDX_INO || inode->i_ino == EXT2_ACL_DATA_INO) return; inode->u.ext2_i.i_dtime = CURRENT_TIME; /* When we delete an inode, we increment its i_generation. ...

Код данной функции не совпадает с тем, который ожидала найти команда patch. Здесь добавлен в условии вызов функции is_bad_inode. Удалим из условия проверки inode->i_ino == EXT2_ACL_IDX_INO и inode->i_ino == EXT2_ACL_DATA_INO, в результате останется следующий код:


... void ext2_delete_inode (struct inode * inode) { if (is_bad_inode(inode)) return; inode->u.ext2_i.i_dtime = CURRENT_TIME; /* When we delete an inode, we increment its i_generation. ...

Примерно таким же образом нужно поисправлять все ошибки. Но не стоит этого делать, если у тебя нет хотя бы начальных познаний в языке С.:) В этом случае лучше скачать оригинальное ядро.

После этого нужно наложить следующий патч - отвечающий за работу Linux ACLs.


cd /usr/src/linux patch -p1 <../linux-2.2.17acl-0.7.3.patch >../patch2.err

Как и в предыдущем случае, нужно просмотреть файл /usr/src/patch2.err на предмет ошибок.

Теперь можно преступать к конфигурации ядра:


cd /usr/src/linux make menuconfig

В меню Code Maturity Level Options отметь пункт Prompt for development and/or incomplete code/drivers. Затем в меню Filesystems найди пункт Extended filesystem attributes (EXPRIMENTAL). После выделения появятся еще два подпункта: Extended user attributes, отвечающий за поддержку расширенных атрибутов в системе и Access Control Lists, отвечающий за поддержку списков контроля доступа. Отметь их оба. Ниже есть пункт Second extended fs support, отвечающий за поддержку ext2. Он должен быть у тебя отмечен.:) У него есть подпункт Extended attributes for ext2 (DANGEROUS), отвечающий за поддержку расширенных атрибутов на файловой системе ext2. Отметь его. Без этой опции ничего работать не будет. Появится еще один подпункт - Extended attribute block sharing (EXPERIMENTAL). Данная опция позволяет использовать одни и те же расширенные атрибуты несколькими inode'ами. На данный момент это в стадии разработки, поэтому использовать не рекомендуется.

Сохрани полученную конфигурацию и собери новое ядро:


cd /usr/src/linux make clean dep install modules modules_install

Пока не стоит перегружать машину.:)

Предыдущая

Содержание

Следующая


(c)Ерижоков А.А., 2001.
Использование данного документа разрешено только с согласия автора и с указанием первоисточника: DH's Linux Site