главная пошаговое создание livecd что такое linux ISO образы
Операционная система с графическим интерфейсом
На главнуюКонтактыКарта сайта
Полезное


 

Комфортная школьная одежда из натуральных тканей.

ДОБРО ПОЖАЛОВАТЬ


Собери свой Ubuntu: Пересборка ядра

Теперь можно заняться пересборкой ядра. Зачем? Во-первых, дабы избавиться от лишних его опций, а заодно и от необходимости initrd, подгружающего массу ненужных в каждом конкретном случае модулей. Конечно, без пересборки ядра можно и обойтись - но уж кутить так кутить, заиндивидуализируем систему до упора.

Так что устанавливаем инструментарий для сборки ядра:
$ sudo apt-get install kernel-package

который в качестве своих зависимостей втянет компилятор gcc, binutils и все прочее, необходимое для обеспечения процесса сборки любой программы. Однако для сборки ядра этого будет недостаточно. Потребуется также пакет
$ sudo aptitude install libncurses5-dev

отвечающий за построение меню при выполнении make menuconfig, пакет
$ sudo aptitude install debhelper

обеспечивающий получение помощи в этом нелегком деле, и пакет
$ sudo aptitude install modutils

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

Теперь нужно то, вокруг чего, собственно, все и вертится - исходные тексты ядра. Их мы получаем, установив пакеты
$ sudo aptitude install linux-source-2.6.17

представляющий собой собственно тарбалл исходников ядра (tar.bz2), и
$ sudo aptitude install linux-headers-2.6.17-5-686

с заголовочными файлами. В качестве зависимостей они вытащат нам все, что еще потребуется для сборки ядра.

Что ж, можно начинать процедуру. Переходим в нужный каталог
$ cd /usr/src

и посредством команды ls видим в нем файл linux-source-2.6.17.tar.bz2. Каковой подлежит немедленному распаковыванию:
$ sudo tar xjvf linux-source-2.6.17.tar.bz2

Перемещаемся во вновь возникший каталог
$ cd linux-source-2.6.17

и копируем в него последний из наличных конфигов
$ sudo cp /boot/config-2.6.17-5-386 .config

Он понадобится, чтобы не начинать конфигурирование ядра с "чистого листа".

Теперь все делаем, как обычно, то есть конструируем меню конфигурации ядра:
$ sudo make menuconfig

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

К слову сказать, процесс пересборки ядра требует административных прав на протяжении длительного времени, так что ввод команды sudo и в дальнейшем пользовательского пароля может и притомить. Так что не лишено резона получить права root-оператора бессрочно - с помощью команды
$ sudo -s -H

Впрочем, осторожнее поступить так, как я описывал выше - но это оставляю на усмотрение пользователя.

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

Так, в разделе General setup я предпочитаю включить опции
[*] Kernel .config support
[*] Enable access to .config through /proc/config.gz

что обеспечивает доступ к конфигурации текущего ядра через файловую систему procfs: ее можно будет просмотреть простой командой
$ zcat /proc/config.gz

а не рыться в поисках актуального в данный момент конфига по каталогу /boot или /usr/src/linux-*

В секции Block layer я отключаю строку
[ ] Support for Large Block Devices

за ненадобностью: ну нет у меня дисковых устройств более 2 терабайт объемом.

В секции Processor family следует подобрать возможно близкий тип процессора. В моем случае (32-битный Sempron) это будет, очевидно,
(X) Athlon/Duron/K7

Сам по себе Sempron в списке доступных типов процессоров отсутствует.

Здесь же можно отключить такие явно ненужные вещи, как
< > Toshiba Laptop support

< > Dell laptop support

Если, конечно, ядро не собирается именно для этих ноутбуков. Ну и такие Intel-специфические вещи, как
< > /dev/cpu/microcode - Intel IA32 CPU microcode support
< > /dev/cpu/*/msr - Model-specific register support
< > /dev/cpu/*/cpuid - CPU information support

также выглядят лишними. В общем, для отключения в ядре архитектурных излишеств - перспективы огромные. Главное - не увлечься и не отключить что-либо критически важное. И еще: поскольку ранее решено было отказаться от initrd при загрузке, следует очень внимательно проверить, что поддержка устройств и файловых систем, несущих корневую файловую систему, была встроена в ядро, а не собиралась как загружаемый модуль.

То же самое относится к чипсету - очевидно, что в конкретной машине он будет один, наример, в моем случае
<*> ATI IXP chipset IDE support

Поддержку же прочих, не имеющих быть в наличии, чипсетов можно спокойно отключить. Аналогично поступив и с многочисленными SCSI-адаптерами - хотя сама по себе поддержка SCSI-интерфейса
SCSI device support

родового класса SCSI-устройств
SCSI disk support

и SCSI-дисков
SCSI generic support

в разделе SCSI device support следует оставить - они обеспечивают работу с USB-накопителями любого рода и носителями цифровых камер.

В большинстве случаев можно смело отключать и опцию [*] Multiple devices driver support (RAID and LVM)

в разделе Multi-device support (RAID and LVM). Если, конечно, LVM и программный RAID действительно не используются.

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

Закончив конфигурирование, выходим из menuconfig с сохранением изменений и запускаем
$ sudo make-kpkg clean

Необходимость этого на чистом, казалось бы, дереве исходников

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

А вот теперь - собственно сборка:
$ sudo fakeroot make-kpkg --append_to_version \
-sempron --revision=rev.01 kernel_image

Здесь fakeroot, как уже было сказано, задает "правильное" root-окружение, команда make-kpkg выполняет собственно сборку ядра и модулей (подменяя собой обычные make vmlinuz и make modules), --append_to_version, --sempron и --revision=rev.01 задают дополнения к имени собираемого пакета, каковым в качестве basename выступает kernel_image.

Теперь остается только ждать завершения процесса. На моей машине с процессором Mobile Sempron 3300+ (реальная тактовая частота - 2 Ггц) и при моей конфигурации ядра он продолжается около 30 минут. А результатом его будет появление в каталоге /usr/src файла вида linux-image-2.6.17.6-sempron_rev.01_i386.deb, представляющего собой самый обыный deb-пакет, который остается только установить. Что мы и проделываем обчным же образом - переходим "на этаж выше" в файловой иерархии
$ cd ..

и даем команду
$ dpkg -i kernel-image-2.6.17.6-sempron_rev.01_i386.deb

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

Хотя нет - нам надо предохранить установленный пакет от обновления при глобальной операции типа aptitude dist-upgrade, иначе мы после нее получим следующую сборку умолчального ядра, то есть все наши трды пойдут прахом. В этом деле прибегнем к интерактивному режиму программы aptitude. В ее списке установленных пакетов отыскиваем собранный нами, нажатием клавиши <=> фиксируем его и нажатием горячей клавиши делаем его необновляемым при обычном upgrade системы.