Дано: компьютер с установленной операционной системой Debian Lenny (стандартное ядро 2.6.26-1 или 2.6.26-2)
Задача: установить более новое ядро.
Уровень пользователя: средний, умеющий пользоваться консолью и имеющий немного терпения.
Решение:

Общие положения

Причин, подтолкнувших на обновление стандартного ядра, существующего в дистрибутиве, может быть много. Для автора причиной стал переход на новую материнскую плату с контроллёром ATA от JMicron. Поскольку в стандартном ядре Lenny версии 2.6.26-2, для контроллёра JMicron был недостаточно проработан драйвер, в определённых ситуациях, когда шла передача данных через локальную сеть и одновременно с USB-носителей на винчестер, машина иногда могла мёртво зависнуть. Также были проблемы с DVD-приводом, подключенным через PATA-интерфейс.

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

Выбор версии

В любом linux-дистрибутиве есть границы использования той или иной версии ядра. Определяются они стандартными Си-библиотеками и компилятором используемым в системе. Приложения тоже зависят от библиотек и компилятора, поэтому граница в некоторых случаях может быть преодолена только переходом на более свежую версию дистрибутива. Автору, не удалось перейти с версии ядра 2.6.26.2 на 2.6.33.1 как раз из-за проблем с компилятором. Перепробовав версии ниже, автор остановился на 2.6.32.3, которое скомпилировалось без особых проблем.

Подготовка

Соберите информацию о новом ядре

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

Подготовьте установщик драйвера и документацию

Если у Вас стоит аппаратный драйвер nVidia, для нового ядра его придётся переустановить, поэтому подготовьте инструкцию по установке драйвера в печатном виде. Также следует скачать [ftp://ftp.zeya.org/pub/soft/nix/drivers/nvidia/ бинарник драйвера] и положить где-нибудь в домашнем каталоге, чтобы после успешной компиляции и установки нового ядра, можно было без проблем переустановить драйвер, поскольку старый драйвер на новом ядре не заработает и иксы Вы не запустите.

Предварительно рассмотрите альтернативы после перехода на новое ядро

Как уже писал выше - возможны несовместимости программных пакетов с новым ядром. Автор, после обновления столкнулся с тем, что версия NFS-сервера уровня ядра 1.1.2-6lenny1, собранная для Debian Lenny не работает с ядром 2.6.32.3. Можно попробовать поставить NFS-сервер уровня "пространства пользователя", хоть оно и работает несколько медленнее. Также есть вариант перехода на Samba.

Процесс

Шаг 1. Выбор пространства для сбоки

Выбираем раздел\каталог с достаточным объёмом свободного места. Достаточным является объём как минимум в 3 раза больший, чем объём занимаемый исходниками. Например ядро 2.6.32.3 в tar.bz2-архиве занимает 63Мб. Распакованный из bzip2 в tar занимает уже 350Мб, а распакованный из tar, после компиляции, каталог уже будет занимать 750Мб. Итого, минимум 1.1Гб должно быть свободно.
Обычно, в качестве каталога выбирают /usr/src, но можно выбрать и другой, лишь бы не /tmp (он очищается после каждой перезагрузки) и обладающий достаточным свободным объёмом.

Шаг 2. Установка необходимых пакетов

Доустанавливаем необходимые пакеты вместе с зависимостями:
mc, tar, bunzip2, gcc, libc6-dev, binutils, make, module-init-tools, fakeroot, ncurses-base, libncurses-dev, libncurses5-dev, procps.
mc - он же Midnight Commander, пригодится для работы с файлами и редактирования конфигов.

Можно произвести установку через synaptic или в консоли:

 # apt-get install mc tar bunzip2 gcc libc6-dev binutils make module-init-tools \
   fakeroot ncurses-base libncurses-dev libncurses5-dev procps 

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

Скачиваем ядро с http://www.kernel.org/ и ложим в выбранный каталог\раздел, обладающий свободным местом порядка 1 Гбайт. Пускай это будет /usr/src .
Распаковываем ядро:

  # bunzip2 linux-2.6.32.3.tar.bz2
  # tar -xvf linux-2.6.32.3.tar

В итоге должен получиться каталог: /usr/src/kernel-2.6.32.3 , содержащий документацию и исходные коды.

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

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

  $ uname -r
  2.6.26-2

Ядро версии 2.6.26-2. Значит конфиг должен обзываться config-2.6.26-2-686 или config-2.6.26-2 .
С помощью Midnight Commander`а скопируем конфиг из /boot в /usr/src/kernel-2.6.32.3/ и переименуем в .config

Тоже, только из консоли:
выясняем, как обзывается конфиг:

 $ ls -l /boot 
 -rw-r--r-- 1 root root   91640 Мар 14  2009 config-2.6.26-1-686
 -rw-r--r-- 1 root root   91715 Мар 10 06:12 config-2.6.26-2-686
 drwxr-xr-x 2 root root    1024 Май 29 22:12 grub
 -rw-r--r-- 1 root root 7190195 Июн 14  2009 initrd.img-2.6.26-1-686
 -rw-r--r-- 1 root root 7189442 Фев 19  2009 initrd.img-2.6.26-1-686.bak
 -rw-r--r-- 1 root root 7203085 Апр 15 20:57 initrd.img-2.6.26-2-686
 -rw-r--r-- 1 root root 7196637 Окт 27  2009 initrd.img-2.6.26-2-686.bak
 drwx------ 2 root root   12288 Фев 19  2009 lost+found
 -rw-r--r-- 1 root root  928033 Мар 14  2009 System.map-2.6.26-1-686
 -rw-r--r-- 1 root root  928515 Мар 10 06:12 System.map-2.6.26-2-686
 -rw-r--r-- 1 root root 1506512 Мар 14  2009 vmlinuz-2.6.26-1-686
 -rw-r--r-- 1 root root 1507056 Мар 10 06:12 vmlinuz-2.6.26-2-686

Вот он: config-2.6.26-2-686
теперь копируем его в /usr/src/kernel-2.6.32.3/

 # cp /boot/config-2.6.26-2-686 /usr/src/kernel-2.6.32.3/.config

Запускаем конфигуратор ядра:

 # cd /usr/src/kernel-2.6.32.3
 # make menuconfig

С помощью графического конфигуратора можно отключить или задействовать в виде модулей или встроить в ядро, необходимый код. Предполагается, что пользователь должен ориентироваться что включать, а что отключать.
Выбираем пункт "Load an Alternate Configuration File" и загружаем для правки файл .config , который мы скопировали в текущий каталог.

После конфигурирования, выбираем пункт "Save an Alternate Configuration File" и сохраняем конфиг с тем же именем .config

Шаг 5. Компиляция ядра

Прежде чем приступить собственно к процессу компиляции, следует устранить баг 1), касающийся стандартного компилятора в Debian Lenny. Необходимо отредактировать файл: /usr/src/kernel-2.6.32.3/Documentation/lguest/Makefile и исправить строку:

all: lguest
clean:
 

на

all:
clean:

Если этого не сделать, то где-то в середине компиляции процесс остановится с выдачей ошибки:

 
 make[1]: Leaving directory `/usr/src/linux-2.6.33.1'
 /usr/bin/make    ARCH=i386 \
 			     -C Documentation/lguest
 make[1]: Entering directory `/usr/src/linux-2.6.33.1/Documentation/lguest'
 cc -m32 -Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include -I../../arch/x86/include  -U_FORTIFY_SOURCE    lguest.c   -o lguest
 lguest.c:21:25: error: sys/eventfd.h: No such file or directory
 lguest.c:37:18: error: zlib.h: No such file or directory
 lguest.c: In function ‘create_thread’:
 lguest.c:1027: warning: implicit declaration of function ‘eventfd’
 make[1]: *** [lguest] Error 1
 make[1]: Leaving directory `/usr/src/linux-2.6.33.1/Documentation/lguest'
 make: *** [debian/stamp/build/kernel] Error 2 

Итак, запаситесь терпением (а также чаем, кофем :-), долгожданная компиляция:

 # make-kpkg clean
 # fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image

Здесь, параметр --initrd даёт команду компилятору создать образ виртуальной файловой системы и поместить его в deb-файл для дальнейшей установки ядра через apt. Если не задать этот параметр, то придётся создавать и устанавливать образ вручную.

Процесс компиляции может занять от 4-х часов на Pentium-III до 40…50 минут на Pentium-IV.

Внимание! Помните!
Первое: ЯДРО ДОЛЖНО СОБРАТЬСЯ!
Второе: ЕСЛИ ЯДРО НЕ СОБИРАЕТСЯ - СМОТРИ ПЕРВЫЙ ПУНКТ!

Причин, по которым ядро не собирается достаточно много, но ядро должно собраться, так если СКОМПИЛИРОВАТЬСЯ БЕЗ ОШИБОК. Если оно не собирается - в зависимости от сообщений компилятора об ошибках: меняйте конфигурацию ядра, версию ядра или компилятор.

Если процесс завершился с выдачей ошибки - скопируйте текст ошибки или экран и попробуйте в сети Интернет по искать подобные случаи и устранить причину ошибки.

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

 # make clean

, только затем повторить попытку:

 # make-kpkg clean
 # fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image

Шаг 6. Установка ядра

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

 # dpkg -i /usr/src/linux-image-2.6.32.3_1.0_i386.deb

В итоге инсталлятор:

  • поместит само ядро в /boot в виде файла /boot/vmlinuz-2.6.32.3,
  • поместит образ initrd туда же,
  • недостающие библиотеки поместит по каталогам системы (/lib/modules/2.6.32.3),
  • настроит загрузчик на использование нового ядра, о чем будет свидетельствовать новая строка в меню загрузчика.

На этом, установку ядра можно считать завершённой и смело можно перейти к опробованию - Шаг 7.

Тем же, кто компилировал ядро без параметра --initrd следует произвести дополнительные манипуляции, а именно:

  • вручную создать образ виртуальной файловой системы,
  • произвести настройку загрузчика.
Шаг 6.1. Создание виртуальной файловой системы

Необходимо выполнить:

 # mkinitramfs -o /boot/initrd.img-2.6.32.3_1.0 /lib/modules/2.6.32.3

Утилита создаст образ initrd.img-2.6.32.3_1.0 в каталоге /boot , используя модули нового ядра, находящиеся в каталоге /lib/modules/2.6.32.3

Шаг 6.2. Настройка загрузчика

Теперь необходимо подредактировать конфиг загрузчика Grub /boot/grub/menu.lst с помощью текстового редактора типа Vi, NaNo или встроенного в Midnight Commander. Ищем строки, касательные установленного нового ядра и дописываем к ним путь до образа initrd:

 title		Debian GNU/Linux, kernel 2.6.32.3
 root		(hd0,1)
 kernel		/vmlinuz-2.6.32.3 root=/dev/sda1 ro quiet
 initrd		/initrd.img-2.6.32.3_1.0

 title		Debian GNU/Linux, kernel 2.6.32.3 (single-user mode)
 root		(hd0,1)
 kernel		/vmlinuz-2.6.32.3 root=/dev/sda1 ro single
 initrd		/initrd.img-2.6.32.3_1.0

Возможно путь к корневому разделу у Вас будет отличаться от моего: root=/dev/sda1 и (hd0,1)

Шаг 7. Опробование

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

  • /var/log/syslog
  • /var/log/kernel
  • /var/log/dmesg

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

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

Некоторые примечания
  • Команды начинающиеся с:

# - нужно вводить от имени root`а.
$ - можно вводить от имени обычного пользователя.

  • На всякий случай, перед компиляцией ядра, сделайте резервную копию каталога /boot :
# cp -r /boot /boot.bak

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

  • Шаги с 5…8 выполнялись автором через учётную запись root , поскольку операции производись на домашнем компьютере и автор уверен в своих действиях.
  • Если Вы собираетесь компилировать ядро в каталоге /usr/lib , помните, что права на этот каталог по умолчанию не разрешают запись обычным пользователям, поэтому из под root`a можно изменить права на доступ к каталогу или работать от имени root`а.
  • После установки нового ядра, DVDROM стал обзываться не /dev/cdrom , а /dev/sr0 , что вызвало недоумение программ, привыкших (или настроенных) обращаться к сидирому как к /cdrom . Поэтому, для восстановления автомонтирования к /cdrom необходимо в текстовом редакторе открыть файл /etc/fstab и изменить строку параметров монтирования:
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0

на

/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

Вместо /dev/hda у вас может быть другой путь. В данном случае /dev/hda и /dev/sr0 указывают на привод, подключённый через PATA-интерфейс (hda) на первой (нулевой) шине "мастером".

После этого, сидиром будет монтироваться по классической схеме к /cdrom и /media/cdrom

Смотрите также

1) Решение проблемы с lguest: Блог "Nagilum’s Cookie Jar" http://cakebox.homeunix.net/wordpress/?p=100
Печать/экспорт