Компилируем ядро

       Ядро является важнейшей частью операционной системы Linux. Все драйверы основных устройств помещаются именно там, или же являются загружаемыми модулями Часто то ядро, которое идет в составе дистрибутива, не содержит тех или иных необходимых драйверов, или наоборот, содержит много ненужных. Кроме того, с момента установки с дистрибутива может пройти некоторое время, а многие программы предъявляют требования к версии ядра. Так и возникает необходимость в перекомпиляции.
       Прежде всего о версиях. Работы по разработке ядра идут непрерывно, о чем говорит частота выхода новых версий. Имеются две основных ветви разработки: стабильные и нестабильные ядра. Стабильные ядра содержат проверенный, отлаженный и надежный код, который, как правило, работает устойчиво. Нестабильные ядра содержат многие новые модули, которые не проверены до конца. Поэтому использовать стабильные ядра - значит жертвовать новыми возможностями, но получать взамен достаточно высокую надежность. Использование нестабильных ядер - это риск, но риск, оправдывающий себя: многие драйверы устройств можно встретить пока только в нестабильных ядрах. Бывают случаи, когда нестабильное ядро даже не удается откомпилировать, настолько неотлажен его исходный текст. Если нестабильные ядра выходят чуть ли не каждую неделю, то стабильные варианты - гораздо реже. Естественно, все новшества, появляющиеся в нестабильной ветви, постепенно переходят в стабильную.
       Как отличить стабильное ядро от нестабильного? Стабильное ядро имеет четный номер версии, а нестабильное нечетный. Например, ядра версий 1.0, 1.2, 2.0 - стабильные, а 1.1, 1.3, 2.1 - нестабильные. Последней версией стабильного ядра на сегодняшний день является 2.0.36, а нестабильного - 2.1.120.
       После того, как Вы решите, какое ядро Вам больше подходит, можно начать его выкачивание. Оригиналы ядер лежат на сервере ftp://ftp.kernel.org/pub/linux далее разные версии ядер лежат в разных каталогах. Обычно это архивы, упакованные с помощью архиватора tar и компрессора gunzip либо bzip2. Они выглядят примерно так: linux-2.0.35.tar.bz2 - ядро версии 2.0.35 (стабильное), упакованное tar-ом и сжатое bzip2. linux-1.1.3.tar.gz - ядро версии 1.1.3 (нестабильное и довольно старое), упакованное tar-ом и сжатое gunzip-ом. Ядра, сжатые bzip2, ощутимо меньше по объему, что немаловажно при перекачке их по линиям с повременной или покилобайтной оплатой соединения. Но для их распаковки требуется менее распространенный компрессор bunzip2, а gunzip имеется в любой уважающей себя UNIX-системе.
       После того, как ядро получено, его надо распаковать. Делать это лучше всего в каталоге /usr/src, для перехода в который дать команду

cp linux-2.0.35.tar.gz /usr/src ; cd /usr/src
Если архив имеет расширения .tar.gz или .tgz, то даем команды:
gunzip linux-2.0.35.tar.gz или gunzip linux-2.0.35.tgz
потом
tar xvf linux-2.0.35.tar
можно просто дать команду
tar xzf linux-2.0.35.tar.gz
Если архив имеет расширение .tar.bz2, то команды будут несколько другими:
bunzip2 linux-2.0.35.tar.bz2
tar xvf linux-2.0.35.tar

       в итоге всех трудов мы получаем каталог с именем linux. Лучше всего переименовать его в linux-номер.вашей.версии, а потом сделать символическую ссылку на него:

ln -s linux-2.0.35 linux

       Это нужно для того, чтобы можно было держать на диске несколько версий исходных текстов ядра (например, одно стабильное, и одно нестабильное). Тогда можно только изменять имя символической ссылки, не трогая самих каталогов.
       После этого переходим в каталог linux командой

cd linux
Дальше нам нужно сконфигурировать модули, которые войдут в состав ядра.

       Для этого есть на выбор 3 пути:
1) дать команду make config - самый простой и неинтересный путь. Неинтересный потому, что придется ответить на полсотни вопросов на английском языке. Как правило, это вопросы с ответами типа "да/нет". Если при первом конфигурировании надо ответить на все вопросы, то при повторных хотелось бы отвечать только на те, ответы на которые мы хотим поменять. Тогда надо попробовать использовать другой способ.
2) дать команду make menuconfig Эта команда даст нам возможность изменять конфигурацию из цветного меню. Правда, для успешной ее работы необходимо наличие библиотеки ncurses. Меню имеет систему подсказок (на английском) и помощь, вызываемую по каждому пункту меню с помощью клавиши "?"
3) запустить графическую оболочку X-Window, вызвать окно терминала и в нем дать команду

cd /usr/src/linux ; make xconfig
при этом будет выведено графическое меню, которое можно конфигурировать с помощью мышки. Этот способ требует наличия установленных и сконфигурированных X-Window и наличия библиотеки tcl/tk.

       Суть всех трех способов состоит в том, чтобы ответить на вопросы о включении того или иного модуля в состав ядра. Включение модуля дает какие-либо функциональные возможности, но сильно увлекаться не стоит: слишком большое ядро -- тоже плохо. Помимо непосредственного включения в состав ядра, тот или иной драйвер можно включить как подгружаемый модуль. Тогда он не будет загромождать память все время, а будет вызываться определенной командой.
       Разработчики ядер не рекомендуют делать загружаемыми модулями следующие драйверы:
Поддержку файловой системы корневого раздела (как правило, ext2fs);
Драйвер жесткого диска (IDE или SCSI), с которого производится загрузка;
Поддержку обычных жестких дисков;
Поддержку сети;
Поддержку TCP/IP;
       После того, как конфигурирование произведено, и мы вернулись в командную строку, записав конфигурацию, можно начать собственно компиляцию ядра. В третьем случае лучше выйти из X-Window, для того чтобы было больше свободной оперативной памяти. После этого даем команды

make dep
make clean
make zImage

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

make modules
make modules_install

       Можете проверить: после этого в каталоге /lib/modules появится каталог, имеющий именем номер версии: 2.0.35, а в нем сложены загружаемые модули. После успешной загрузки нового ядра, старый каталог (к примеру 1.2.13) можно удалить...
       Кстати, на заметку: все команды можно давать в одну строчку, разделяя их точкой с запятой:

make dep ; make clean ; make zImage ; make modules ; make modules_install

       тогда, после нажатия на "Ввод" можно пойти попить кофе :), но лучше это делать только, если Вы уверены, что в процессе компиляции не возникнут ошибки.
       Итак, процесс завершился, сообщений об ошибках не видно; даем команду

cd arch/i386/boot/

       и видим там еще тепленькое ядро по имени zImage. Скопируем его в корневой каталог:

cp zImage /
Теперь старое ядро vmlinz на всякий случай переименуем в vmlinuz.old:
cd /
mv vmlinuz vmlinuz.old
а новое запишем на его место:
mv zImage vmlinuz

       Я предполагаю, что у Вас установлен загрузчик lilo (LInux LOader), который позволяет грузить как DOS/Windows, так и Linux. Тогда подправим ему файл конфигурации (/etc/lilo.conf). Было так:

# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/hda
delay = 10
vga = normal    # force sane state
# End LILO global section

# DOS bootable partition config begins
other = /dev/hda1
  label = Win
  table = /dev/hda
# DOS bootable partition config ends

# Linux bootable partition config begins
image = /vmlinuz
  root = /dev/hda3
  label = lin
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends

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

# Linux bootable partition config begins
image = /vmlinuz.old
  root = /dev/hda3
  label = old
  read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends

       Как нетрудно заметить, мы грузимся с того же раздела жесткого диска, но другое ядро. Соответственно, другая метка (old). После того, как мы вышли из редактора (естественно, с сохранением) запустим lilo (догадайтесь с трех раз, какой командой!). lilo нам ответит примерно такой последовательностью строк:

Added win *
Added lin
Added old

       Это значит, что по умолчанию у нас будут грузиться Виндовс, а если в момент загрузки нажать на клавишу "Шифт", то можно будет на выбор либо загрузить lin (новое ядро) либо old (старое). Это нужно на случай, если новое ядро напрочь откажется грузиться.

       А напоследок -- коротко о файловой системе FAT, а точнее FAT32 и поддержке национальных языков. Начиная с версии ядра 2.0.34 Linux получил возможность работать с файловой системой FAT32 и именами файлов, содержащими буквы национальных алфавитов (нас больше интересует русский).