Руководство по Gentoo Linux Genkernel

Tim Yamin  автор
Jimi Ayodele  участник
Thomas Seiler  поддержка NFS
Михаил Ярмиш  переводчик
Алексей Чумаков  редактор перевода

Обновлено 16 декабря 2005
Исходный документ обновлен 22 июня 2008

1.  Предисловие

Назначение

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

Целевая аудитория

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

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

Установка genkernel

Для получения genkernel запустите emerge genkernel в командной строке. Если вы используете Gentoo Reference Platform (GRP), не забудьте установить двоичные пакеты, указав флаг -k команде emerge. Так как GRP комплектуется старой версией genkernel, флаги могу различаться. В любом случае, обратитесь к genkernel --help, чтобы узнать, как использовать версию genkernel, установленную в вашей системе.

2.  Работа с genkernel

Как использовать genkernel

Хотя есть несколько способов запустить genkernel, простейший из них — genkernel all. В нем используется универсальные настройки, прекрасно работающие на большинстве систем. Как отмечено ранее, этот подход не избавлен от недостатков. Большинство создаваемых модулей бесполезно для обычного пользователя, но увеличивает время компиляции. Ниже приведен более эффективный подход, достигаемый передачей genkernel определенных флагов от имени root:

Листинг 2.1: Запуск genkernel (с флагами)

# genkernel --bootsplash --no-install --no-clean --menuconfig all

Приведенная операция вынуждает genkernel создать ядро с загрузочной заставкой (--bootsplash), предназначенное для ручной установки (--no-install). При подготовке дерева исходного кода ядра, genkernel не будет вычищать существующие в нем объектные файлы (--no-clean). Будет запущена утилита настройки, снабженная меню, позволяющая выбрать модули для компиляции (--menuconfig).

Есть и другие флаги, влияющие на результат работы genkernel. Например, замена флага --no install на --install позволяет genkernel автоматически установить новое ядро в каталог /boot. Использование флага --mountboot позволяет genkernel автоматически смонтировать раздел /boot, если необходимо.

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

Далее в этой главе рассматривается действие различных флагов, и операции, имеющиеся в genkernel. У некоторых флагов есть варианты, позволяющие выполнять обратные операции. В обратных вариантах используется приставка no-, а описание их действия приводится в квадратных скобках, [].

Флаги настройки

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

Флаги компиляции

Действие следующих флагов обычно проявляется в самом процессе компиляции:

Флаги компилятора

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

Отладочные флаги

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

Флаги инициализации

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

Прочие флаги

Флаги, перечисленные ниже, поддерживаются genkernel, но не относятся к другим категориям:

Возможные действия

Действия указывают genkernel, что компилировать. На данный момент поддерживаются следующие действия:

Последнее действие, all, рекомендуется большинству пользователей, так как обеспечивает сборку всех стадий, необходимых для работоспособности ядра. Помните, что действие просто сообщает genkernel, что собирать, а не что устанавливать.

Настройка загрузчика

Чтобы настроить genkernel на работу с вашим загрузчиком, необходимо сделать три-четыре изменения в файле настроек загрузчика:

  1. Включите root=/dev/ram0 и init=/linuxrc в параметры ядра, передаваемые образу ядра.
  2. Добавьте real_root=/dev/hda3 (например) к параметрам ядра, передаваемым образу ядра, если ваш корневой раздел — /dev/hda3.
  3. Если вы пользуетесь загрузочной заставкой bootsplash, добавьте подходящую строчку режимов, например, vga=0x317, к параметрам, передаваемым ядру. Также добавьте splash=verbose или splash=silent, в зависимости от необходимого уровня подробности сообщений загрузчика.
  4. Добавьте нужную загрузчику информацию о начальном корневом диске (initrd). За подробностями о настройке загрузчика на initrd обращайтесь к главе Настройка загрузчика Настольной книги Gentoo.

3.  Параметры настройки

Изменение /etc/genkernel.conf

Передавать genkernel флаги из командной строки может быть очень неудобно, в особенности, если у вас их с десяток:

Листинг 3.1: Запуск genkernel (перегруженного флагами)

# genkernel --debuglevel=5 --no-color --no-mrproper --clean --gensplash \
--kerneldir=/path/to/alternate/kernel/sources --install --menuconfig \
--kernel-config=/path/to/preferred/configfile --save-config --mountboot all

К счастью, существует файл настроек, при необходимости можно выставить как надо большинство основных параметров. Ниже приведено краткое описание самых значимых:

Установив нужные значения в /etc/genkernel.conf, вы можете наполовину сократить количество флагов, передаваемых genkernel из командной строки:

Листинг 3.2: Запуск genkernel с флагами после применения genkernel.conf

# genkernel --gensplash --kerneldir=/path/to/alternate/kernel/sources \
--kernel-config=/path/to/preferred/configfile --install all

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

4.  Загрузка по сети с применением genkernel

Загрузка по сети с установочного диска

Утилита genkernel может собирать образы ядра и initrd, поддерживающие сетевую загрузку, или netboot. Если повезет, в среду, предоставляемую установочным диском, по сети можно загрузить любой современный компьютер.

Волшебство таится в сценарии genkernel linuxrc. Он пытается смонтировать установочный диск по сети (netmount) с помощью сетевой файловой системы (NFS). Далее управление передается сценариям инициализации, как если бы установочный диск присутствовал локально.

Сборка образов ядра и initrd с поддержкой сетевой загрузки

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

Предупреждение: Поддержка сетевой загрузки в genkernel является экспериментальной и может содержать ошибки.

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

Листинг 4.1: Настройка поддержки драйвера сетевой платы в ядрах 2.6

Device Drivers --->
   Networking Support --->
      Ethernet (10 or 100Mbit)  --->
         [*] Ethernet (10 or 100Mbit)
         <*>   the driver for your network card
(обязательно выбирайте <*>, а не <M>)

Во-вторых, советуем включить параметры IP: kernel level autoconfiguration и IP: DHCP support. Это позволит избежать лишних сложностей, так как IP-адрес и сетевой путь NFS к установочному диску можно настроить на сервере DHCP. Конечно, это означает, что командная строка ядра останется неизменной для любого компьютера, что очень важно для загрузки по сети.

Листинг 4.2: Настройка поддержки DHCP в ядрах 2.6

Device Drivers --->
   Networking Support --->
      Networking options
         [*] TCP/IP networking--->
         [*]   IP: kernel level autoconfiguration
         [*]     IP: DHCP support
(эти параметры обязывают ядро посылать при загрузке запрос DHCP)

Кроме того, следует включить SquashFS, поскольку она требуется для большинства современных установочных дисков Gentoo. Поддержка SquashFS не включена в основное дерово исходного кода ядра. Для ее включения требуется наложить необходимые заплатки на дерево или установить gentoo-sources.

Листинг 4.3: Настройка поддержки SquashFS в ядре

File systems--->
   Miscellaneous filesystems --->
      [*] SquashFS 2.X - Squashed file system support

После завершения компиляции создайте архив (tar.gz), содежащий модули ядра. Этот шаг необходим только тогда, когда версия вашего ядра не совпадает с версией образа ядра на установочном диске.

Листинг 4.4: Создание архива с модулями ядра

(создание tar.gz, содержащего все модули)
# cd /
# tar -cf /tmp/modules-X.Y.Z.tar.gz /lib/modules/X.Y.Z/

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

Листинг 4.5: Создание загрузочного образа

(создание образа для загрузки по сети ethernet)
# emerge mknbi
# cd /boot
# mkelf-linux -params="root=/dev/ram0 init=/linuxrc ip=dhcp" kernel... initrd... > etherboot.img

(cоздание образа OpenBoot / SPARC64 TFTP)
# emerge sparc-utils
# cd /boot
# elftoaout kernel... -o kernel.aout
# piggyback64 kernel.aout System.map-... initrd-...
# mv kernel.aout openboot.img (это - загрузочный образ)

(для PXE больше ничего не надо. kernel и initrd можно использовать как есть)

И наконец, скопируйте ядро на свой TFTP сервер. Подробности зависят от архитектуры, и выходят за рамки данного рудоводства. Обратитесь к документации от своей платформы.

Настройка NFS

Для создания общего ресурса сетевой файловой системы (NFS), содержащего установочный диск, используйте устройство loop, для монтирования ISO-образа, а затем cкопируйте содержимое компакт-диска на общий ресурс. В качестве приятного дополнения, сценарии initrd genkernel распакуют все архивы tar.gz, находящиеся в каталоге /nfs/livecd/add/. Все что от вас потребуется — скопировать архив modules-X.Y.Z.tar.gz в каталог /nfs/livecd/add/.

Листинг 4.6: Подготовка общего каталога NFS

(предполагается, что /nfs/livecd - экспортированный общий каталог NFS)
# mount /tmp/gentoo-livecd.iso /mnt/cdrom -o loop
# cp -p /mnt/cdrom /nfs/livecd
# umount /mnt/cdrom

(копирование modules.tar.gz в /add)
# mkdir /nfs/livecd/add
# cp /tmp/modules-X.Y.Z.tar.gz /nfs/livecd/add

Настройка DHCP

Образы сетевой загрузки запрашивают IP-адрес и корневой путь у сервера DHCP. Оба параметра можно указывать раздельно для каждого узла, для идентификации компьютера пользуясь MAC-адресом:

Листинг 4.7: Пример настройки клиентского dhcpd.conf

...

host netbootableMachine {
         hardware ethernet 11:22:33:44:55:66;
         fixed-address 192.168.1.10;
         option root-path "192.168.1.2:/nfs/livecd";
}
# Здесь 192.168.1.2 - сервер NFS,
# а 192.168.1.10 будет IP-адресом компьютера, загружаемого по сети
...

Порядок сетевой загрузки

Сам процесс сетевой загрузки очень зависит от платформы. Важно указать параметры ip=dhcp и init=/linuxrc в командной строке ядра, так как это запускает сетевой интерфейс и указывает сценариям initrd монтировать установочный диск по сети. Ниже приведены примеры сетевой загрузки для некоторых платформ:

Листинг 4.8: Инструкции по сетевой загрузке

# Etherboot - вставьте загрузочный диск etherboot и перезагрузитесь
# Командная строка ядра указана при создании образа

# Sparc64 - нажмите Stop-A в загрузочном приглашении
ok boot net ip=dhcp init=/linuxrc

# PXE - установите pxelinux (входит в syslinux),
затем создайте pxelinux.cfg/default, содержащий строки:

DEFAULT gentoo
TIMEOUT 40
PROMPT 1

LABEL gentoo
    KERNEL kernel-X.Y.Z
    APPEND initrd=initrd-X.Y.Z root=/dev/ram0 init=/linuxrc ip=dhcp

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

Автоматизировать или нет?

Предназначение genkernel — дать (упрощенную) альтернативу подходу к компиляции ядра, проверенному временем. Как всегда, решать, автоматизировать ли процесс компиляции ядра, только вам!