Debian-Kernel-Build-Howto (Kernel 2.6)


Вернуться к Оглавлению

 

Автор: Andrey Rjavskov(Rzhavskov) as rjaan <rjaan@yandex.ru>


Вместо предисловия

Заканчивался июль месяц 2010 года, когда меня один мой знакомый попросил помочь разобраться почему у него из 6-ти COM-портов UART 16550A только видны четыре. Ему было невдомек, что количество портов прописывается в конфигурации ядра. К коиму мной и был направлен, но так как у него стоял на тот момент тестируемый Debian 6.0 Squeeze, то было решено скачать пакет исходника ядра и собрать из него новый пакет с его образом. И, чтобы ему долго и мучительно не нужно было разъяснять, что где и откуда брать, была написана эта хаутушка, которая решила все его проблемы.

Хочу обратится к читателям, кто будет читать эту статью после стабилизации Squeeze, которая, как надеется автор этой статьи, уже произошла в августе 2010 года. Некоторые ошибки в разрешении зависимостей через apt-get build-dep до сборки пакета исходного кода ядра linux-2.6 могут быть устранены разработчиками. Поэтому не удивляйтесь, если установка пакетов libncurses5-dev, zlib1g-dev и kernel-package не потребуется.

А теперь давайте перейдем к самому процессу установки...

Процесс установки

Устанавливаем пакет с исходным кодом ядра linux-2.6 в директорию /usr/src .

# cd /usr/src
# apt-get source linux-2.6

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

#apt-get build-dep linux-2.6

Хорошей идеей будет взять конфигурацию вашего рабочего ядра ветки 2.6, которое грузится при старте системы. Его можно взять из директории /boot, в которой она находится, например /boot/config-2.6.32-5-686. Соответственно, мы должны загрузить эту конфигурацию и сделать в ней необходимые изменения.

# cp /boot/config-2.6.32-5-686 /usr/src

Вызываем меню конфигурации ядра.

# make clean
# make menuconfig

Единственное, что мне пришлось сделать, так это установить пакет libncurses5-dev, который содержит заголовочные файлы библиотеки ncurses и пакет zlib1g-dev — библиотеки zlib(сжатия ядра), используемые для сборки программы конфигурации ядра. После стабилизации squeeze будем надеяться, что проблемы связанные с разрешением зависимостей с apt-get build-dep будут устранены, а эти пакеты будут устанавливаться автоматически.

# apt-get install libncurses5-dev zlib1g-dev

После чего, теперь мы можем сделать все необходимые изменения, вызвав menuconfig . Обращаю Ваше внимание, что перед тем как вызвать меню конфигурации ядра, вам нужно будет перейти в корень директории /usr/src/linux-2.6-2.6.32, куда были распакованы исходные коды ядра.

# cd /usr/src/linux-2.6-2.6.32

Теперь загружаем конфигурацию нашей рабочей версии ядра linux-2.6, которую мы сохранили ранее в /usr/src. Для этого, на главной странице меню выбираем «Load an Alternate Configuration File» и указываем полный путь до новой конфигурации. Затем, делаем необходимые изменения.

В моем случае, оказалось, что из 6-ти COM-портов c UART 16550A на установленном у моего друга PCI-контроллере, видны только три. Это обусловлено тем, что по-умолчанию для UART 16550A выставлено ограничение, равное четырем портам. Поэтому, мне потребовалось зайти в меню и изменить его на 7, так как нужно учитывать 1 COM-порт на системной плате, который обычно имеет реализацию UART 16550A.

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

Выполняем ряд команд, которые необходимо выполнить для сборки ядра и бинарного пакета. Но перед этим Вам будет необходимо до установить один пакет несмотря на выполненный ранее apt-get build-dep.

# apt-get install kernel-package

Затем, выполняем команды в той последовательности, в которой они показаны.

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

dpkg-deb: сборка пакета linux-image-2.6.32 в файл ../linux-image-2.6.32_custom.1.0_i386.deb.
make[2]: Leaving directory `/usr/src/linux-2.6-2.6.32'
make[1]: Leaving directory `/usr/src/linux-2.6-2.6.32'

Перемещаемся в /usr/src и устанавливаем собранный нами пакет с ядром linux-image-2.6.32_custom.1.0_i386.deb.

# cd /usr/src
# dpkg -i linux-image-2.6.32_custom.1.0_i386.deb
Выбор ранее не выбранного пакета linux-image-2.6.32.
(Чтение базы данных ... на данный момент установлено 175448 файлов и каталогов.)
Распаковывается пакет linux-image-2.6.32 (из файла linux-image-2.6.32_custom.1.0_i386.deb)...
Done.
Настраивается пакет linux-image-2.6.32 (custom.1.0) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.32 /boot/vmlinuz-2.6.32
run-parts: executing /etc/kernel/postinst.d/pm-utils 2.6.32 /boot/vmlinuz-2.6.32
run-parts: executing /etc/kernel/postinst.d/update-notifier 2.6.32 /boot/vmlinuz-2.6.32
Running postinst hook script update-grub.
Generating grub.cfg ...
Found background image: moreblue-orbit-grub.png
Found linux image: /boot/vmlinuz-2.6.32-5-686
Found initrd image: /boot/initrd.img-2.6.32-5-686
Found linux image: /boot/vmlinuz-2.6.32
Found initrd image: /boot/initrd.img-2.6.32
done

Как мы видим из дампа при инсталляции пакета linux-image-2.6.32_custom.1.0_i386.deb, все за нас сделал dpkg в части инсталляции и установки образа второга ранга boot-загрузки initrd и добавил наш с вами новый образ ядра и initrd в конфигурацию загрузчика Grub. Поэтому, по хорошему, нам только остается выполнить reboot и пробовать с него загрузиться.

И напоследок оставляю фрагмент из файла /boot/grub/grub.cfg, который как вы могли догадаться привожу для Grub версии 1.98 .

menuentry 'Debian GNU/Linux, with Linux 2.6.32' --class debian --class gnu-linux --class gnu --class os {
      insmod part_msdos
      insmod ext2
      set root='(hd1,msdos3)'
      search --no-floppy --fs-uuid --set f2f5e63b-e308-48ff-8de1-a2fd7bf3757f
      echo 'Loading Linux 2.6.32 ...'
      linux /vmlinuz-2.6.32 root=UUID=bb2fd89d-7a36-452c-9b2e-f28ad6077243 ro quiet
      echo 'Loading initial ramdisk ...'
      initrd /initrd.img-2.6.32
}
menuentry 'Debian GNU/Linux, with Linux 2.6.32 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
      insmod part_msdos
      insmod ext2
      set root='(hd1,msdos3)'
      search --no-floppy --fs-uuid --set f2f5e63b-e308-48ff-8de1-a2fd7bf3757f
      echo 'Loading Linux 2.6.32 ...'
      linux /vmlinuz-2.6.32 root=UUID=bb2fd89d-7a36-452c-9b2e-f28ad6077243 ro single
      echo 'Loading initial ramdisk ...'
      initrd /initrd.img-2.6.32
}

Библиография

  1. Debian-Kernel-Compile-Howto (Kernel 2.6)
  2. Hidden Linux : agt-get secrets

 

Вернуться к Оглавлению


Copyright © 2010 rjaan as Andrey Rjavskov(Rzhavskov) <rjaan@yandex.ru> <arjavskov@gmail.com>



Сайт создан в системе uCoz