Создание вашего нового ядра Linux. Часть 2: Конфигурирование нового ядра Linux

786

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

Оригинал: «Building Your Own Linux Kernel, part 2:Configuring a New Linux Kernel»
Автор: Akkana Peck
Перевод: Н.Ромоданов

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

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

Четыре способа конфигурирования

В директории исходных кодов ядра имеется четыре варианта конфигурирования в зависимости от того, какой интерфейс вы предпочитаете использовать: make config (командная строка), make menuconfig (меню в терминальном окне, рис.1), make xconfig (Qt, рис. 2) и make gconfig (GTK, рис. 3).

Рис. 1

Рис. 2

Рис. 3

Я рекомендую использовать menuconfig. Несложный интерфейс конфигурирования позволит вам шаг за шагом пройтись по всем опциям настройки ядра (а их — тысячи), тогда как для xconfig и gconfig требуется множество заголовочных файлов, используемых в время разработки ядра для Qt или GTK/Glade

В menuconfig для перехода между опциями используются клавиши со стрелками, указывающими вверх и вниз. В категориях (т. е. там, где есть отметка «—>») на «кнопках», расположенных в нижней части окна указывается действие, которое произойдет, когда вы нажмете на клавишу Enter: Select — выбор следующего уровня в категории, Exit — выход на более высокий уровень и Help — выдается подсказка. С помощью клавиш со стрелками, указывающими влево и вправо, выбирается кнопка с необходимым действием. Вы можете также ввести символ ? для получения подсказки.

Модули или нет

Большинство опций конфигурации ядра имеют три состояния: built-in (*), not built ( ) или module (M) (встроено в ядро (*), не встроено в ядро ( ) или модуль (M)). Если вы не знаете, купите ли вы планшет Wacom и будет ли он у вас подключен постоянно, то вы можете создать драйвер Wacom как модуль и он будет загружаться только тогда, когда это будет необходимо.

Звучит здорово, правда? Почему не создавать все в виде модулей? Это то, что делают в ядрах дистрибутивов: введите команду lsmod | wc -l чтобы увидеть сколько у вас загруженных модулей. В этом есть свои минусы. Самым серьезным является скорость загрузки: каждый модуль добавляет приблизительно полсекунды к времени загрузки вашей системы.

Драйверы, конфигурируемые как модули, будут в menuconfig (рис. 4) помечены символом ‘M’. Наберите ‘y’, чтобы указать, что они должны быть встроены в ядро.

Рис.4

… Хорошо, по меньшей мере в теории. Но как только вы начнете это делать, вы обнаружите, что для большого количества опций нельзя ‘m’ изменить на ‘y’. Если эта опция зависит от другого модуля, то вы должны найти эту зависимость и сделать изменения сначала для нее.

Легче сказать, чем сделать. Поэтому выключите вторую опцию Enable loadable module support (Включена поддержка загружаемых модулей), находящуюся на экране самого верхнего уровня (рис.5). Вы всегда можете включить ее позже, но, временно ее выключив, вы выполните все переключения с «M» на «Y» более аккуратно с учетом всех зависимостей.

Рис.5

Конфигурирование

Выберите кресло поудобнее — конфигурация ядра может занять несколько часов. Ядро имеет множество опций, и если вы пытаетесь уменьшить ядро, то вам лучше всего просмотреть все настройки, указывая «n» для тех опций, которые вам не нужны, и «y» (что лучше, чем «m») — для тех, которыми вы будете пользоваться.

Как узнать, какие опции вам нужны? Это всегда требует отдельного анализа, причем Help не всегда может вам в этом помочь (рис.6)

Рис.6

Если ранее для некоторого драйвера было установлено ‘M’ и вы можете узнать имя модуля (посмотрите help), то с помощью команды smod | grep ‘имя модуля’ можно определить, используется ли он. Если он не используется, то он вам не нужен.

Если вы не уверены, то посмотрите, есть ли в help подсказка, например, следующая «Say N if unsure» («Укажите N если не уверены»). В противном случае обычно более безопасно выбирать вариант, указываемый по умолчанию, или тот, что используется в вашем дистрибутиве.

Несколько важных опций

Вспомните, что в первой статье нашей серии вы нашли файл .config для ядра вашего дистрибутива, которое перед этим использовалось? В разделе General setup в категории «Kernel .config support» («Поддерживать для ядра работу с .config «) вы можете задать создавать файл с именем /proc/config.gz, в котором будут сохранены настройки параметров ядра. Включите эту опцию: вы оцените эту возможность, когда будете строить свое следующее ядро.

В случае, если вы пользуетесь совсем недавними релизами, такими как новая версия Ubuntu 9.10 beta, то убедитесь в том, что опция «Remove sysfs features which may confuse old userspace tools» выключена. Возможна путаница с udev и некоторые устройства могут работать неправильно.

В разделе Processor type and features обратите внимание на категорию, помеченную как «High Memory Support ->». Имеются следующие опции: off (выключено), 4GB и 64GB. Но, в действительности, здесь есть одна особеность. В современных машинах с памятью больше 3 Гбайтов ОЗУ для того, чтобы видеть все 4 Гбайта памяти, вам нужно будет устанавливать опцию High Memory Support равной 64GB, а не 4GB,. Доступ осуществляется с помощью механизма Physical Address Extension (расширение физического адресного пространства) или «PAE», который недоступен ядру в случае, если опция High Memory не установлена в 64GB, но в help об опции High Memory ничего об этом не сказано. В некоторых дистрибутивах, таких как Ubuntu, используются неправильные настройки и из-за этого видны только 3 Гбайта памяти.

Изменение файла menu.lst

После того, как вы закончите конфигурирование и создание ядра, вам нужно будет изменить ту часть в файле /boot/grub/menu.lst, которая соответствует вашему новому ядру. Удостоверьтесь в том, что вы создали именно новый фрагмент, а не изменили уже существующий. Может потребоваться сделать несколько попыток конфигурирования и создания ядра прежде, чем ядро полностью заработает.

Если вы создали ядро, работающее без модулей, то можете закоментировать строку с initrd. Однако если устройство root задано, например, следующим образом root=UUID=cf8ea122-33c9-4745-ae77-18025c53def4, то измените запись так, чтобы она действительно указывала на устройство root, например, следующим root=/dev/sda2.

Если вы используете модули, то вам, возможно, все еще необходим демон initrd. Если вы заходите сделать своего собственного демона, а не использовать имеющегося в вашем дистрибутиве, то загляните в mkinitramfs.

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