Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Приложение А: сборка и установка ядра | Вперед |
Приложения
Приложение А: сборка и установка ядра
В принципе, если вас интересует только обновление версии ядра вашей рабочей системы, то лучший способ сделать это — обновление ядра пакетной системой из репозитария того дистрибутива, который вы используете. Я это делаю, например, для дистрибутивов RedHat / Fedora / CentOS:
# yum list available kernel*
... Доступные пакеты kernel.i686 2.6.32.26-175.fc12 updates kernel-PAE.i686 2.6.32.26-175.fc12 updates kernel-PAE-devel.i686 2.6.32.26-175.fc12 updates ...
... и далее с последующей установкой, и тогда вам не нужно и читать этот раздел. Мы же ниже будем рассматривать ту, реально достаточно редко обоснованную необходимость, когда мы собираем совершенно новое ядро из исходных кодов ядра Linux, например с расширенными отладочными функциями.
Выбор ядра
Берём архив исходных кодов ядра из официального источника: http://www.kernel.org/. Помещаем архив в /usr/src и разархивируем:
$ cd /usr/src
$ ls -l linux*
-rw-rw-r-- 1 olej olej 73632687 Мар 13 13:33 linux-2.6.37.3.tar.bz2
$ tar -jxvf linux-2.6.37.3.tar.bz2
...
Удобно сразу сделать ссылку (как это и рекомендуют) на каталог рабочих исходных кодов, при изменении версии ядра мы сможем только переставлять ссылку:
$ ln -s linux-2.6.37.3 linux
$ cd linux
$ du -hs
479M .
- это объём исходных кодов ядра, мы к нему ещё вернёмся...
Конфигурация
Теперь нам предстоит провести конфигурирование ядра, что должно закончиться созданием файла ./confugure в каталоге исходных кодов. Хорошей идеей будет использовать в качестве начального приближения тот файл ./confugure, по которому собиралось ваше текущее рабочее ядро. Обычно копия этого файл (переменованного с указанием имени ядра) сохраняется в /boot:
$ ls /boot/config*
/boot/config-2.6.18-92.el5 /boot/config-2.6.24.3-1.rt1.2.el5.ccrmart
- в этой системе установлено два альтернативных ядра (два варианта загрузки). Один из этих файлов (разобравшись какой из них соответствует загруженной системе) и файл может быть скопирован под именем ./confugure в каталог исходных кодов.
Перед запуском конфигуратора хорошо сделать очистку каталога от следов предыдущей сборки:
$ make mrproper
На этом этапе вы можете подправить одну (4-я) строку в Makefile, поменяв в ней:
EXTRAVERSION =
на
EXTRAVERSION = myOWN
Это приведет к тому, что сделанное вами ядро (и все сопутствующие файлы) будет называться linux-2.6.37.3-myOWN (то есть конкатенация версии ядра с суффиксом EXTRAVERSION), - так легко различать ваши модификации (и так делают все сборщики дистрибутивов).
Переходим к заданию конфигурации. У нас есть на выбор несколько вариантов целей (в Makefile) для выполнения конфигурации:
$ make xconfig
$ make gconfig
$ make menuconfig
$ make config
$ make oldconfig
Я не вижу оснований, почему имея X11 не пользоваться графическим конфигуратором, но другие альтернативы (из перечисленных) могут быть полезны для малых встроенных конфигураций; выполняем:
$ make xconfig
HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc CHECK qt * Unable to find the QT4 tool qmake. Trying to use QT3 * * Unable to find any QT installation. Please make sure that * the QT4 or QT3 development package is correctly installed and * either qmake can be found or install pkg-config or set * the QTDIR environment variable to the correct location. ... make[1]: *** Нет правила для сборки цели `scripts/kconfig/.tmp_qtcheck', требуемой для `scripts/kconfig/qconf.o'. Останов. make: *** [xconfig] Ошибка 2
Вот так! Уже неоднократно выполняя похожие действия ранее, я попадаю на ошибку выполнения. Потому, что я выполнял это в GNOME, в KDE это, наверное, завершилось бы удачей. Повторяем попытку так:
$ make gconfig
HOSTCC scripts/kconfig/gconf.o ...
Теперь запуск успешен, как это показано на рисунке, и после того, как мы поэтапно пройдём и завершеним графическое конфигурирование, как позано на рисунке, получим сообщение:
# configuration written to .config #
На этом мы имеем сконфигурированное ядро, и можем приступать к его сборке:
$ ls -l .config
-rw-rw-r-- 1 olej olej 120513 Мар 13 17:00 .config
Компиляция
Компиляция ядра — это весьма продолжительная операция, даже на быстром процессоре, я буду показывать сборку на 2-х ядерном процессоре:
$ cat /proc/cpuinfo
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 14 model name : Genuine Intel(R) CPU T2300 @ 1.66GHz stepping : 8 cpu MHz : 1666.000 cache size : 2048 KB ... processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 14 model name : Genuine Intel(R) CPU T2300 @ 1.66GHz stepping : 8 cpu MHz : 1667.000 cache size : 2048 KB ...
Компиляция ядра:
$ time make bzImage
HOSTLD scripts/kconfig/conf .. BUILD arch/x86/boot/bzImage oot device is (253, 0) etup is 14908 bytes (padded to 15360 bytes). ystem is 7420 kB RC e39e9d7b ernel: arch/x86/boot/bzImage is ready (#1) eal 23m33.853s ser 19m2.748s ys 1m48.754s
$ ls -l arch/x86/boot/bzImage
-rw-rw-r-- 1 olej olej 7612704 Мар 13 17:27 arch/x86/boot/bzImage
Этот процесс занял порядка 25 минут.
Компиляция модулей ядра:
$ time make modules
CHK include/linux/version.h ... Building modules, stage 2. MODPOST 2129 modules ... real 100m0.165s user 78m59.427s sys 7m8.274s
Компиляция модулей потребовала в 4 раза больше времени, чем компиляция собственно ядра! Но, как вы видите, всё это занятие — не для слабонервных...
Смотрим объём, занимаемый файлами в каталоге исходных кодов:
$ du -hs
2,6G .
Объём после компиляции увеличился почти на 2Gb (см. цифру ранее). Вот такой объём свободного места должен обязательно быть на диске для успешной компиляции ядра. Обращаю внимание, что все операции до этого места я выполнял без прав root!
Установка
Устанавливаем модули ядра (до и после установки смотрим состояние каталога /lib/modules):
$ ls /lib/modules
2.6.32.9-70.fc12.i686.PAE
$ sudo make modules_install
... DEPMOD 2.6.37.3
$ ls /lib/modules
2.6.32.9-70.fc12.i686.PAE 2.6.37.3
$ cd /lib/modules/2.6.37.3/
$ du -hs
343M .
У нас появился каталог модулей новой версии: /lib/modules/2.6.37.3 . Итоговый размер собранных модулей не такой уж и впечатляющий. Теперь устанавливаем собранное ядро (смотрим при этом содержимое /boot до и после установки):
$ ls /boot
config-2.6.32.9-70.fc12.i686.PAE lost+found efi System.map-2.6.32.9-70.fc12.i686.PAE grub vmlinuz-2.6.32.9-70.fc12.i686.PAE initramfs-2.6.32.9-70.fc12.i686.PAE.img
$ sudo make install
sh /usr/src/linux-2.6.37.3/arch/x86/boot/install.sh 2.6.37.3 arch/x86/boot/bzImage \ System.map "/boot"
$ ls /boot
config-2.6.32.9-70.fc12.i686.PAE System.map efi System.map-2.6.32.9-70.fc12.i686.PAE grub System.map-2.6.37.3 initramfs-2.6.32.9-70.fc12.i686.PAE.img vmlinuz initramfs-2.6.37.3.img vmlinuz-2.6.32.9-70.fc12.i686.PAE lost+found vmlinuz-2.6.37.3
У нас появились 3 новых файла: vmlinuz-2.6.37.3 — ядро, initramfs-2.6.37.3.img — образ начальной загружаемой системы, System.map-2.6.37.3 — таблица символов нового ядра. Инсталляция ядра 2.6.37.3 в моём примере корректно отредактировала файл меню загрузки /boot/grub/grub.conf загрузчика GRUB ... После перезагрузки система стартует с теми установками, с которыми она запускалась раньше:
$ uname -r
2.6.37.3
С загрузчиком GRUB не всегда выходит так гладко, чтобы он сам безошибочно прописал меню стартовых конфигураций. Но это совсем не сложно, и, отчасти, было затронуто в основном тексте, подредактировать стартовое меню /boot/grub/grub.conf под свои вкусы и потребности.
Обсуждение
Мы только что собрали полностью новое ядро Linux, и теперь можем наслаждаться работой в новой, обновлённой до последнего релиза, версии операционной системы. Означает ли это, что такими последовательными обновлениями мы можем поддерживать свою систему в самом свежем состоянии, адекватном новым дистрибутивам? Нет, не означает! Мы таким своим действием обновляем ядро и его модули (драйвера), но версии всех утилит, библиотек, компиляторов и всего прочего у нас остаются устаревшими. Кроме того, через некоторое время у нас начнутся проблемы с репозитариями, указанными пакетной системе для поиска обновлений программ. Отстрочить эту проблему мы можем, аккуратно подредактировав вручную ссылки на репозитарии в каталоге /etc/yum.repos.d ... но это уже совсем другая история.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Приложение Б: Краткая справка по утилите make |