Руководство по Gentoo Linux Genkernel
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-, а описание их действия приводится в квадратных скобках, [].
Флаги настройки
Флаги настройки, приведенные ниже, существуют, чтобы помочь вам до компиляции
определить, какие возможности ядра включить, а какие — выключить. Вы даже
можете выбрать, сохранять ли файл настроек, создаваемый в процессе работы.
Основные флаги настройки таковы:
-
--no-menuconfig: запустить [или не запускать] команду
make menuconfig (которая запускает интерактивную утилиту
настройки ядра, снабженную меню) перед компиляцией ядра.
-
--gconfig: запустить утилиту настройки ядра, основанную на
библиотеках GTK+. Ее достоинство в том, что многим пользователям проще и
понятнее настраивать ядро в оконной среде. А ее недостаток в том, что для
ее запуска вам потребуется сама система окон X, т.е. она не
заработает из командной строки.
-
--xconfig: запустить утилиту настройки ядра, основанную на
библиотеках QT. Ее достоинство в том, что многим пользователям проще и
понятнее настраивать ядро в оконной среде. А ее недостаток в том, что для
ее запуска вам потребуется сама система окон X, т.е. она не
заработает из командной строки.
-
--no-save-config: сохранять [или не сохранять]
настройки ядра на будущее в файл, находящийся в каталоге
/etc/kernels/.
Флаги компиляции
Действие следующих флагов обычно проявляется в самом процессе компиляции:
-
--kerneldir=/путь/к/исходникам/: указание
альтернативного расположения исходного кода ядра вместо расположения по
умолчанию в /usr/src/linux/.
-
--kernel-config=/путь/к/файлу-настроек: указание
на использование альтернативного файла настроек, вместо файла по умолчанию
/path/to/sources/.config.
-
--module-prefix=/путь/к/каталогу-модулей/: определение
пути к каталогу, в который устанавливаются модули ядра (по умолчанию
— /lib/modules/).
-
--no-clean: запустить [или не запускать] команду
make clean перед компиляцией ядра. Команда make clean удаляет
все объектные файлы и зависимости из дерева исходного кода ядра.
-
--no-mrproper: запустить [или не запускать] команду
make mrproper перед компиляцией ядра. Как и команда make
clean, команда make mrproper удаляет все объектные файлы и
зависимости из дерева исходного кода ядра. Кроме того, из дерева исходного
кода ядра также убираются любые предыдущие файлы настроек (в
/путь/к/исходникам/.config или
/путь/к/исходникам/.config.old).
-
--oldconfig: запустить команду make oldconfig, которая
попытается собрать информацию о настройках системной архитектуры из
универсального сценария /usr/share/genkernel/. Этот процесс не
интерактивен. Участие пользователя не предусмотрено. К тому же, если флаг
--oldconfig используется совместно с --clean, последний
обращается, т.е. включается флаг --no-clean.
-
--callback="echo hello": вызвать указанные аргументы (здесь:
echo hello) после компиляции ядра и необходимых модулей, но до
сборки образа начального корневого диска (initrd). Это может быть полезно,
если вы хотите установить (emerge) внешние модули в образ initrd с помощью
параметра callback, а затем переопределить группу модулей genkernel.
-
--no-install: запускать [или не запускать] команду
make install, которая устанавливает новое ядро, файл настроек, образ
initrd и карту системы в смонтированый загрузочный раздел. Также
устанавливаются любые скомпилированные модули.
-
--no-initrdmodules: воздержаться от копирования каких-либо
модулей в создаваемый genkernel образ initrd. Этот флаг — исключение
из правила, касающегося приставки no-; отсутствие приставки приводит
к созданию недопустимого флага genkernel.
-
--genzimage: создавать образ initrd до создания образа ядра.
(Этот хак предназначен исключительно для систем PPC Pegasos.)
Флаги компилятора
Следующие флаги поддерживаются genkernel и передаются соответствующим
приложениям по мере сборки ядра. Эти флаги влияют компилятор,
используемый для трансляции ядра, в том числе на низком уровне.
-
--kernel-cc=некийКомпилятор: указание компилятора,
применяемого при сборке ядра.
-
--kernel-ld=некийКомпоновщик: указание компоновщика,
применяемого при сборке ядра.
-
--kernel-as=некийАссемблер: указание ассемблера,
применяемого при сборке ядра.
-
--kernel-make=некийСборщик: указание альтернативы утилите
GNU make, используемой при сборке ядра.
-
--utils-cc=некийКомпилятор: указание компилятора,
применяемого при сборке утилит поддержки.
-
--utils-ld=некийКомпоновщик: указание компоновщика,
применяемого при сборке утилит поддержки.
-
--utils-as=некийАссемблер: указание ассемблера,
применяемого при сборке утилит поддержки.
-
--utils-make=некийСборщик: указание альтернативы утилите
GNU make, используемой при сборке утилит поддержки.
-
--makeopts=-jX: определение количества одновременных потоков,
которые утилита make может порождать в процессе компиляции ядра (и утилит).
Переменная 'X' — это число, получаемое добавлением 1 к
количеству процессоров, доступных системе. Так, для системы с одним
процессором подходит значение -j2; для системы с двумя процессорами
— -j3 и т.д. (На однопроцессорной системе с поддержкой
технологии Hyper-Threading можно использовать флаг -j3, если
поддержка симметричной многопроцессорной обработки (SMP) включена в
ядре.)
Отладочные флаги
В процессе компиляции ядра, флаги отладки регулируют способ и количество сообщаемой
пользователю информации.
-
--debuglevel=verblevel: установка уровня подробности
информации, выводимой genkernel. Переменная verblevel —
целое от 0 до 5. '0' соответствует минимальному выводу, а '5' включает
выдачу максимально подробной информации о действиях genkernel во время
компиляции ядра.
-
--debugfile=/путь/к/файлу-вывода: направление
всей порождаемой genkernel отладочной информации в указанный файл,
при этом уровень, установленный в --debuglevel, игнорируется. По
умолчанию файл расположен в /var/log/genkernel.log.
-
--no-color: включение [или отключение] цветовой раскраски
отладочной информации genkernel c использованием управляющих escape-кодов.
Флаги инициализации
Эти влаги вызывают определенные эффекты при запуске системы. Некоторые
влияют только на внешний вид, а другие могут понадобиться для включения
определенных функций системы.
-
--no-bootsplash: включение [или отключение] поддержки
загрузочной заставки
bootsplash в образе initrd, подготовленном genkernel. Загрузочная
заставка поддерживается не на всех архитектурах, а ее поддержка должна быть
включена в ядро.
-
--no-gensplash: включение [или отключение] поддержки
загрузочной заставки
gensplash в образе initrd, подготовленном genkernel. Заставка
gensplash разработана для ядер 2.6 и предназначена для замены bootsplash.
Для изменения темы по умолчанию, используемой gensplash, используйте
--gensplash=ПредпочитаемаяТема (где ПредпочитаемаяТема
— имя одного из подкаталогов в каталоге /etc/splash/.
-
--gensplash-res=ПредпочитаемоеРазрешение: данный флаг позволяет
выбрать варианты разрешения заставки, поддерживаемые в initrd при загрузке
системы. Это полезно по двум причинам: во-первых, вы можете выбрать только
те варианты разрешения заставки, которые подходят для вашей системы.
Во-вторых, избежите ненужного увеличения места, занимаемого образом initrd
на жестком диске (т.к. не понадобится включать разрешения, не
соответствующие параметрам вашей системы). С другой стороны, этот флаг
лучше не включать, если ядро компилируются для установочного диска; это
позволит gensplash поддерживать все возможные варианты разрешения.
-
--do-keymap-auto: принудительный выбор раскладки клавиатуры во время
загрузки системы.
-
--lvm2: включение поддержки устройств хранения с использованием диспетчера логических томов
(LVM2) из статических бинарников в случае их доступности. При
отсутствии соответствующие (статические) LVM2 бинарники компилируются.
Перед использованием этого флага, пакет lvm2 нужно установить в вашу
систему командой emerge lvm2. Обязательно прочтите руководство по
установке LVM2 на Gentoo (англ.).
-
--evms2: включение поддержки устройств хранения с использованием
системы управления томами
предприятия (EVMS2) при ее доступности. Перед использованием этого
флага, установите пакет в свою систему командой USE=static emerge
evms2. (При пропуске во время установки пакета флага
USE=static, не будут включены необходимые статические
бинарники.
-
--dmraid: включение поддержки DMRAID
— утилиты, создающей проекции RAID с использованием подсистемы
отображения устройств, встроенную в ядро. DMRAID находит, включает,
отключает и отображает свойства програмных RAID-массивов (например,
ATARAID), и содержащихся разделов DOS.
-
--linuxrc=/путь/к/вашему/linuxrc: указание созданного пользователем
сценария linuxrc, который запускается на этапе запуска ядра, до
собственно процесса загрузки. (Сценарий linuxrc по умолчанию должен
находиться в каталоге /usr/share/genkernel/.) Он позволяет
загрузить маленькое модульное ядро и подгрузить необходимые драйверы,
нужные системе, как модули.
-
--cachedir=/путь/к/альтернативному/каталогу/: изменение каталога для
размещения кэша при компиляции ядра.
-
--tempdir=/путь/к/новому/временному каталогу/: указание расположения
временного каталога, используемого genkernel во время компиляции ядра.
-
--unionfs: включение поддержки объединяющей
файловой системы (unification file system) в образ initrd.
Прочие флаги
Флаги, перечисленные ниже, поддерживаются genkernel, но не относятся к другим
категориям:
-
--mountboot: определение необходимости монтирования каталога
/boot/ на отдельном разделе. По необходимости инструкции по
монтированию файловой системы загрузочного раздела будут браться из
сценария /etc/fstab.
-
--kernname=Псевдоним: позволяет изменить названия образов
ядра и initrd в каталоге /boot/. Будут создаваться образы
kernel-Псевдоним-версия и initramfs-Псевдоним-версия.
Возможные действия
Действия указывают genkernel, что компилировать. На данный момент
поддерживаются следующие действия:
-
initrd: сборка только образа initrd
-
bzImage: сборка только образа ядра
-
kernel: сборка только образа ядра и модулей
-
all: сборка всех стадий: образа initrd, образа ядра и модулей
Последнее действие, all, рекомендуется большинству пользователей, так
как обеспечивает сборку всех стадий, необходимых для работоспособности ядра.
Помните, что действие просто сообщает genkernel, что
собирать, а не что устанавливать.
Настройка загрузчика
Чтобы настроить genkernel на работу с вашим загрузчиком, необходимо сделать
три-четыре изменения в файле настроек загрузчика:
-
Включите root=/dev/ram0 и init=/linuxrc в параметры ядра,
передаваемые образу ядра.
-
Добавьте real_root=/dev/hda3 (например) к параметрам ядра,
передаваемым образу ядра, если ваш корневой раздел —
/dev/hda3.
-
Если вы пользуетесь загрузочной заставкой bootsplash, добавьте подходящую
строчку режимов, например, vga=0x317, к параметрам, передаваемым
ядру. Также добавьте splash=verbose или splash=silent,
в зависимости от необходимого уровня подробности сообщений загрузчика.
-
Добавьте нужную загрузчику информацию о начальном корневом диске (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
|
К счастью, существует файл настроек, при необходимости можно выставить как надо
большинство основных параметров. Ниже приведено краткое описание самых
значимых:
-
MENUCONFIG=[yes|no]: этот параметр эквивалентен флагу
--menuconfig, используемому genkernel, который, в свою очередь,
пользуется командой make menuconfig для вызова утилиты настройки
ядра, использующей командную строку. Для автоматического запуска утилиты
во время настройки ядра этим сценарием, установите в 'yes'. В противном
случае установите в 'no'.
-
CLEAN=[yes|no]: установка этого параметра в 'yes'
соответствует флагу --clean genkernel, и приводит к запуску команды
make clean для удаления всех объектных файлов и зависимостей из
дерева исходного кода ядра. Его установка в 'no' вызывает каскадный эффект,
эквивалентный флагу genkernel --no-clean, отключающему команду
make clean и неявно включающему флаг --no-mrproper,
аннулирующий команду make mrproper.
-
MRPROPER=[yes|no]: установка в 'yes' эквивалентна передаче
genkernel флага --mrproper, вызывающего команду make
mrproper, которая очищает дерево исходного кода ядра от любых файлов
настроек. Установка в 'no' эквивалентна флагу --no-mrproper,
который оключает команду make mrproper.
-
MOUNTBOOT=[yes|no]: установка этого параметра в 'yes'
эквивалентна флагу --mountboot, приводя при необходимости
автоматическое монтирование каталога /boot/ во время
компиляции. Параметр рекомендуется включать, если каталог
/boot/ находится на отдельном разделе. Тогда позднее придется
помнить на один существенный шаг меньше.
-
SAVE_CONFIG=[yes|no]: после настройки ядра, выбранные
параметры сохраняются в файл .config, находящийся в дереве
исходного кода ядра. Этот сценарий заменяется или даже удаляется при
последующей компиляции ядра. Установка в 'yes' эквивалентна флагу
--save-config, вызывая сохранение всех параметров, выбранных при
настройке ядра, в сценарии в каталоге /etc/kernels/. Выбор 'no'
сохраняет существующее положение.
-
USECOLOR=[yes|no]: установка параметра в 'yes' эквивалентна
флагу --color, раскрашивающему сообщения genkernel для облегчения
отладки (при необходимости).
-
DEBUGLEVEL=[0|1|2|3|4|5]: этот параметр отвечает за
подробность сообщений genkernel. Его установка на '0', как и
--debuglevel=0, подавляет все сообщения, выводимые genkernel. А
установка в '5', как и --debuglevel=5, обеспечивает пользователя
полным объемом информации, выводимой genkernel.
Установив нужные значения в /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
|
Во-вторых, советуем включить параметры 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
|
Кроме того, следует включить SquashFS, поскольку она требуется для большинства
современных установочных дисков Gentoo. Поддержка SquashFS не включена в
основное дерово исходного кода ядра. Для ее включения требуется наложить
необходимые заплатки на дерево или установить gentoo-sources.
Листинг 4.3: Настройка поддержки SquashFS в ядре |
File systems--->
Miscellaneous filesystems --->
[*] SquashFS 2.X - Squashed file system support
|
После завершения компиляции создайте архив (tar.gz), содежащий модули ядра.
Этот шаг необходим только тогда, когда версия вашего ядра не совпадает с
версией образа ядра на установочном диске.
Листинг 4.4: Создание архива с модулями ядра |
# cd /
# tar -cf /tmp/modules-X.Y.Z.tar.gz /lib/modules/X.Y.Z/
|
В зависимости от механизма загрузки в вашей сети, вам потребуется
проделать некоторые из этих шагов:
Листинг 4.5: Создание загрузочного образа |
# emerge mknbi
# cd /boot
# mkelf-linux -params="root=/dev/ram0 init=/linuxrc ip=dhcp" kernel... initrd... > etherboot.img
# emerge sparc-utils
# cd /boot
# elftoaout kernel... -o kernel.aout
# piggyback64 kernel.aout System.map-... initrd-...
# mv kernel.aout openboot.img
|
И наконец, скопируйте ядро на свой 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 |
# mount /tmp/gentoo-livecd.iso /mnt/cdrom -o loop
# cp -p /mnt/cdrom /nfs/livecd
# umount /mnt/cdrom
# 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";
}
...
|
Порядок сетевой загрузки
Сам процесс сетевой загрузки очень зависит от платформы. Важно указать
параметры ip=dhcp и init=/linuxrc в командной строке ядра,
так как это запускает сетевой интерфейс и указывает сценариям initrd
монтировать установочный диск по сети. Ниже приведены примеры сетевой
загрузки для некоторых платформ:
Листинг 4.8: Инструкции по сетевой загрузке |
ok boot net ip=dhcp init=/linuxrc
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 — дать (упрощенную) альтернативу подходу
к компиляции ядра, проверенному временем. Как всегда, решать, автоматизировать
ли процесс компиляции ядра, только вам!
Текст этого документа распространяется на условиях лицензии
Creative Commons
- Attribution / Share Alike.
|
|