SDB:Сборка ядра Linux

(перенаправлено с «How To Compile A Kernel - The SuSE Way»)
Перейти к: навигация, поиск

От Переводчика

Это руководство является почти полным переводом этого HowTo. Отступления от оригинала производились в случае необходимости внести ясность в документ с учетом сегодняшнего времени. Также некоторые изменения были внесены в связи с удалением "разъясняющих" скриншотов и необходимостью исправления устаревшей информации.

От автора

Каждый дистрибутив имеет свой, особенный набор инструментов для сборки ядра из исходных кодов. Эта небольшая инструкция о том, как собирать ядро в openSUSE. Далее я расскажу, как собрать ядро из немодифицированного исходного кода, взятого с сайта www.kernel.org (vanilla kernel). Это позволит вам не быть зависимым от ядер, подготавливаемых разработчиками дистрибутива. Я также покажу, как накладывать патчи на исходный код ядра, на случай если вам понадобится функциональность, не реализованная в официальном ядре.

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

Введение

Задача этого руководства — собрать rpm-пакет, содержащий ядро, готовое для установки, и которое вы могли бы использовать в других дистрибутивах openSUSE. Это дает вам большие возможности по сравнению с "традиционным" путем получения и использования rpm-пакетов, содержащих ядро системы.

Установка пакетов, необходимых для компиляции ядра

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

# zypper in make gcc ncurses-devel rpm-build

Получение исходных кодов ядра

Сейчас мы скачаем нужное нам ядро и положим его в каталог /usr/src. Зайдите на www.kernel.org и выберите ядро, которое вы хотите установить, например linux-3.4.6.tar.bz2 (все ядра ветки 3.x вы можете найти здесь http://www.kernel.org/pub/linux/kernel/v3.x/). Теперь скачайте его в /usr/src так, как показано ниже.

$ cd /usr/src/
# wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.6.tar.bz2 

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

# tar xjf linux-3.4.6.tar.bz2
# ln -s linux-3.4.6 linux
$ cd /usr/src/linux

Наложение патчей на исходный код ядра

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

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

# bzip2 -c /usr/src/patch.bz2 | patch -p1 --dry-run
# bzip2 -dc /usr/src/patch.bz2 | patch -p1

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

Если при выполнении первой команды вы видите строчку на подобии этой: Hunk #1 succeeded at..., то это означает, что накладываемый патч будет сдвинут на некоторое количество строк, но при этом он будет наложен успешно.

Если ваш патч сжат архиватором gzip(gz) вместо bzip2(bz2) в этом случае ваши действия будут такими:

# gunzip -c /usr/src/patch.gz | patch -p1 --dry-run
# gunzip -c /usr/src/patch.gz | patch -p1

Точно так же накладываются так называемые препатчи (prepatches) ядра. Например, если вам нужны какие-либо возможности, уже реализованные в ядре patch-3.6-rc6, а полный исходный код этой версии еще недоступен, кроме как в виде патча patch-3.6-rc6.bz2, то вы можете накладывать этот патч на ядро 3.5, но не на ядро 3.5.1, 3.5.2 и т.д.

Препатчи — это альфа-версии ядра Linux; они находятся в архиве в каталоге для тестируемых версий. Они накладываются при помощи утилиты patch(1) на исходный код предыдущей версии ядра, номер которой состоит из двух частей (например, препатч patch-3.x-rcx накладывается на ядро 3.x, но не на ядро версии 3.x.y).

Таким образом, если вы хотите собрать ядро 3.6-rc6, вы должны скачать ядро версии linux-3.5.tar.bz2 вместо linux-3.4.6.tar.bz2. Ниже приведен пример, как накладывать патч 3.6-rc6 на ядро 3.5.

$ cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v3.x/testing/patch-3.6-rc6.bz2  
$ cd /usr/src/linux
# bzip2 -c /usr/src/patch-3.6-rc6.bz2 | patch -p1 --dry-run
# bzip2 -dc /usr/src/patch-3.6-rc6.bz2| patch -p1
Обратите внимание, что патчи для ядра 3.x.y из стабильной ветки (-stable), применяются аналогичным образом, т.е. непосредственно к ядру 3.x, а не 3.x.y. Более подробную информацию можно найти здесь.

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

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

# make mrproper
# cp /boot/config-`uname -r` ./.config

Затем выполним:

# make menuconfig
Вместо menuconfig, вы можете использовать: xconfig, gconfig, config, oldconfig. Более подробную информацию Вы можете узнать, выполнив: make help.

Данная команда запустит интерфейс конфигурирования ядра. Выберите Load an Alternate Configuration File и введите .config в качестве имени конфигурационного файла.

Теперь пройдитесь по всему меню конфигурирования ядра и выберите те опции, которые вам понадобятся. Я советую вам обязательно изменить строку с идентификатором версии General Setup --> (...default) Local version-.... По умолчанию значение этого параметра выставлено в -defaul. Если оставить его, то rpm-пакет с ядром будет назван kernel-3.4.6-*-default-1.i386.rpm. Вы вольны менять это значение по своему усмотрению.

В этом руководстве я буду использовать обычное значение -default.

После того как вы установите ядро из пакета kernel-3.4.6-*-default-1.i386.rpm, а позже захотите пересобрать его, то не забудьте изменить строку с идентификатором версии, иначе вы не сможете установить его, т. к. данный пакет уже установлен в системе.

Когда закончите с настройкой, выберите "Exit", и ответьте на вопрос (Do you wish to save your new kernel configuration) Yes.

Сборка ядра

Чтобы собрать ядро, просто выполните эту команду:

# make -jn rpm
  • где n - количество ядер процессора +1.
Обратите внимание, что используя параметр "-j" вы можете существенно повысить скорость сборки ядра, используя несколько одновременных потоков компиляции. Существует вероятность того, что данный способ компиляции может вызвать некоторые ошибки. Вы действуете на свой страх и риск.

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

Установка ядра

В результате успешной сборки ядра будут созданы два RPM пакета src.rpm и .rpm. Пакет src.rpm будет находится в директории /usr/src/packages/SRPMS:

$ ls -l /usr/src/packages/SRPMS

В моей системе он называется kernel-3.4.6-2.10-default-1.i386.rpm.

RPM пакет с двоичными данными (собственно то, что мы компилировали) находится в директории /usr/src/packages/RPMS/i386, /usr/src/packages/RPMS/i586, /usr/src/packages/RPMS/i686 и т.д. в зависимости от архитектуры вашей машины. В моей системе это была директория /usr/src/packages/RPMS/i386, а сам пакет назывался kernel-3.4.6-2.10-default-1.i386.rpm.

Теперь мы можем установить наш rpm пакет.

$ cd /usr/src/packages/RPMS/i386
# rpm -ivh kernel-3.4.6-2.10-default-1.i386.rpm
Вы можете устанавливать этот rpm пакет в любой другой системе openSUSE точно так же как это было описано выше. Это избавит вас от необходимости компилировать ядро.

Следующим этапом будет создание RAM-диска для нашего ядра. Иначе наше ядро скорее всего просто не загрузится:

# /sbin/mkinitrd
Обычно результатом выполнения команды является создание RAM-диска для каждого ядра в директории /boot.

Настройка загрузчика Grub

Нам осталось только настроить загрузчик Grub, чтобы после перезагрузки система грузилась уже с нашим новым ядром. В место редактирования файла /boot/grub/menu.lst руками мы с делаем это с помощью центра управления YaST2:

$ /sbin/yast2
Если у вас помимо openSuSE и Windows установлена еще пара-тройка операционных систем, то лучше всё же править конфигурационный файл напрямую из текстового редактора. Возможно openSUSE некорректно определило другие дистрибутивы Linux.
  • Выберите из списка: "Cистема -> Загрузчик"
  • Перед вами появится текущий список выбора загрузчика Grub, нажмите "Добавить" для создания новой записи
  • На следующем экране выберите: "Клонировать выбранную секцию", чтобы сделать копию рабочей загрузочной записи Grub и нажмите "Далее"
  • Теперь введите имя для вашего ядра, например, openSUSE-12.2 - 3.4.6 и нажмите "Образ ядра -> Обзор"
  • Вы увидите список файлов директории /boot, в которой и находится ваше ядро. Выберите ваше недавно созданное ядро, обычно его название начинается с vmlinuz.
  • Далее точно так же выбираем "Начальный RAM-диск". Это файл с названием initrd-версия.вашего.ядра
  • Нажимаем "ОК" и возвращаемся в главное меню.
  • Если все сделано правильно, вы увидите новую запись для вашего ядра. Кнопками "Вверх" и "Вниз" переместите эту запись на необходимую вам позицию и нажмите "Установить по умолчанию"
  • Далее "OK".

Все, настройка закончена! Для верности вы можете открыть файл /boot/grub/menu.lst в текстовом редакторе (именно его мы редактировали с помощью Yast) и проверить наличие новой секции с нашим ядром в ней. Сделать это можно, набрав:

$ vim /boot/grub/menu.lst

Заодно проверьте, правильно ли вы написали название ядра и RAM-диска. Сравните с тем, что показывает:

$ ls -l /boot

Осталось перегрузить систему:

# /sbin/shutdown -r now 

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

$ uname -r

В ответ вы увидите что-то вроде этого:

3.4.6-2.10-default

Если система не загрузилась, перезапустите её, и в меню Grub выберите ваше предыдущее рабочее ядро. Вы сможете загрузить систему и исправить ошибки, или пересобрать ядро, но при этом не забудьте удалить неработающую загрузочную запись из /boot/grub/menu.lst.

Заключение

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

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

Для сборки дистрибутивного ядра Вам сначала необходимо установить его исходники, выполнив:

# zypper in kernel-source

Далее Вы можете приступить к наложению патчей и конфигурированию ядра согласно вышеприведенным действиям.

Также смотрите