Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра 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