Компиляция ядра · 8 min read · Nov 27, 2025

Как скомпилировать ядро - по методу Debian

Каждое дистрибутив имеет свои специфические инструменты для сборки пользовательского ядра из исходников. Эта статья посвящена компиляции ядра на системе Debian (Etch). Она описывает, как собрать пользовательское ядро, используя последние немодифицированные исходники ядра с www.kernel.org (ванильное ядро), чтобы вы были независимы от ядер, поставляемых вашим дистрибутивом. Также показано, как патчить исходники ядра, если вам нужны функции, которых в них нет.

Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

Я опишу два способа компиляции нового ядра. Используя первый метод, вы получите пакет kernel.deb, который можно установить на систему и которым можно поделиться с другими и установить на другие системы Debian Etch.

Второй метод — это компиляция ядра «традиционным» способом. Этот способ работает на любом дистрибутиве Linux, но, конечно, вы не получите пакет kernel.deb.

2 Создание пакета .deb ядра

Эта глава показывает, как создать ядро и получить пакет .deb, который вы можете установить и поделиться с другими.

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

Сначала обновим нашу базу данных пакетов:

apt-get update

Затем установим все необходимые пакеты следующим образом:

apt-get install kernel-package ncurses-dev fakeroot wget bzip2 build-essential

2.2 Загрузка исходников ядра

Далее мы загружаем желаемое ядро в /usr/src. Перейдите на www.kernel.org и выберите ядро, которое хотите установить, например, linux-2.6.21.3.tar.bz2 (все ядра 2.6 можно найти здесь: http://www.kernel.org/pub/linux/kernel/v2.6/). Затем вы можете загрузить его в /usr/src следующим образом:

cd /usr/src  
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2

Затем мы распаковываем исходники ядра и создаем символическую ссылку linux на директорию исходников ядра:

tar xjf linux-2.6.21.3.tar.bz2  
ln -s linux-2.6.21.3 linux  
cd /usr/src/linux

2.3 Применение патчей к исходникам ядра (необязательно)

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

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

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

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

Вы также можете применять предпатчи к своим исходникам ядра. Например, если вам нужна функция, которая доступна только в ядре 2.6.22-rc3, но полные исходники еще не были выпущены для этого ядра. Вместо этого доступен патч-2.6.22-rc3.bz2. Вы можете применить этот патч к исходникам ядра 2.6.21, но не к ядру 2.6.21.1 или 2.6.21.2 и т.д. Это объясняется на http://kernel.org/patchtypes/pre.html:

Предпатчи эквивалентны альфа-релизам для Linux; они находятся в тестовых директориях в архивах. Их следует применять с помощью утилиты patch(1) к исходному коду предыдущего полного релиза с трехчастным номером версии (например, предпатч 2.6.12-rc4 следует применять к исходникам ядра 2.6.11, а не, например, 2.6.11.10.)

Итак, если вы хотите скомпилировать ядро 2.6.22-rc3, вы должны загрузить исходники ядра 2.6.21 ( http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) на шаге 3 вместо ядра 2.6.21.3!

Вот как вы применяете патч 2.6.22-rc3 к ядру 2.6.21:

cd /usr/src   
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2  
cd /usr/src/linux  
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run  
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1

2.4 Настройка ядра

Хорошая идея — использовать конфигурацию вашего текущего работающего ядра в качестве основы для вашего нового ядра. Поэтому мы копируем существующую конфигурацию в /usr/src/linux:

make clean && make mrproper  
cp /boot/config-`uname -r` ./.config

Затем мы запускаем

make menuconfig

что открывает меню конфигурации ядра. Перейдите в Загрузить альтернативный файл конфигурации и выберите .config (который содержит конфигурацию вашего текущего работающего ядра) в качестве файла конфигурации:

Настройка ядра

Сохранить как файл .config

Затем просмотрите меню конфигурации ядра и сделайте свои выборы. Когда вы закончите и выберете Выход, ответьте на следующий вопрос (Хотите ли вы сохранить вашу новую конфигурацию ядра?) Да:

Сохранить новую конфигурацию ядра

2.5 Сборка ядра

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

make-kpkg clean  
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

После –append-to-version= вы можете написать любую строку, которая поможет вам идентифицировать ядро, но она должна начинаться с минуса (-) и не должна содержать пробелов.

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

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

После успешной сборки ядра вы можете найти два пакета .deb в директории /usr/src.

cd /usr/src  
ls -l

На моей тестовой системе они назывались linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (который содержит само ядро) и linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (который содержит файлы, необходимые, если вы хотите позже скомпилировать дополнительные модули ядра). Я устанавливаю их следующим образом:

dpkg -i linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb  
dpkg -i linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb

(Теперь вы даже можете передать два файла .deb на другие системы Debian Etch и установить их там точно так же, что означает, что вам не нужно компилировать ядро там снова.)

Вот и все. Файл конфигурации загрузчика GRUB /boot/grub/menu.lst был автоматически изменен, и для нового ядра был создан ramdisk в /boot.

Теперь перезагрузите систему:

shutdown -r now

На экране загрузки выберите ваше новое ядро (должно быть выбрано по умолчанию):

Загрузка в новое ядро

Если все пройдет хорошо, система должна загрузиться с новым ядром. Вы можете проверить, действительно ли используется ваше новое ядро, выполнив

uname -r

Это должно отобразить что-то вроде

2.6.21.3-custom

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

3 Сборка ядра традиционным способом

Эта глава описывает другой подход, который можно использовать на любой системе Linux (за исключением деталей, таких как создание ramdisk или обновление загрузчика). Конечно, вы не получите пакет kernel.deb.

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

Сначала обновим нашу базу данных пакетов:

apt-get update

Затем установим все необходимые пакеты следующим образом:

apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential

3.2 Загрузка исходников ядра

Далее, мы загружаем желаемое ядро в /usr/src. Перейдите на www.kernel.org и выберите ядро, которое хотите установить, например, linux-2.6.21.3.tar.bz2 (все ядра 2.6 можно найти здесь: http://www.kernel.org/pub/linux/kernel/v2.6/). Затем вы можете загрузить его в /usr/src следующим образом:

cd /usr/src  
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2

Затем мы распаковываем исходники ядра и создаем символическую ссылку linux на директорию исходников ядра:

tar xjf linux-2.6.21.3.tar.bz2  
ln -s linux-2.6.21.3 linux  
cd /usr/src/linux

3.3 Применение патчей к исходникам ядра (необязательно)

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

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

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

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

Вы также можете применять предпатчи к своим исходникам ядра. Например, если вам нужна функция, которая доступна только в ядре 2.6.22-rc3, но полные исходники еще не были выпущены для этого ядра. Вместо этого доступен патч-2.6.22-rc3.bz2. Вы можете применить этот патч к исходникам ядра 2.6.21, но не к ядру 2.6.21.1 или 2.6.21.2 и т.д. Это объясняется на http://kernel.org/patchtypes/pre.html:

Предпатчи эквивалентны альфа-релизам для Linux; они находятся в тестовых директориях в архивах. Их следует применять с помощью утилиты patch(1) к исходному коду предыдущего полного релиза с трехчастным номером версии (например, предпатч 2.6.12-rc4 следует применять к исходникам ядра 2.6.11, а не, например, 2.6.11.10.)

Итак, если вы хотите скомпилировать ядро 2.6.22-rc3, вы должны загрузить исходники ядра 2.6.21 ( http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) на шаге 3 вместо ядра 2.6.21.3!

Вот как вы применяете патч 2.6.22-rc3 к ядру 2.6.21:

cd /usr/src   
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2  
cd /usr/src/linux  
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run  
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1

3.4 Настройка ядра

Хорошая идея — использовать конфигурацию вашего текущего работающего ядра в качестве основы для вашего нового ядра. Поэтому мы копируем существующую конфигурацию в /usr/src/linux:

make clean && make mrproper  
cp /boot/config-`uname -r` ./.config

Затем мы запускаем

make menuconfig

что открывает меню конфигурации ядра. Перейдите в Загрузить альтернативный файл конфигурации и выберите .config (который содержит конфигурацию вашего текущего работающего ядра) в качестве файла конфигурации:

Затем просмотрите меню конфигурации ядра и сделайте свои выборы. Когда вы закончите и выберете Выход, ответьте на следующий вопрос (Хотите ли вы сохранить вашу новую конфигурацию ядра?) Да:

3.5 Сборка и установка ядра

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

make all  
make modules_install  
make install

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

3.6 Шаги после установки

Новое ядро теперь установлено, но нам все еще нужен ramdisk для нашего нового ядра (в противном случае система, скорее всего, не загрузится!), и нам нужно сообщить загрузчику GRUB о нашем новом ядре.

Сначала мы делаем это:

depmod 2.6.21.3  
apt-get install yaird

Затем мы создаем ramdisk с помощью следующей команды:

mkinitrd.yaird -o /boot/initrd.img-2.6.21.3 2.6.21.3

Конфигурация GRUB очень проста в Debian Etch. Все, что нам нужно сделать, это выполнить

update-grub

Это обнаружит новое ядро и ramdisk и обновит /boot/grub/menu.lst для нас.

Теперь перезагрузите систему:

shutdown -r now

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

uname -r

Это должно отобразить что-то вроде

2.6.21.3

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

4 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.