Эта статья рассказывает об обновлении ядра до версии 2.4.2.

Семь шагов к новому ядру

(обновление ядра до версии 2.4.2)

1. Введение. Когда надо менять ядро.

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

Можно задать вопрос: "В каких случаях это необходимо?". Действительно, если система неплохо работает со старым ядром, то стоит ли заниматься его обновлением? Основными причинами, приводящими к такому выводу, являются:
- обновление аппаратуры компьютера, подключение новых устройств, которые не поддерживаются старым ядром,
- необходимость работы с новыми программами, которые рассчитаны на новую версию ядра и отказываются работать с версией, установленной у Вас,
- обнаружение каких-то ошибок в старой версии ядра, в частности таких, которые представляют угрозы с точки зрения безопасности,
- желание повысить производительность системы, используя более совершенную версию ядра,
- и, наконец, простое любопытство и желание работать с последней версией системы.

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

Для начинающих пользователей Линукс компиляция ядра из исходных кодов кажется чем-то супер-сложным и недоступным. Однако, я думаю, что прочитав настоящую заметку, Вы убедитесь, что это не сложнее, чем установка ПО из rpm-пакета.

Я был вынужден заниматься установкой ядра из исходников потому, что система виртуальных машин VMWARE отказалась работать с установленным у меня ядром 2.2.16, сообщив, что эта версия ядра не поддерживает работу с CDROM из VMWare и предложив мне либо установить более позднюю версию ядра, либо вернуться к версии 2.2.15. Попытки установить новую версию ядра из rpm-пакетов тоже не решили проблему, потому что конфигурационный скрипт VMWare сообщал, что ему не хватает header-файлов. Установка пакетов kernel-headers (полностью соответствующих ядру) тоже не привела к успеху, вот и пришлось сделать попытку установить ядро из исходников.

Надо сказать, что мой опыт установки ПО для Линукс из исходников пока что очень ограничен. Поэтому приступал я к этой процедуре только под давлением обстоятельств (очень хочется запускать MS Office под Линукс, не прибегая к перезагрузке компьютера). Ну, и как всегда, стал я подробно фиксировать свои действия, чтоб не наступать повторно на одни и те же грабли (как показывает мой опыт, все приходится рано или поздно повторять). В результате подкорректированные заметки я и предлагаю Вашему вниманию, может кому-то пригодится.

Я экспериментировал на версии 2.2.16-22 из свежеустановленного дистрибутива ASPLinux Release Candidate 3 и устанавливал ядро версии 2.4.2. Поэтому все примеры в данной работе приводятся для случая, когда система уже работает на ядре версии 2.2.x и Вы пришли к решению установить ядро версии 2.4.x.

Я, конечно, не первый из тех, кто описывает процедуру установки ядра из исходников. Если Вы хотите прочитать об этом в других источниках, просмотрите ссылки на соответствующей страничке "Виртуальной энциклопедии".

2. Что надо знать до начала компиляции

Пожалуй самое первое, к чему нужно быть готовым, приступая к компиляции ядра, - это то, что процедура эта длительная. Так что не рассчитывайте скомпилировать ядро "между делом", в свободную минутку. Заранее планируйте, что потратите на это несколько часов, иначе Вы будете вынуждены прервать процедуру посредине.

Во-вторых, в процессе компиляции программа установки задаст Вам добрую сотню вопросов (и все, к сожалению, по-английски). Перевод всех этих вопросов, относящийся к версии 2.0.x ядра, можно найти в файле Configure.help . Этот файл можно использовать и для более поздних версий, поскольку в основном вопросы, задаваемые при конфигурации, одинаковы, только появляются некоторые дополнительные в связи с появлением в ядре новых возможностей. Лучше всего скачать этот файл, распечатать его и использовать этот перевод в процессе конфигурирования ядра (смотри ниже шаг 3).

В-третьих, надо знать, что современные ядра Линукс имеют модульную структуру. Это означает, что в основное ядро включаются драйверы только тех устройств и частей системы, которые абсолютно необходимы в любом случае (например, управление памятью и процессами), а драйверы устройств, которые не являются необходимыми, компилируются в виде модулей, которые могут быть подключены пользователем по мере необходимости. Поэтому до начала компиляции ядра Вам необходимо хотя бы в общих чертах представлять, какую именно конфигурацию аппаратного обеспечения будет обслуживать новое ядро, и решить, какие устройства будут обслуживаться самим ядром, а какие - модулями.

В-четвертых, ядро версии 2.4.2 даже в архивированном (программой bzip2) виде занимает более 20 Мегабайт, а после разархивации объем исходных текстов превышает 108 Мегабайт. Еще столько же может потребоваться для промежуточного tar-архива, так что надо иметь не менее 250 Мегабайт свободного места. Поэтому прежде чем приступить к компиляции, позаботьтесь о том, чтобы места на диске было достаточно.

На этом предварительные предупреждения сделаны и я перехожу к изложению пошаговых инcтрукций. В дальнейшем предполагается, что все действия по компиляции и установке нового ядра выполняются с правами root-а, и что домашним каталогом является каталог /root.

3. Компиляция ядра из исходных кодов

Шаг 1. Получение и разархивация ядра

Исходные тексты ядра версии 2.4.2 можно скачать с сайта ftp.kernel.org. Как уже было сказано, bzip2-архив исходных кодов ядра имеет объем более 20 Мегабайт, так что скачать его - тоже еще проблема. Вообще говоря, существует возможность сократить объем информации, которую необходимо скачивать из Интернет, но об этом мы поговорим в последнем разделе данной статьи. А пока будем предполагать, что ядро ставится из полного пакета исходников. Может быть можно обойтись и без перекачки пакета из Интернет, поскольку с дистрибутивами обычно поставляются и исходные коды (на втором диске или просто в подкаталоге SRPM).

Поместите архив в каталог, в котором Вы имеете достаточные права, например, в Ваш домашний каталог. Не используйте каталог /usr/src/linux для разархивации исходников! Этот каталог содержит (обычно неполный) набор заголовочных файлов (kernel headers), которые используются заголовочными файлами библиотек (the library header files). Они должны соответствовать установленным в системе библиотекам, поэтому не стоит заранее вносить путаницу в эти файлы.

Распакуйте архив командой:

bzip2 -d linux-2.4.XX.tar.gz | tar xvf -
(где "XX" надо заменить на номер версии ядра, у меня была просто 2). Если Вы скачали архив, сжатый программой gzip, то, естественно, команда будет иметь вид:
		gunzip linux-2.4.XX.tar.gz | tar xvf -
Можно также воспользоваться следующим вариантом команды:
		tar xvzf linux-2.4.2.tar.gz
В результате в текущем каталоге появится новая директория linux. Сделайте ее текущей с помощью команды "cd".

Шаг 2. Обновление программного обеспечения

Если Вы владеете английским, то неплохо просмотреть файл README в каталоге linux и файлы Changes и Configure.help в подкаталоге linux/Documentation. Впрочем, тем кто не владеет английским, тоже необходимо заглянуть по крайней мере в файл linux/Documentation/Changes. Дело в том, что в этом файле приведен состав программного обеспечения, необходимого для компиляции нового ядра.

В приводимой ниже табличке показан его состав для случая ядра 2.4.2,

o  Gnu C                  2.91.66                 # gcc --version
o  Gnu make               3.77                    # make --version
o  binutils               2.9.1.0.25              # ld -v
o  util-linux             2.10o                   # fdformat --version
o  modutils               2.4.2                   # /sbin/insmod -V
o  e2fsprogs              1.19                    # /sbin/tune2fs
o  reiserfsprogs          3.x.0b                  # reiserfsck 2>&1|grep reiserfsprogs
o  pcmcia-cs              3.1.21                  # cardmgr -V
o  PPP                    2.4.0                   # pppd --version
o  isdn4k-utils           3.1pre1                 # isdnctrl 2>&1|grep version
Приведенные справа команды позволяют произвести проверку того, что необходимый продукт имеется и имеет соответствующую версию (более новые версии не возбраняются). Не все перечисленные в этой табличке продукты безусловно необходимы для компиляции ядра: если в Вашей системе нет PCMCIA-карт (PC Card), например, то Вам не нужен и пакет pcmcia-cs. Я посчитал ненужными последние 4 пакета (reiserfs и pcmcia у меня нет, а удаленный дозвон и соединение по isdn я не использую), а для остальных пакетов нашел на rpmfind.net последние версии и установил их. Все указанные пакеты установились из rpm-файлов без проблем.

Совет для чайников вроде меня: используйте команду rpm -Uhv paket_name, а не rpm -i paket_name.

Шаг 3. Конфигурирование будущего ядра

Первый этап заключается в конфигурировании будущего ядра. Если Вы при установке обновленных версий ПО покинули каталог linux, то вернитесь в него (например, с помощью команды 'cd ~/linux').

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

Собственно конфигурирование выполняется командой "make config". Конфигурация будет производиться в текстовом режиме. Процедура конфигурации в этом случае будет заключаться в том, что Вы должны будете последовательно ответить на серию вопросов о том, какое значение присвоить определенному параметру. На каждый вопрос предлагается обычно несколько вариантов ответа. Допустимые варианты ответа предлагаются в виде символов, заключенных в квадратные скобки. Я думаю, что смысл символов "y" и "n" пояснять не требуется. Пояснения требуют символы "?" и "m".

Символ "?" присутствует среди возможных вариантов ответа на любой вопрос и позволяет получить подсказку (конечно, по-английски). Эти подсказки и составляют содержание файла Configure.help, который упоминался выше.

Если Вы выбираете вариант "m", это означает, что драйвер соответствующего устройства будет сконфигурирован (и впоследствии скомпилирован) в виде отдельного подключаемого модуля.

Один из вариантов ответа на каждый вопрос представлен большой буквой (символов), что означает, что он выбирается по умолчанию (когда Вы не задаете явно свой вариант выбора, а просто нажимаете клавишу [Enter]).

В процессе конфигурации ядра следует иметь в виду следующее:

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

В заключение подраздела о конфигурировании ядра замечу только, что вместо "make config" можно использовать два альтернативных варианта команды конфигурации: "make menuconfig" и "make xconfig". Эти команды отличаются от "make config" тем, что предоставляют пользователю возможность вместо ответа на вопросы производить выбор вариантов из предлагаемых меню. Команда "make menuconfig" работает в текстовом режиме, а "make xconfig" - в графическом. На следующем рисунке представлен вид окна, которое появляется при запуске команды "make xconfig".

Кнопки, представленные в этом окне, отображают основные группы параметров конфигурации (кроме 4 кнопок в правом нижнем углу окна, которые служат для сохранения конфигурации или загрузки ранее сохраненных вариантов конфигурации). Щелчок по любой кнопке, соответствующей группе параметров, приводит к появлению нового окна, в котором уже можно задавать значения для конкретных параметров. Например, щелчок по кнопке "General setup" дает следующее окно.

Как видите, здесь можно просто выбрать один из трех вариантов "y", "n" и "m" (если какой-то из вариантов недоступен, то и возможности его выбрать нет) или получить подсказку по отдельному параметру (кнопка "Help"). Поскольку число параметров в этой группе велико, справа имеется полоса прокрутки.

Впрочем, мне не кажется, что конфигурировать ядро, используя графический интерфейс, проще, чем с помощью команды "make config". Так или иначе надо продумать и дать ответ на вопрос о каждом параметре конфигурации. Так что, может быть, лучше уж не торопиться и последовательно отвечать на вопросы, задаваемые "make config"? А иначе (в графическом режиме, я имею в виду) возникает шанс сбиться с пути и пропустить какую-то из кнопок. С другой стороны, преимуществом графического режима является возможность вернуться к какому-то из уже пройденных этапов и изменить ранее заданные значения тех или иных параметров. Кроме того, в каждом из окон имеется кнопка "Next", пользуясь которой можно последовательно пройти все этапы конфигурации.

В общем, представление о вариантах осуществления шага конфигурации Вы получили, а решать Вам. Отмечу только, что воспользоваться командой "make menuconfig" Вы сможете только при условии, что у Вас в системе установлена библиотека ncurses. У меня эта команда не сработала, несмотря на то, что библиотека вроде бы установлена.

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

Шаг 4. Проверки

Документация, поставляемая вместе с ядром, советует после завершения конфигурации выполнить два действия:
  1. Заглянуть в файл Makefile, чтобы вручную поправить некоторые значения.
  2. Дать команду "make dep" для установки зависимостей.
Честно сказать, для ручной правки файла Makefile у меня не хватает знаний (или нахальства, чтобы лезть в него, не понимая, что надо делать). Так что я этого делать не стал и поэтому дать по этому поводу какие-то разъяснения тоже не могу. Ну, а вторую рекомендацию я выполнил, так что и Вам советую. По экрану побегут непонятные сообщения, причем будет их очень много. Но если в конце не появляется сообщения об ошибке, то значит все завершилось успешно.

Шаг 5. Компиляция ядра

Вот мы и добрались до основного этапа - собственно компиляции ядра. На этом этапе Ваше участие сводится только к запуску команды "make bzImage", которая служит для создания сжатого образа ядра. Снова по экрану бегут непонятные сообщения (которые просто не успеваешь воспринять). Судя по всему у меня процесс компиляции завершился без ошибок. Последние сообщения, выданные мне при компиляции имели вид:

Root device is (3,5)
Boot sector 512 bytes.
Setup is 2360 bytes.
System is 887 kB
make[1]: Выход из каталог '/opt/kernel/2.4.2/linux/arch/i386/boot'
И в текущем каталоге появились файлы System.map и vmlinux. Кроме того, в подкаталогах каталога linux тоже появляется масса новых файлов (в том числе и .o-файлы, которые упоминались выше, как мешающие повторному проведению компиляции ядра в том же каталоге).

На этом собственно компиляция ядра и закончилась. В дополнение приведу еще три замечания из документации к ядру.

Шаг 6. Компиляция модулей

Если Вы сконфигурировали какие-то драйверы как отдельные модули (выбирали при конфигурации вариант "m" при ответе на некоторые вопросы), то Вы теперь должны еще выполнить команду "make modules", а затем еще команду "make modules_install". В файле Documentation/modules.txt можно найти дополнительную информацию по этому поводу, а также объяснение того, как использовать модули.

Шаг 7. Установка ядра

После этого остается сделать последний шаг - установить ядро и перезагрузиться. Для установки ядра Вы должны иметь права суперпользователя. Все предыдущие шаги можно было выполнить и от имени обычного пользователя. Не стоит работать от имени суперпользователя без необходимости!

Разработчики рекомендуют вначале сохранить где-нибудь копию старого ядра на случай, если что-то пойдет не так, как задумано. Эта рекомендация особенно актуальна для случая, если Вы ставите ядро из нестабильной ветки (development releases), поскольку такие версии могут содержать неотлаженный код. Кроме самого ядра надо сделать backup-копии модулей, соответствующих ядру. Если Вы устанавливаете новое ядро с тем же самым номером версии, что и у работающего в Вашей системе ядра, сделайте резервную копию всего каталога с модулями перед выполнением команды "make modules_install".

Для того, чтобы иметь возможность загружать новое ядро, копию образа ядра (которая после компиляции создана в виде файла .../linux/arch/i386/boot/bzImage) необходимо поместить туда, где у Вас расположены загружаемые ядра (обычно это каталог /boot).

Я скопировал в каталог /boot три файла: файлы System.map и vmlinux, появившиеся в ...linux и файл .../linux/arch/i386/boot/bzImage, причем при копировании добавил к их именам номер версии ядра, превратив их, соответственно, в System.map-2.4.2, vmlinux-2.4.2 и vmlinuz-2.4.2, чтобы не путать с теми ядрами, которые уже были в системе ранее. Переименовывать bzImage в vmlinuz в принципе не обязательно, потому что образ ядра может иметь как то, так и другое имя, и обычно располагается либо в корневом каталоге (/), либо в каталоге /boot.

Далее нам осталось только обеспечить загрузку нового ядра с помощью lilo. Для этого надо вначале подкорректировать файл /etc/lilo.conf. Ваш файл /etc/lilo.conf может иметь примерно такой вид:

    boot = /dev/hda2
    compact
    delay = 50
    root = current
    image = /boot/vmlinuz-2.2.11-4bc
	label = linux
	read-only
    other = /dev/hda1
	table = /dev/hda
	label = dos
Начиная со строки image идут секции конфигурационного файла, соответствующие разным операционным системам, которые должны загружаться по выбору пользователя. В каждой такой секции имеется строка label. В этой строке записывается имя, которое вводится в ответ на приглашение LILO и служит для выбора пользователем загружаемой ОС.

Скопируйте секцию image и замените название образа ядра и метку. Файл /etc/lilo.conf примет следующий вид:

    boot = /dev/hda2
    compact
    delay = 50
    root = current
    image = /boot/vmlinuz-2.2.11-4bc
	label = linux
	read-only
    image = /boot/vmlinuz-2.4.2
	label = linux-2.4.2
	read-only
    other = /dev/hda1
	table = /dev/hda
	label = dos
После того, как Вы откорректировали файл /etc/lilo.conf, необходимо выполнить команду /etc/lilo, чтобы изменения вступили в силу. Эта команда (которая в руководстве называется map-installer) обновляет карту загрузки системы. Прежде, чем запускать /etc/lilo для модификации загрузочных процедур, выполните эту команду с параметром -t. При этом будет выполнена вся процедура инсталляции загрузчика, кроме изменения map-файла и записи модифицированного загрузочного сектора, то есть выполнен тест нового варианта. Если добавить еще опцию -v, это позволит убедиться в том, что сделанные Вами изменения разумны.

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

Все! После переустановки lilo командами

    /sbin/lilo -t -v
    /sbin/lilo
Вы можете перезагрузить компьютер и выбрать при загрузке новое ядро.

4. Заключение

В заключение этой небольшой заметки необходимо привести несколько коротких замечаний.

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

В документации к ядру говорится, что команду 'make config' шаг пропускать ни в коем случае нельзя, даже если Вы провели самые незначительные обновления в исходных кодах.

Если Вы хотите провести обновление существующей конфигурации до новой версии с минимальными трудозатратами, то вместо "make config" можно воспользоваться командой "make oldconfig", которая задаст Вам вопросы только касающиеся тех параметров, которые изменились. Но, насколько я понимаю, ее можно использовать только в том случае, если Вы уже проводили установку ядра из исходников в своей системе, поскольку эта команда использует существующий файл ./.config.

В.А.Костромин