Что такое ядро. Часть 1 : пересборка

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

Где оно?

Само ядро находится в директории /boot и, обычно, имеет имя вроде vmlinuz-linux. Загрузчик во время запуска компьютера загружает его и передает ему управление для загрузки. Но, драйвера всех железяк не вкомпилишь в ядро, иначе оно будет слишком здоровым. Поэтому у linux есть динамически подгружаемые модули ядра, причем, зачастую необходимые модули ядра для загрузки системы тоже динамические. Это значит, что систему так просто не загрузишь: нужно предусмотреть механизм загрузки драйверов жестких дисков, файловых систем и т.д.
Для такого случая в типичном дистре предусмотрен initrd (Initial RAM disk). initrd — это файловая система, где находится минимальный UNIX, достаточный для того, чтобы загрузить модули ядра, необходимые для работы с дисками, файловыми системами, примонтировать раздел жесткого диска с установленной ОС в корень и продолжить процесс загрузки с монтированным разделом. Это — демон инициализации, shell, утилиты командной строки (обычно, busybox) и модули ядра. Во время установи системы или обновления ядра initrd автоматически собирается и, в результате, там оказываются необходимые нам модули.
Теперь, когда мы знаем про ramdisk, попробуем организовать процесс загрузки по другому: загрузчик загружает ядро, загружает рамдиск и по некому стандарту сообщает ядру об этом диске, затем передает управление ядру. Ядро запускает демон инициализации. Как правило это /bin/init, тот грузит модули, показывает красивую картинку загрузки вашей убунты(федоры, минта…) монтирует жесткий диск и работает там.
Давайте убедимся, что это так. Дружно запускаем команду
cat /etc/mtab
Если система действительно загрузилась с помощью initrd, мы увидим в первой строчке что-нибудь вроде:
rootfs / rootfs rw 0 0
После rootfs в корень ФС монтируется раздел вашего жесткого диска. Как и положено, вы после монтирования жесткого диска не можете видеть, что находится в rootfs, однако она смонтирована в корне до него.
initrd находится в директории /boot и, в моем случае, зовется initramfs-linux.img.
Если вы не нашли ядро или рамдиск советую посмотреть процедуру загрузки в конфигах загрузчика. Если ваш загрузчик — GRUB 2, то делается это так:
cat /boot/grub/grub.cfg

Где модули?

Модули в /boot вы можете не искать, они находятся в папке /lib/modules. Если у вас стоит несколько ядер, то там будет несколько папок. Для того, чтобы узнать папку запущенного ядра вбейте команду:
uname -r
Модули ядра имеют расширение *.ko и запакованы в архивы.

Let’s go!

Итак, давайте для начала условимся, что особенности сборки и установки ядра немного зависят от дистрибутива и того, как его устанавливали. У меня, например стоит Arch Linux и у меня во время сборки ядра возникли проблемы. Для того, чтобы на арче собрать ядро убедитесь, что у вас есть bc, docbook-xsl, inetutils и xmlto. Мне не следует вам напоминать, что у вас должен стоять компилятор gcc. Если во время сборки возникают проблема, вроде «не могу запустить такую-то программу», убедитесь, что у вас все есть.
Поехали. Для начала, скачайте исходники ядра:
wget https://www.kernel.org/pub/linux/v3.x/linux-3.18.6.tar.xz
Затем, распакуйте их с помощью архиватора tar и зайдите в папку:
tar -xJf linux-3.18.6.tar.xz
cd linux-3.18.6

Для начала было бы не плохо почитать README того, что вы скачали. Следует сконфигурировать ядро, прежде чем его собрать. Конфигурация иерархически упорядочена и состоит из параметров четырех типов. Первый — это переключатель с двумя-тремя состояниями: включить какой-то функционал, отключить или включить как динамически загружаемый модуль. Второй — это радиокнопка. Другие два типа — это числовые и строковые константы, которые позволяют выбрать имя ядра, файл системы инициализации по умолчанию, максимальное число графических процессоров и т.д.
Конфигурировать ядро можно по-разному. Перечислю наиболее — популярные команды.

  • make menuconfig — подойдет, если мы не можем позволить себе такую роскошь, как графический интерфейс(например, мы не установили иксы, или они не запускаются из-за конфигурации ядра, или мы работаем по SSH, хотя собирать ядро по удаленке довольно странно). Будет представлен интерфейс на псевдографике, где мы сможем с помощью клавы отметить нужные чекбоксы.
  • make xconfig — если у нас есть такая роскошь, как графический интерфейс и в нем используется библиотека Qt.
  • make gconfig — у нас есть такая роскошь, как графический интерфейс, но по странному стечению обстоятельств вы используете GNOME вместо KDE.
  • make oldconfig — дополняет старый конфиг новыми параметрами, задав вам несколько вопросов.
  • make defconfig — настройки, по умолчанию.

Мы пойдем следующим путем: создатель дистрибутива тщательно подбирал настройки ядра и вы точно знаете, что система с ними работает. Мы возьмем настройки из рабочей системы. Если в конфигурации ядра был включен config.gz, то мы можем найти этот файл в файловой системе /proc:
cp /proc/config.gz .
gzip -d config.gz
mv config .config
make oldconfig

Дальше мы примемся все конфигурировать уже интересующие нас параметры. Во первых было-бы не плохо узнать, какие модули в наше системе в данный момент загружены. Команда lsmod выдает список модулей в три колонки:

  • Module — имя модуля
  • Size нас не интересует.
  • Used by по сути две колонки. Первая — это число зависимостей от данного модуля. Вторая — это те самые модули, которые его используют.

Если в колонке used by разность числа модулей и числа зависимостей не равна нулю, значит в ядре есть, что-то что использует его и вы не можете этот модуль выгрузить, не введя систему в неработоспособное состояние. Это значит, вы не выгрузите драйвер жесткого диска, который уже примонтирован и на котором установлена работающая в данный момент ОС. Помимо, этого есть модули, от которых зависят — эти невыгружаемые модули. Все остальные вы можете так или иначе выгрузить в рантайме командой вида modprobe -r foo и система, скорее всего, останется в работоспособном состоянии. Чтобы ваша система грузилась без рам диска вам, как минимум, нужно встроить в ядро невыгружаемые модули. Если вы хотите освободить несколько секунд загрузки, сделав ядро монолитным, встройте все, что вы видите в выхлопах команды lsmod. Приступим к конфигурированию:
make menuconfig
Не забудьте переименовать ядро, для поиска необходимых опций воспользуйтесь поиском. Помните, что вы не всегда найдете опцию, отвечающую за тот или иной модуль, в этом деле вам поможет Google (или Яндекс, Bing, поиск@mail.ru, в зависимости, от того, чем вы пользуетесь).
После, того как вы все настроили, осталось ядро собрать и установить вместе с модулями:
make
Отдохните, сделайте чай. У вас появилось несколько часов свободного времени, прежде чем вы выполните установку:
make install modules_install
Новое ядро будет установлено как /boot/vmlinuz. Переименуем его в vmlinuz-mykern, для того чтобы ядро было найдено GRUB’ом. Помимо, этого вам следует собрать initrd, даже если полагаете, что система загрузится без него, для того чтобы убедиться, что она загрузится хотя-бы с ним. В арче я делаю это так
mkinitcpio -g /boot/initramfs-mykern.img -k 3.18.6-MYKERN (предполагалось, что вы дали ядру имя -MYKERN)
Нам остается обновить конфиги GRUB’а и ребутнуть систему. Будьте внимательны и не удаляйте ядро из дистра, поскольку ваше ядро окажется скорее-всего не рабочим и вам придется в таком случае брать загрузочный диск, монтировать жесткий перейти в chroot окружение и переустановить ядро(если вы не знаете, как это сделать, вам ещё рано пересобирать ядра).
grub-mkconfig -o /boot/grub/grub.cfg
reboot

Вместо заключения

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

1 комментарий к “Что такое ядро. Часть 1 : пересборка

  1. В акедемических интересах пересобрать ядро это очень хорошо, но на практике в этом нет необходимости:
    1. лучше добавлять нужные модули без пересборки ядра.
    2. в конкретном случае в archlinux и так приходят свежие ядра при обновлении.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*