Genkernel — это инструмент, позволяющий автоматизировать компиляцию ядра для пользователей, не посвященных в этот процесс. Он помогает создать образ ядра, подобный имеющимся на установочных дисках Gentoo, которые в свою очередь разработаны для автоматического определения аппаратной конфигурации вашей системы. Помимо этого, некоторых пользователей заинтересует использование genkernel для устройств, требующих инициализации и рабочего ядра до запуска системы. Так как genkernel автоматически компилирует модули вашего ядра, вы можете использовать такие устройства, которым для правильной работы могут требоваться определенные параметры модуля.
Genkernel очень полезный инструмент, если вы не уверенны в том, как компилировать ядро или просто не осведомлены об имеющихся на вашей системе устройствах. Он разработан для упрощения процесса компиляции ядра и по умолчанию поддерживает большинство устройств.
Однако, если вам известно, какие драйверы необходимы системе, вы можете сократить время последующей компиляции ядра. Это возможно посредством указания genkernel компилировать только драйверы, относящиеся к вашим устройствам. Часто нужно меньше драйверов, чем предусмотрено в настройке по умолчанию (что приводит к сокращению времени компиляции ядра).
Для получения genkernel запустите emerge genkernel в командной строке. Если вы используете Gentoo Reference Platform (GRP), не забудьте установить двоичные пакеты, указав флаг -k команде emerge. Так как GRP комплектуется старой версией genkernel, флаги могу различаться. В любом случае, обратитесь к genkernel --help, чтобы узнать, как использовать версию 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 на работу с вашим загрузчиком, необходимо сделать три-четыре изменения в файле настроек загрузчика:
Передавать 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), содержащего установочный диск, используйте устройство 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 |
Образы сетевой загрузки запрашивают 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 |
Предназначение genkernel — дать (упрощенную) альтернативу подходу к компиляции ядра, проверенному временем. Как всегда, решать, автоматизировать ли процесс компиляции ядра, только вам!
Текст этого документа распространяется на условиях лицензии Creative Commons - Attribution / Share Alike.