genkernel

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Genkernel and the translation is 100% complete.

Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎português do Brasil • ‎русский • ‎中文(中国大陆)‎

genkernel — это утилита созданная Gentoo, которая используется для автоматизации процесса сборки ядра и initramfs. Некоторые основные функции:

  • конфигурация исходного кода ядра
  • сборка сжатого ядра bzImage и его копирование в /boot
  • создание initramfs и копирование его в /boot
  • создание символьных ссылок в /boot
  • добавление настроенного вручную содержимого в initramfs. Например файлов связанных с шифрованием, splash images, дополнительных модулей и так далее.
  • сжатие initramfs
  • конфигурация загрузчика для загрузки нового ядра и initramfs.
Заметка
Типичное недоразумение — считать, что genkernel 'автоматически' создает индивидуальную конфигурацию ядра. genkernel автоматизирует процесс сборки ядра и собирает initramfs, но не создает индивидуальный конфигурационный файл ядра. Он использует универсальный файл конфигурации ядра, который включает в себя поддержку для типичных компонентов системы на архитектурно-зависимой основе. С подробностями установок по умолчанию для каждой архитектуры можно ознакомиться в upstream repository. Выберите архитектуру, затем выберите файл конфигурации ядра.

Contents

Установка

USE-флаги

USE flags for sys-kernel/genkernel Gentoo automatic kernel building scripts

cryptsetup Enable support for Luks disk encryption using sys-fs/cryptsetup local
firmware Prefer system firmware sys-kernel/linux-firmware over local copy. local
ibm Add support for IBM ppc64 specific systems global
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur global

Emerge

Запустите установку genkernel.

root #emerge --ask sys-kernel/genkernel

Использование

Основная форма вызова команды genkernel выглядит следующим образом:

root #genkernel [options ...] action

Параметры

Поведение genkernel зависит от большого количества параметров, большинство из которых могут быть настроены в файле /etc/genkernel.conf или передаваться в каждом вызове через команду genkernel. Параметры, переданные с помощью командной строки, имеют больший приоритет, чем те, которые определены в файле /etc/genkernel.conf. Этот файл очень хорошо задокументирован, но все же некоторые из наиболее используемых параметров будут описаны в этой статье. Цель статьи ознакомить читателя с основными вызовами genkernel. Более подробные объяснения имеются в комментариях файла /etc/genkernel.conf или в содержимом man genkernel.

Заметка
Некоторые из параметров имеют вариации, которые приводят к противоположному поведению. Они представлены как --[no-]option_name, а обратный эффект показан в квадратных скобках, как в следующем примере:
Код Включить или отключить определенный параметр
--[no-]menuconfig : Activates [deactivates] ...

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

Параметры, воздействующие на взаимодействие с пользователем

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

--config=/path/to/genkernel.conf
Место откуда Genkernel будет брать конфигурационный файл (по умолчанию /etc/genkernel.conf).
--[no-]menuconfig
Запускать (или не запускать) команду make menuconfig (которая запускает интерактивное меню для конфигурации) перед компиляцией ядра.
--gconfig
Предоставляет утилиту настройки ядра, основанную на библиотеках GTK+. Преимущество этого варианта в том, что большинству пользователей легче и понятнее настраивать ядро с помощью этого инструмента, поскольку он опирается на X-windows system. Недостатком этого варианта является то, что X-windows system должна быть установлена, чтобы использовать её, поэтому это не будет работать в командной строке.
--xconfig
Предоставляет утилиту настройки ядра, основанную на библиотеках QT. Преимущество этого варианта в том, что большинству пользователей легче и понятнее настраивать ядро с помощью этого инструмента, поскольку он опирается на X-windows system. Недостатком этого варианта является то, что X-windows system должна быть установлена, чтобы использовать её, поэтому это не будет работать в командной строке.
--[no-]save-config
Сохранить [или не сохранять] файл конфигурации ядра в каталог /etc/kernels для последующего использования.
--kernname=NickName
Производить модификацию имени файла ядра и образа initrd в каталоге /boot так, что будут создаваться kernel-NickName-version и initramfs-NickName-version.

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

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

--[no-]splash
Включает (или отключает) поддержку Fbsplash фреймбуфера в собранном genkernel образе initrd. Чтобы изменить тему по умолчанию с помощью fbsplash, используйте --splash=PreferredTheme (где PreferredTheme это название одной из директорий внутри /etc/splash).
--splash-res=PreferredResolution
Эта опция позволяет выбрать какие разрешения заставки будут поддерживаться в initrd во время запуска системы. Это полезно по двум причинам. Во-первых, можно выбрать только те варианты разрешения заставки(ок), которые подходят для системы. Во-вторых, initrd не будет занимать много дискового пространства (так как initrd не должен будет поддерживать разрешения, которые не нужны для данной конфигурации системы). Тем не менее, эту опцию лучше не использовать, если ядро компилируются для установочного CD, что позволит splash поддерживать все возможные варианты разрешений.
--do-keymap-auto
Принудительный выбор раскладки клавиатуры во время загрузки.
--lvm
Включает поддержку устройств хранения использующие Logical Volume Management (LVM2) с помощью статических бинарников, если они доступны в системе. Соответствующие (статические) LVM2 бинарники скомпилируются, если они недоступны. Обязательно установите в систему пакет sys-fs/lvm2 используя (emerge sys-fs/lvm2) перед включением этой опции, а также проверьте статью LVM на Gentoo wiki.
--dmraid
Включает поддержку DMRAID; утилита, которая создает RAID с помощью подсистемы ядра отображения устройств. DMRAID обнаруживает, включает, отключает и отображает настройки программного RAID (например, ATARAID) и содержащихся в них DOS разделов.
--luks
Включает поддержку Linux Unified Key Setup или LUKS. Эта опция позволит использовать устройства, которые содержат корневую файловую систему и зашифрованны с помощью LUKS. В загрузчике для зашифрованного устройства задайте значение crypt_rootroot для не зашифрованных с помощью LUKS устройств).
--disklabel
Добавляет поддержку disk label и UUID в initrd.
--iscsi
Добавляет поддержку iSCSI в initrd.
--multipath
Добавляет поддержку Multipath в initrd.
--linuxrc=/path/to/the/linuxrc_file
Задает расположение созданного пользователем скрипта linuxrc, который инициализируется во время запуска ядра до начала процесса загрузки. Скрипт linuxrc по умолчанию можно найти в каталоге /usr/share/genkernel/. Этот скрипт позволяет пользователю загрузить маленькое модульное ядро; которое попытается загрузить минимальное количество драйверов, которые необходимы (как модули) системы.
--cachedir=/path/to/alt/dir
Изменяет расположение каталога кэша, который будет использоваться во время компиляции ядра.
--tempdir=/path/to/new/tempdir
Изменяет расположение каталога временных файлов, который будет использаться genkernel во время компиляции ядра.
--unionfs
Добавление поддержки Unification File System в образ initrd.
--mountboot
Определяет нужно ли или нет монтировать каталог /boot на отдельный раздел. С этой опцией произойдет проверка скрипта /etc/fstab, чтобы узнать как подключить boot раздел в файловой системе (если это необходимо).

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

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

--kernel-cc=someCompiler
Определяет компилятор, который будет использован при сборке ядра.
--kernel-ld=someLinker
Определяет компоновщик, который будет использован при сборке ядра.
--kernel-as=someAssembler
Определяет ассемблер, который будет использован при сборке ядра.
--kernel-make=someMake
Определяет make утилиту (альтернативу GNU make), которая будет использована при сборке ядра.
--utils-cc=someCompiler
Определяет компилятор, который будет использован при сборке утилит поддержки.
--utils-ld=someLinker
Определяет компоновщик, который будет использован при сборке утилит поддержки.
--utils-as=someAssembler
Определяет ассемблер, который будет использован при сборке утилит поддержки.
--utils-make=someMake
Определяет make утилиту (альтернативу GNU make), которая будет использована при сборке утилит поддержки.
--makeopts=-jX
Определяет количество одновременных потоков, которые утилита make может запустить во время компиляции ядра (и утилит). Переменная X это любое число, хотя наиболее распространенные значения получаются путем добавления одного (1) к числу ядер, доступных системе, или же просто использовать количество ядер доступных системе. Так, для системы с одним ядром лучше подойдет вариант значения -j2 или -j1; для систем с двумя ядрами, скорее всего подойдет значение -j3 или -j2 и так далее. (Для систем с одним процессором, которые поддерживают технологию Hyper-Threading ™ (HT) можно предположить, что системе доступны 2 ядра, при условии, что поддержка Symmetric Multiprocessing (SMP) включена в ядре.)

Параметры, воздействующие на процесс компиляции

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

--kerneldir=/path/to/sources/
Определяет альтернативное расположение исходных кодов ядра, а не стандартное /usr/src/linux/.
--kernel-config=/path/to/config-file
Определяет, какие альтернативные конфигурации будут использованы, а не стандартная /path/to/sources/.config.
--module-prefix=/path/to/prefix-directory/
Определяет префикс для директории, в которую будут устанавливаться модули (по умолчанию /lib/modules.)
--[no-]clean
Активирует (или деактивирует) команду make clean перед сборкой ядра. make clean удаляет все объектные файлы и зависимости из дерева исходных кодов.
--[no-]mrproper
Активирует (или деактивирует) команду make mrproper перед сборкой ядра. Как и у команды make clean, при выполнении make mrproper удаляются все объектные файлы и зависимости из дерева исходных кодов. Однако, любые предыдущие конфигурационные файлы (в /path/to/sources/.config или /path/to/sources/.config.old) будут также вычищены из дерева. Если не желательно удалять, чтобы конфиг ядра .config удалялся, то обязательно отключите эту опцию!
--oldconfig
Проблема команды make oldconfig, которая пытается собирать конфигурационную информацию для системной архитектуры из скрипта в /usr/share/genkernel. Это не интерактивный процесс; нет пользовательского ввода. Так же, если --oldconfig используется вместе с --clean, последняя опция отпадает, что приводит к активации опции --no-clean.
--callback="echo hello"
Вызывает указанные аргументы (echo hello, в данном случае) после сборки ядра и соответствующих модулей, но перед собирает образ initrd. Это может быть полезно при установке внешних модулей в образ initrd через затягивание соответствующих элементов с обратным вызовом, и затем переопределение группы модулей genkernel.
--[no-]install
Активирует (или деактивирует) команду make install, которая устанавливает образ нового ядра, файл конфигурации, образ initrd и системную карту на загрузочный раздел. Любые собираемые модули будут установлены. По умолчанию genkernel пытается смонтировать /boot, если он является отдельным разделом, перед выполнением команды установки.
--no-ramdisk-modules
Воздерживается от копирования каких-либо модулей в созданный genkernel образ initrd. Эта вариант является исключением из правила о no- префиксе; отсутствие приставки создает недопустимый параметр для genkernel.
--all-ramdisk-modules
Копирует все доступные модули в созданный genkernel образ initrd.
--genzimage
Создает образ initrd, предшествующий образу ядра (этот прием сейчас применим только к системам PPC Pegasos).

Параметры отладки

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

--loglevel=<0|1|2|3|4|5>
Регулирует количество информации отображаемой genkernel. Переменная <verblevel> это целое число от 0 до 5. Уровень '0' отображает минимальный уровень информации, а '5' отображает как можно больше информации о работе genkernel во время процесса компиляции.
--logfile=/path/to/output_file
Игнорирует любое значение опции --loglevel (о которой написано выше) и отправляет всю отладочную информацию от genkernel в специальный файл. По умолчанию вывод направляется в файл /var/log/genkernel.log.
--[no-]color
Включает (или отключает) цветной вывод отладочной информации (сообщений от genkernel) с помощью управляющих последовательностей терминала.
--[no-]debug-cleanup
Включает (или отключает) полную очистку отладочной информации после выполнения.

Действия

Действие, переданное командной строке командой genkernel [options ...] action, сообщает genkernel действие для выполнения. Поддерживаются следующие действия:

Действие Описание
all Сборка всех частей — initrd, образ ядра и модулей.
bzImage Сборка только образа ядра.
kernel Сборка только образа ядра и модулей.
initramfs Сборка только образа initramfs/ramdisk.
ramdisk Сборка только образа initramfs/ramdisk.

Конфигурация

Начав

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

root #genkernel --splash --no-install --no-clean --menuconfig all

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

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

Заметка
Не забывайте, что файл /etc/genkernel.conf используется командой genkernel при запуске в качестве источника команд, и что любой параметр, определенный здесь, будет применен, исключая те случаи, когда параметры командной строки имеют над ним больший приоритет.

Выбор ядра

Первое, что надо сделать, это разрешить запуск make menuconfig в файле /etc/genkernel.conf:

Файл /etc/genkernel.confПринудительное использование меню конфигурации в /etc/genkernel.conf
# Запустить 'make menuconfig' перед компиляцией ядра?
MENUCONFIG="yes"

Управление файлами

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

Файлы исходного кода

После запуска emerge -u gentoo-sources, если доступна новая версия исходного кода, то для их хранения в /usr/src/ создается новый каталог. Обычно, на активный каталог с исходным кодом ядра указывает символьная ссылка /usr/src/linux.

Каталог /usr/src может выглядеть так:

user $ls -l /usr/src
total 16
lrwxrwxrwx  1 root root   19 21 Mar   2013 linux -> linux-3.7.10-gentoo
drwxr-xr-x 24 root root 4096 25 Aug  10:39 linux-3.10.7-gentoo
drwxr-xr-x 20 root root 4096 21 Apr  19:42 linux-3.7.10-gentoo
drwxr-xr-x 21 root root 4096 14 Mar   2013 linux-3.7.9-gentoo

Символьная ссылка /usr/src/linux может быть изменена разными способами.

  • Если установлен USE-флаг symlink, то символьная ссылка /usr/src/linux автоматически обновляется и будет указывать на только что установленный исходный код.
  • Если symlink USE-флаг не установлен, пользователь может изменить назначение для символьной ссылки используя команду eselect kernel list, а затем eselect kernel set.

genkernel всегда (исключительно) использует исходный код, на которые указывает символьная ссылка /usr/src/linux.

Файл конфигурации ядра

Если компиляция ядра уже запущена с активным исходным кодом ядра, в каталоге /etc/kernels может находиться файл, который содержит конфигурацию ядра, которая применялась при создании последнего файла ядра bzimage. Этот файл может называться, например, kernel-config-x86_64-3.7.9-gentoo-r1, где x86_64 может быть заменено на архитектуру системы, 3.7.9 может быть заменено на версию используемого исходного кода, а r1 на выпуск (release) исходного кода.

Это тот самый файл kernel-config-x86_64-3.7.9-gentoo-r1, который используется в качестве начальной конфигурации при запуске genkernel --menuconfig all.

Если genkernel первый раз вызывается с данным исходным кодом ядра, или если предыдущий результат не был сохранен, этот файл заменяется на файл конфигурации по умолчанию, который находится в usr/share/genkernel/arch/x86_64/kernel-config, где x86_64 заменяется на действительную архитектуру.

Заметка
Путь к этому файлу конфигурации по умолчанию может быть изменен установкой переменной DEFAULT_KERNEL_CONFIG в файле /etc/genkernel.conf.
Сохранение конфигурации компилирования

Если активирован параметр genkernel --save-config, как из командной строки, так и из /etc/genkernel.con, конфигурация скомпилированного ядра сохраняется (под именем данным выше) в каталог /etc/kernels. В то же время, конфигурация сохраняется в файл .config в каталоге /usr/src/linux, но этот файл не используется заново при следующем запуске команды genkernel all.

Предупреждение
Необходимо знать, что каждый раз при запуске genkernel с установленным параметром --save-config, файл конфигурации в /etc/kernels перезаписывается. Таким образом, рекомендуется скопировать этот файл под новым именем перед запуском genkernel, для того чтобы его сохранить.
Установка ядра и initramfs в каталог /boot

Использование опции --install при вызове genkernel, просит genkernel установить образ ядра и initramfs в каталог /boot. Для того, чтобы сделать это удобным образом, установите следующие параметры в файле /etc/genkernel.conf:

Файл /etc/genkernel.confУстановка автосохранения ядра и initramfs
# Примонтировать каталог BOOTDIR автоматически, если не примонтирован?
MOUNTBOOT="yes"
  
# Сохранить новую конфигурацию в /etc/kernels при успешной компиляции
SAVE_CONFIG="yes"
  
# Сделать символьные ссылки в BOOTDIR автоматически?
SYMLINK="yes"
  
# Добавить новое ядро в grub2?
#BOOTLOADER="grub2"
  • Первый параметр говорит сам за себя.
  • Второй параметр сообщает genkernel, чтобы конфигурация скомпилированного ядра была сохранена в /etc/kernels.
  • Последние два параметра сообщают genkernel, чтобы она автоматически обновила конфигурацию загрузчика grub. На практике, происходит следующее:
    • Если уже существует предыдущий образ ядра с таким же именем, он переименовывается путем добавления .old к его имени. Автоматически создается символьная ссылка kernel.old, которая указывает на него.
    • Новое ядро занимает место ядра с тем же самым именем в каталоге /boot. Если ядро скомпилировано в первый раз, автоматически создается символьная ссылка, которая указывает на новое ядро.

После запуска genrkernel --menuconfig all, каталог /boot может выглядеть следующим образом:

user $ls -al /boot
total 41336
drwxr-xr-x  3 root root    4096 20 avril 17:23 .
drwxr-xr-x 24 root root    4096 15 sept. 12:31 ..
lrwxrwxrwx  1 root root       1 24 févr.  2013 boot -> .
drwxr-xr-x  2 root root    4096 24 févr.  2013 grub
lrwxrwxrwx  1 root root      40 20 avril 17:23 initramfs -> initramfs-genkernel-x86_64-3.7.10-gentoo
-rw-r--r--  1 root root 1314412 20 avril 17:23 initramfs-genkernel-x86_64-3.7.10-gentoo
-rw-r--r--  1 root root 1313548 21 mars   2013 initramfs-genkernel-x86_64-3.7.10-gentoo.old
-rw-r--r--  1 root root 1295344 25 févr.  2013 initramfs-genkernel-x86_64-3.7.9-gentoo
-rw-r--r--  1 root root 3310324 25 févr.  2013 initramfs-genkernel-x86_64-3.7.9-gentoo.old
lrwxrwxrwx  1 root root      44 20 avril 17:23 initramfs.old -> initramfs-genkernel-x86_64-3.7.10-gentoo.old
lrwxrwxrwx  1 root root      37 20 avril 17:23 kernel -> kernel-genkernel-x86_64-3.7.10-gentoo
-rw-r--r--  1 root root 4866656 20 avril 17:23 kernel-genkernel-x86_64-3.7.10-gentoo
-rw-r--r--  1 root root 4866560 21 mars   2013 kernel-genkernel-x86_64-3.7.10-gentoo.old
-rw-r--r--  1 root root 4552288 25 févr.  2013 kernel-genkernel-x86_64-3.7.9-gentoo
-rw-r--r--  1 root root 3400736 25 févr.  2013 kernel-genkernel-x86_64-3.7.9-gentoo.old
lrwxrwxrwx  1 root root      41 20 avril 17:23 kernel.old -> kernel-genkernel-x86_64-3.7.10-gentoo.old

Конфигурация загрузчика

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

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

  • Добавьте root=/dev/sdaN к параметрам ядра, передаваемым образу ядра, где /dev/sdaN указывает на root раздел (N - это номер раздела, если раздел сущестует).
  • Если используется splash screen, добавьте подходящую строку режима (mode line), такую как vga=0x317 в список параметров, передаваемых ядру и также добавьте splash=verbose или splash=silent, в зависимости от уровня вывода сообщений, требуемого в процессе загрузки.
  • Добавьте информацию initrd, как это требуется загрузчиком. Обратитесь к главе конфигурация загрузчика Gentoo Handbook, чтобы узнать как настроить поддержку initrd в загрузчике.

Ниже приведено то, как может выглядеть файл grub.conf.

Файл /boot/grub/grub.confПример файла grub.conf
# Это пример файла grub.conf для использования с Genrkernel, из Gentoo handbook
# http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=1&chap=10#doc_chap2  
# Если вы не пользуетесь Genkernel и вам нужна помощь при создании этого файла, вы должны проконсультироваться с настольной книгой. Иначе, обратитесь к файлу grub.conf.sample, который включен в документацию Grub.
  
default 0 
timeout 5
splashimage=(hd1,0)/boot/grub/splash.xpm.gz 
   
title Gentoo Linux 
root (hd0,6) 
kernel /boot/kernel initrd=/dev/ram0 real_root=/dev/sda7 rootfstype=ext4  
initrd /boot/initramfs
  
title Gentoo Linux old kernel 
root (hd0,6) 
kernel /boot/kernel.old initrd=/dev/ram0 root=/dev/sda7 rootfstype=ext4 
initrd /boot/initramfs.old

Сохранение рабочих файлов

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

  • Первым файлом, который надо сохранить, является файл конфигурации ядра в /etc/kernels. Если версия исходного кода не изменилась перед перекомпиляцией ядра, будет использовано имя файла, использованное ранее. Поэтому, копирование файла конфигурации под другим именем помогает сохранить информацию при сохранении файла доступным в качестве начальной точки для новой конфигурации.
  • Второй важной вещью необходимо сохранить уже загружаемые образы ядра и initramfs. Способ, которым это можно выполнить, зависит от контекста:
  1. Если ранее скомпилированное ядро загружается, запуск genkernel переименует образ этого ядра (и, также, initramfs) в kernel-genkernel-ARCH-X.Y.Z-gentoo-rx.old и создаст новый kernel-genkernel-ARCH-X.Y.Z-gentoo-rx. Это значит, что даже если новое ядро не загружается, пользователи всегда смогут загрузить предыдущее.
  2. Если последнее скомпилированное ядро не загружается и исходные тексты не изменялись с того момента как пользователь скомпилировал загружаемое ядро, до запуска genkernel, сперва удалите образ нового ядра и уберите суффикс .old из последнего загружаемого ядра. Без этого, если заново скомпилированное ядро не загружается во второй раз, загружаемое ядро kernel-genkernel-ARCH-X.Y.Z-gentoo-rx.old будет удалено переименованием незагружаемого kernel-genkernel-ARCH-X.Y.Z-gentoo-rx, приводя пользователя к незагружаемой системе. Используйте те же самые рассуждения для initramfs.

Использование предыдущей конфигурации ядра при изменении исходного кода ядра

Предыдущая конфигурация может использоваться через параметр MENUCONFIG в /etc/genkernel.conf следующим образом:

Файл /etc/genkernel.confНастройка make menuconfig
# Запустить 'make menuconfig' перед компиляцией этого ядра?
MENUCONFIG="yes"
Заметка
Нет необходимости запускать make oldconfig когда исользуется genkernel, даже если исходный код изменился с kernel-genkernel-ARCH-version-gentoo-rx на kernel-genkernel-ARCH-version-gentoo-r(x+1) или с kernel-genkernel-ARCH-version-gentoo на kernel-genkernel-ARCH-(version+1)-gentoo. Потому что команда make menuconfig попытается загрузить предыдущую конфигурацию в меню, настолько, насколько возможно. Тем не менее, рекомендуется осторожное рассмотрение каждого параметра и новых разделов.

Сетевая загрузка

С установочного диска

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

Волшебство заключается в скрипте linuxrc утилиты genkernel: он попытается смонтировать загрузочный диск по сети используя NFS. Оттуда, init-скрипт загрузочного CD смогут получить контроль, как если бы CD присутствовал локально.

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

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

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

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

Ядро Конфигурация ядра серии 3.x.x для поддержки различных драйверов NIC
Device Drivers --->
   Networking Support --->
      Ethernet (10 or 100Mbit)  --->
         [*] Ethernet (10 or 100Mbit)
         <*>   The driver(s) for each network card
Заметка
Убедитесь, что выбран <*>, а не <M>.

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

Ядро Конфигурация ядра серии 3.x.x для поддержки DHCP
Device Drivers --->
   Networking Support --->
      Networking options
         [*] TCP/IP networking--->
         [*]   IP: kernel level autoconfiguration
         [*]     IP: DHCP support

Эти параметры сообщают ядру, чтобы оно отправило DHCP-запрос при загрузке.

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

Ядро Конфигурация ядра для поддержки SquashFS
File systems--->
   Miscellaneous filesystems --->
      [*] SquashFS 2.X - Squashed file system support

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

Чтобы создать архив содержащий все модули:

root #cd /
root #tar -cf /tmp/modules-X.Y.Z.tar.gz /lib/modules/X.Y.Z/

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

Для создания образа etherboot:

root #emerge --ask net-misc/mknbi
root #cd /boot
root #mkelf-linux -params="root=/dev/ram0 init=/linuxrc ip=dhcp" kernel... initrd... > etherboot.img

Для создания образа OpenBoot/SPARC64 TFTP:

root #emerge --ask sys-apps/sparc-utils
root #cd /boot
root #elftoaout kernel... -o kernel.aout
root #piggyback64 kernel.aout System.map-... initrd-...
root #mv kernel.aout openboot.img

Файл openboot.img является образом ядра.

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

Настройка NFS

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

Следующее предполагает что /nfs/livecd является экспортируемым общим сетевым ресурсом NFS:

root #mount /tmp/gentoo-livecd.iso /mnt/cdrom -o loop
root #cp -p /mnt/cdrom /nfs/livecd
root #umount /mnt/cdrom

Теперь, скопируйте файл modules.tar.gz в /add:

root #mkdir /nfs/livecd/add
root #cp /tmp/modules-X.Y.Z.tar.gz /nfs/livecd/add

Настройка DHCP

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

Файл /etc/dhcpd.confОбразец настройки для клиента в dhcpd.conf
# Здесь, 192.168.1.2 - это NFS сервер, тогда как 192.168.1.10 будет IP-адресом компьютера загружаемого по сети
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 о том, что необходимо примонтировать установочный CD через NFS. Здесь приведены несколько платформо-зависимых советов:

Для etherboot, вставьте etherboot-диск в привод и перезагрузитесь. Командная строка ядра была указана, когда собирался образ.

На Sparc64, нажмите Stop+A в командной строке загрузки и затем введите:

okboot net ip = dhcp init = /linuxrc

Для PXE, настройте pxelinux (часть пакета syslinux), затем создайте pxelinux.cfg/default подобно тому как:

Файл 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

Загрузка initramfs, сгенерированной genkernel

Введение

Если initramfs установлен с помощью genkernel, то присмотритесь к следующим параметрам загрузки которые могут (или должны) быть определены в конфигурации загрузчика. Наиболее общие добавлены в это руководство.

Загрузка LVM или программного RAID

Если система использует LVM или программный RAID, initramfs должен быть собран с использованием параметров --lvm и --mdadm. Не забудьте также включить поддержку во время процесса загрузки. Это можно сделать с помощью параметров dolvm и domdadm.

Файл /boot/grub/grub.confВключение поддержки LVM и/или MDADM
# Пример для GRUB 1.x
title Gentoo Linux
root (hd0,0)
kernel /vmlinuz root=/dev/md3 dolvm domdadm
initrd /initramfs-genkernel-x86_64-3.4.3
Загрузка в однопользовательском режиме

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

Файл /boot/grub/grub.confЗагрузка в однопользовательском режиме
# Пример для GRUB 1.x
title Gentoo Linux
root (hd0,0)
kernel /vmlinuz root=/dev/md3 init_opts=S
initrd /initramfs-genkernel-x86_64-3.4.3

Устранение проблем

compile failed: Kernel not found

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

Это можно проверить с помощью загрузки с x86_64 LiveCD на железе способном работать в 64-битном режиме, однако установленная система является 32-битной. После того, как начнется процесс компиляции, genkernel будет пытаться автоматически определить архитектуру системы на основе текущего ядра. Если в настоящее время работает 64-бит ядро и нет никаких настроек меняющих это, то genkernel будет предполагать, что следует искать 64-битное ядро.

Предположим теперь, что файл .config ядра x64 отключен. Команда make будет выполнена и полученный файл ядра будет размещен в соответствующей x86 директории. Когда genkernel переходит к установке (перемещению и переименованию) ядра, оно не может его найти, потому что ожидает 64-битное ядро.

Решением этой проблемы является использовать опцию genkernel --arch-override, в рассматриваемом примере архитектура x86. В итоге команда может выглядеть следующим образом:

root #genkernel --kernel-config=/usr/src/linux/.config --btrfs --install --arch-override=x86 all

Чтобы изменить архитектуру на постоянной основе, измените переменную ARCH_OVERRIDE в файле /etc/genkernel.conf.

Внешние модули (такие как xtables_addons) должны быть пересобраны вручную, для использования в новом ядре

genkernel может пересобрать внешние модули после сборки ядра; отредактируйте файл genkernel.conf, чтобы добавить эту строчку:

Файл /etc/genkernel.confЗапуск команды после сборки нового ядра
# Run the specified command in the current environment after the kernel and
# modules have been compiled, useful to rebuild external kernel module
# (use "emerge --quiet @module-rebuild" for >=portage-2.2) or installing additional
# files (use 'copy_image_with_preserve dtb path/to/dtb dtb ${KNAME}-${ARCH}-${KV}')
#CMD_CALLBACK=""
CMD_CALLBACK="emerge --quiet @module-rebuild"

Смотрите также