Основы "ядерной физики"

Продолжая цикл материалов о сборке ПО из исходников, (начало см. mtaalamu.ru/blog/linux/936.html и mtaalamu.ru/blog/linux/916.html), нельзя не сказать о самой лакомой теме — компиляции ядра ОС GNU/Linux.



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

Загрузить свежие (2.6.34) исходники ядра — не проблема. Правда, «весят» они аж 64 Мб, но это не так уж и много, если учесть, что стоимость ядра Linux оценивается в сотни миллионов долларов (в случае, если бы его решили продавать).

Бытует мнение, что сборка ядра из исходников — занятие для гиков, которым некуда девать свободное время: вылезают ошибки, приходится что-то править, хитрить и выкручиваться, а каждая компиляция занимает десятки минут. Может несколько лет назад это было и так, но сегодня вряд ли соответствует действительности. Компилируется долго, это правда. Но если у вас нормальная ОС с современным компилятором и нормальным набором сопутствующих библиотек и программ (Slackware, например, с установленными пакетами серии development ), то скорее всего ядро соберется с первого раза. Сегодня, например, я сконфигурировал ядро минут за 10, запустил процесс компиляции и ушел на пару часов в колледж читать лекции. Когда вернулся — всё было готово. Оставалось лишь сделать make install, прописать ядро в загрузчик, перезагрузиться… И вот пишу этот топик уже, так сказать, «из нового ядра».

Алгоритм сборки ядра принципиально не отличается от создания любой другой программы из исходников: скачиваем тарбол (tar.gzip — архив), распаковываем в /usr/src, конфигурируем, собираем командой make, устанавливаем командой make install. И все-таки ядро — программа в сотни раз более сложная, чем любая другая, так что специфики здесь, конечно, хватает.

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

make menuconfig


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



Меню это представляет собой древовидную структуру, перемещаясь по которой можно выбирать опции: поддержку того или иного оборудования, сетевых возможностей, файловых систем и т.п. Здесь нужно сказать, что опции эти можно сформировать в виде модулей — фрагментов кода, хранящихся в отдельных файлах в каталоге /lib/modules и подключаемых по мере необходимости, а можно встроить в тело ядра. Как определиться с этим? Очень просто: если какое-то свойство ядра нужно непосредственно в момент загрузки (когда жесткий диск с хранящимися на нем модулями еще недоступен), то следует включить его в тело ядра. Если же к нему обращаются изредка — то и модулем можно обойтись. Некоторые опции в конфигурации по умолчанию вообще отключены, что существенно сокращает время сборки ядра.

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

В последних версиях ядра менять почти ничего не надо. Я, например, внес всего два изменеиия: подключил файловую систему ext4 (встроил в ядро, т.к. именно в ней отформатирован корневой раздел жесткого диска) и подключил файловую систему squashfs в виде модуля (пользуюсь иногда). После внесения изменений выходим из меню (можно, например, нажав Escape и согласившись на сохранение изменений). Теперь запускаем, всё так же находясь в каталоге ядра, команду make и идем на несколько десятков минут подальше от компьютера заниматься какими-нибудь другими делами.

По окончании процесса компиляции нужно установить новое ядро в систему. Чтобы ничего не напортить, советую действовать по следующей схеме. Во-первых, переименуйте каталог /boot в /boot.old (например). Создайте пустой каталог /boot в корне файловой системы. Войдите в /usr/src/linux<собираемая версия ядра> и выполните make install. При этом процесс может ругнуться по поводу, например, отсутствия файла /etc/lilo.conf или еще на что-то. Это не суть. Главное — чтобы в каталоге /boot появилось два файла — vmlinuz (это и есть заархивированное алгоритмом zip ядро) и System.map (его назначение мне непонятно, но без него ничего работать, скорее всего, не будет). Теперь, чтобы не потерять работающую систему, переименуйте /boot в /boot.new, а /boot.old обратно в /boot. Вам останется лишь «подцепить» новое ядро к загрузчику. Что это за загрузчик (lilo, grub, isolinux или еще что-то) — зависит от вашей системы, поэтому данный вопрос рассмотрим в другой раз. Здесь же добавлю, что никакого радикализма при переходе на новое ядро быть не должно: с первого раза оно если и заработает, то скорее всего не без некоторых ошибок. Так что загрузчик должен содержать строки и о старой версии ядра, и о новой.

О патчах ядра, подключении его нестандартных возможностей, настройке загрузчика расскажу в следующем топике.

Продолжение следует.

Комментарии (10)

RSS свернуть / развернуть
+
0
Прощай личная жисть...
avatar

Markony

  • 27 мая 2010, 11:54
+
0
В debian-based дистрах есть пакет kernel-package, содеражащий утилиту сборки make-kpkg. Она собирает ядро в .deb пакет. И танцев с бубном над /boot не требуется =)
avatar

durman

  • 28 мая 2010, 09:10
+
0
Понимание смысла «танцев с бубном» над /boot займет меньше времени, чем установка deb-пакета. Другое дело, что пакет, возможно, прописывает новое ядро в загрузчик. Так и это не проблема, если знать, как устроен загрузчик.
avatar

yababay

  • 28 мая 2010, 09:54
+
0
Именно, прописывает в меню граба. как доп ядро
avatar

durman

  • 28 мая 2010, 10:05
+
0
Да, в грабе вручную хрен разберешься…
avatar

yababay

  • 28 мая 2010, 12:39
+
0
только если в новом)) Да и то все правиться))
avatar

ksandras

  • 29 мая 2010, 11:47
+
0
А поделиться с братвой (знаниями)?
avatar

yababay

  • 29 мая 2010, 11:54
+
0
да легко даже по моему на убунту сообществе про это все написано — сам постоянно правлю груб руками
avatar

FREExLOADER

  • 29 мая 2010, 12:02
+
0
Во-воКомрад дело говорит)
avatar

ksandras

  • 30 мая 2010, 22:10
+
0
Не вижу смысла что-то выкладывать. Когда есть отличная статья на викиучебнике — ru.wikibooks.org/wiki/Grub_2

В ней все что может потребоваться при работе со вторым грабом
avatar

ksandras

  • 30 мая 2010, 22:18

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.