среда, 19 августа 2009 г.

Компиляция ядра Linux




Приходилось проделывать данную операцию. Неплохая статья. Источник, кажется, Opennet.

1. Качаем

Для начала нужно выкачать само ядро [точнее исходники] с сайта http://www.kernel.org

Качайте архив tar.bz2 - он меньше по размеру. Имя файла должно быть примерно таким - linux-2.6.0.tar.bz2 , размер файла около 33 Мбайт. Качайте всегда последнее стабильное ядро.

Если у вас уже есть ядро 2.6.0. , а вам нужно поставить например 2.6.2, то необязательно качать снова 33 Мбайта, можно выкачать заплатки [их также называют еще "патчи", но давайте говорить на русском] и обновить исходники вашего ядра до последней версии. В таком случае вам нужно выкачать все заплатки по возрастанию номеров версии от вашей версии до последней. В данном примере это заплатки 2.6.1 и 2.6.2. Файлы заплаток называются так - patch-2.6.1.bz2 . Их может не быть на главной странице , поищите их на ftp сервере.

Кроме самого ядра нам возможно понадобится выкачать дополнительные заплатки, расширяющие возможности ядра. К примеру, в ядре 2.6 нет поддержки lirc (пульты дистанционного управления). Чтобы эта поддержка была, на ядро нужно наложить соответствующую заплатку.

Для примера возьмем такие заплатки:

1. bootsplash (графическая загрузка Линукса) с http://www.bootsplash.org
2. win4lin (для одноименной программы эмуляции windows) http://www.netraverse.com
3. lirc (поддержка устройств с ПДУ) - на официальном сайте http://www.lirc.org заплаток нет но вы можете их найти с помощью> http://www.google.ru по имени файла

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

1. linux-2.6.0.tar.bz2
2. patch-2.6.1.bz2
3. bootsplash-3.1.3-2.6.0-test9.diff
4. Kernel-Win4Lin3-2.6.0.patch и mki-adapter26_1_3_3.patch
5. patch-lirc-20031219.diff

Хорошо. Теперь подготовим папку, где будем собирать ядро. В Линуксе для сборки из исходников есть специальный каталог /usr/src. Однако по умолчанию писать туда рядовому пользователю запрещено, поэтому сначала дадим себе права. Самый простой способ - запустить консоль, получить права root и командой chmod разрешить всем запись.

[mike@localhost mike]$ su -
Password:
[root@localhost root]# chmod a+w /usr/src
[root@localhost root]#

Копируем исходники ядра ( linux-2.6.0.tar.bz2) в папку /usr/src

Теперь их надо распаковать. Если вы пользуетесь файловым менеджером mc, на файле нажмите F2, а потом "x". Если вы пользуетесь файловым менеджером gentoo (http://linux.alhimia.ru/projects/gentoo/), то щелкните правой кнопкой и выберите Действия - РаспаковатьСюда.

Получился каталог linux-2.6.0. Переименуйте его, например, в linux-2.6.1-my

Копируем все заплатки туда и переходим к следующему пункту.
3 Компилируем
3.1 Подготовка

Для начала давайте посмотрим файл Makefile. Нас интересуют первые 4 строчки

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 1
EXTRAVERSION =
...

Измените четвертую строку на

EXTRAVERSION = my

Это приведет к тому, что сделанное нами ядро будет называться linux-2.6.1-my. Если нам нужно будет несколько вариантов ядра 2.6.1, то можно снова изменить строчку EXTRAVERSION=my2, скомпилировать ядро еще раз и получить ядро linux-2.6.1-my2. ,что позволит при загрузке выбирать вариант ядра.
3.2 Чистка

Запустите команду make mrproper

[mike@localhost linux-2.6.1-my]$ make mrproper
RM $(CLEAN_FILES)
Making mrproper in the srctree
RM $(MRPROPER_DIRS) + $(MRPROPER_FILES)
[mike@localhost linux-2.6.1-my]$

Эта команда нужна для удаления временных файлов, созданных при предыдущей сборке. Она удаляет также все настройки, которые вы сделали во время прошлой сборки. (Настройки лежат в файле .config, если есть желание перенесите куда-нибудь этот файл, выполните чистку, а потом верните обратно)
3.3 Настройка ядра.

А вот сейчас начинается самый ответственный момент, от которого зависит успех всего мероприятия. Здесь нужно знать хотя бы немного английский и знать начинку компьютера. Для начала немного теории.

Ядро может быть монолитным, а может быть модульным. Что это означает? Монолитное ядро - это просто один файл, который грузится при старте системы, и сидит в оперативке до выключения компьютера. Те возможности, которые заложены в этом файле, не подлежат изменению. Если включить все возможности в ядро, получаем очень большое и очень медленное ядро. Если сделать маленькое и быстрое ядро, то придется пожертвовать возможностями. Кроме того с таким ядром не смогут работать такие коммерческие программы как Win4Lin . На таком ядре не поставить драйвер видеокарты от фирмы Nvidia, что ставит крест на использовании этих ядер на домашних игровых компьютерах с этими видеокартами. В чем же преимущество монолитного ядра? Оно хорошо своей более высокой защищенностью и более простым использованием. При старте ядро обладает всеми возможностями, которые в него заложены. Ядро в этом случае располагается в каталоге /boot и имеет имя vmlinuz-xxxx.

Модульное ядро - это тоже же файл, который грузиться при загрузке с диске как и в случае с монолитным ядром, но плюс к есть нему набор файлов, которые называются модулями. Эти файлы по сути - возможности ядра, которые вы можете подключить к ядру и отключить от него без перезагрузки компьютера. Ядро которое у вас поставилось вместе с дистрибутивом - модульное. В модульном ядре все возможности, которые могут быть выведены в отдельный файл, т.е. модуль, - делаются модульными. Самый большой плюс модульного ядра - то что в него можно включить абсолютно все возможности, на что может ядро, все устройства, все файловые системы и т.п. Ядро в результате получается небольшим (в оперативной памяти) , быстрым и гибким. Минусы такого подхода - собственно в необходимости работы с модулями, вы не получите возможности модуля, пока его не загрузите. К счастью, большинство модулей грузиться автоматически, а остальные грузятся при старте системы загрузочными скриптами, избавляя вас от необходимости грузить вручную десятки модулей. В этом случае ядро представлено тем же файлом /boot/vmlinuz-xxxx и содержимым каталога /lib/modules/<версия ядра>. Кроме того модульному ядру нужен специальный образ загрузки т.н. initrd. Этот образ содержит все необходимые модули которые позволяют ядру загрузить ситему. Без этих модулей оно неспособно подключить системный раздел жесткого диска и прочитать файлы. Initrd файл располагается в каталоге /boot и имеет имя initrd-xxxx.

Где же истина? Как всегда, посередине. Какие-то возможности вы включаете в ядро, какие-то делаете модулями. Какие именно? Те возможности которые вам нужны постоянно - включаете, например драйвер жесткого диска, на котором лежит система. Если к вам приходит друг раз в месяц со своей usb фотокамерой - делайте драйвер usb и камеры модулями. Если сомневаетесь, нужна ли вам та или иная особенность - ставьте модулем. Посмотреть какие модули сейчас загружены в систему вы можете командой lsmod

Если ваш дистрибутив собран для 2.4 ядра (например АСПЛинукс 9.0), то у вас могут быть проблемы с загрузкой модулей, связанные с тем что в 2.6 изменились названия модулей. Поэтому я рекомендую включать все, что вам точно необходимо, в ядро.

Итак, настройка производится на выбор одной из четырех команд

1. make xconfig
2. make menuconfig
3. make config
4. make oldconfig

Первый вариант для пользователей, у которых есть графика - у вас запустится графическая программка для настройки, остальные - для консоли. Второй вариант предлагает текстовые меню для настройки. Третий задает 1000 и 1 вопрос. Четвертый нужен если у нас уже есть сформированный файл настроек .config (можно использовать файл настроек от старого ядра), при этом варианте задаются только те вопросы которые появились в этой версии ядра. Первый вариант нам наиболее симпатичен. Итак вперед!

Если вы хотите возможность оформить модулем ставьте точку (m для консоли), Если включить в ядро галочку (* или y)

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

сохраняются в файле .config (скрытый). В будущем, если вы будете переходить на следующую версия ядра, вы может после установки заплаток скопировать этот файл в каталог с исходниками ядра и выполнить в консоли команду make oldconfig. В этом случае вам не придется отвечать на все эти вопросы, вам будут заданы вопросы только по новым возможностям.
3.4 Сборка и установка

Теперь осталось собрать ядро. Процесс сборки и установки ядра можно выполнить одной командой (от пользователя root)

make bzImage modules modules_install install

а можно разбить на несколько этапов

от простого пользователя:
make bzImage
(собрать ядро)
make modules
(собрать модули

от пользователя root:
make modules_install
(установить модули)
make install
(установить ядро)

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

от простого пользователя:
make bzImage modules

от root:
make modules_install install

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

Если вы слишком увлекаетесь заплатками, то ядро может и не собраться (на определенном этапе сборка прервется и вы увидите код ошибки). В этом случае вам придется либо отключать модули на которых происходит ошибка, либо повторять все сначала уже с меньшим кол-вом заплаток. Если у вас ядро без заплаток не желает компилироваться, то это говорит о неправильной установке дистрибутива, либо нехватки компилятора или библиотек. Попробуйте установить дистрибутив в режиме "Разработка" (не забудьте добавить КДЕ и другие пользовательские программы). Дистрибутивы ALT Linux Junior и ASPLinux ChipEdition - на самом деле не дистрибутивы, а, говоря интеллигентно, демо-версии, поэтому не удивляйтесь, если у вас ничего не выйдет.

Когда ядро будет собрано, у вас должны появиться следующие файлы

/boot/vmlinuz-2.6.1-my
/boot/System.map-2.6.1-my
/boot/initrd-2.6.1.img
и каталог модулей
/lib/modules/2.6.1-my

Ядро установлено, теперь надо настроить загрузчик.
4. Настройка загрузчика

После установки ядра, как правило, автоматически настраивается и загрузчик, если этого не произошло или вы хотите подправить что-либо, то читайте дальше

Три самых распространенных загрузчика

1. LILO
2. GRUB
3. ASPLoader

Первый из них - это самый старый (но это не значит самый обделенный возможностями). Отличается хорошей надежностью и большими возможностями.

GRUB - самый мощный по возможностям загрузчик. Очень хорош.

У ASPLoader есть две оригинальные особенности - поддержка мыши и простота. Однако дизайн у него уж больно смахивает на маздаевский. Да и по возможностям слабоват.

Если у вас установлен АСПЛинукс, то после установки ядра grub будет затерт ASPLoader'ом. Вам надо будет заново установить grub.

!!! Никогда не удаляйте настройки старого ядра, это может привести к невозможности загрузки системы обычным образом, если сделанное вами ядро не работоспособно !!!
4.1 Настройка ASPLoader

1. Для начала подправьте файл настроек

Он расположен в файле /etc/aspldr.conf

[linux1062672691@Linux(2.6.1-my)]
icon linux
kernel /boot/vmlinuz-2.6.1-my root=/dev/hda5 hdc=ide-scsi vga=791 splash=silent
initrd /boot/initrd-2.6.1-my.img

[SEPARATOR]

[asplinux1@ASPLinux(2.4.20-9asp)]
icon linux
kernel /boot/vmlinuz-2.4.20-9asp root=/dev/hda5 ro
initrd /boot/initrd.2.4.20-9asp.img

Если вы не используете initrd (все драйверы необходимые для загрузки системы включены в ядро и bootsplash не используется), тогда соответствующую строчку можно удалить

2. Дайте команду aspldr для записи изменений в загрузчик

Для дополнительной информации смотрите man aspldr.conf
4.2 Настройка GRUB

1. Подправьте файл настроек

/boot/grub/grub.conf

title linux-2.6.1-my
kernel /vmlinuz-2.6.1-my root=/dev/hda5 hdc=ide-scsi vga=791 splash=silent
initrd /initrd-empty.splash
boot

title linux-2.4.20
kernel /vmlinuz-2.4.20-9asp root=/dev/hda5
initrd /initrd.2.4.20-9asp.img
boot

2. Если у вас установлен АСПЛинукс, то после установки ядра grub в MBR будет затерт ASPLoader'ом. Вам надо будет заново установить grub. Под пользователем root введите в консоли

grub
grub> root (hd0,0) (/boot раздел расположен на первом разделе первого жесткого диска)
Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0) (записать загрузчик в MBR первого жесткого диска)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded... succeeded
Running "install /grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.

grub> quit

Подробнее о настройках grub смотрите info grub
5. Доводка вашего дистрибутива.

Перед тем как загрузиться с ядра 2.6 необходимо подправить некоторые вещи в нашем дистрибутиве. (Имеется в виду дистрибутив АСПЛинукс 9.0)

Первое, нужны новые утилиты для работы с модулями - modutils. Вы их можете найти с помощью ресурса http://www.rpmfind.net. Качайте последнюю версию для RedHat (Fedora).

Для установки пакетов нужно под пользователем root ввести команду

rpm -Uhv <имя файла rpm>

Второе, загрузочные скрипты ошибочно отключают автозагрузку модулей.

Для этого в файле /etc/rc.d/rc.sysinit найдите следующие строки

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null && [ -f /proc/ksyms ]; then
USEMODULES=y
fi

и переделайте их к виду

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null ; then
USEMODULES=y
fi

Кроме этого, возможны проблемы с подключением модулей, которые имеют разные названия в версиях ядра 2.4 и 2.6. В этой ситуации помогает включение этих модулей в ядро.

На этом все. Добро пожаловать в Линукс 2.6!

Комментариев нет:

Отправить комментарий