Журнал LinuxFormat - перейти на главную

LXF99:Hardcore Linux

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Ядро: Заделай свое сам.

Заплатки могут привести к революции в системе, повысив эффективность взаимодействия ее частей. Полковник Ник Вейч отдает приказ о выдвижении…


Разработчики ядра – очень талантливые и замечательные люди (это они просили нас так сказать), так почему же вы недовольны кристальной чистотой типового ядра, выходящего из недр штамповочной машины на http://www.kernel.org? Прямо и не знаю... пойдем дальше, тут разбирать нечего... Ой. Погодите минутку. Ведь в жизни очень мало машин с Linux, где запущено чистое типовое ядро. Причина? Все популярные дистрибутивы латают ядра сами.

Они так поступают не потому, что им нечего делать, а потому что есть функции, внедрения которых они просто не могут ждать (или ошибки, оставлять которые нельзя). Многие из этих заплаток сконцентрированы вокруг проблем с производительностью, драйверами и файловыми системами, а многие внедряются в дистрибутивы собственными хакерами ядра, чей код не приняли в основную ветку разработки.

Идя путем сугубо личной настройки, можно добраться до самых разных мест. Например, при попытке загрузить ядро для Mandriva вам предоставят выбор из 55 (!) вариантов. Некоторые из них отличаются разными заплатками (например, специально для ноутбуков или для меньшей латентности настольных приложений), а некоторые просто имеют разные конфигурации ядра. Какие бы причины ни побудили создателей вашего дистрибутива добавить заплатки, безусловно, это дает достаточно оснований для вас сделать то же самое!


Часть 1 Латаем ядро Ubuntu/Debian

Как мы уже сказали, вы заметите, что стандартное ядро большинства дистрибутивов Linux, как правило, изрядно перелатано, и Ubuntu – не исключение из этого правила. Чтобы все работало надежно, нужно получить новейший пакет с исходными кодами для ядра. Вы можете узнать, какое у вас стоит ядро, выполнив команду

 uname -r

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

Добудьте текущие исходники из вашего репозитория, например, так:

sudo apt-get install linux-source-2.6.20 kernel-package
libncurses5-dev fakeroot

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

Теперь, чтобы сэкономить на наборе команд, нам надо стать суперпользователем. Легче будет воспользоваться таким коварным приемом:

sudo bash

Это позволит нам избежать необходимости ставить sudo в начале каждой строки. Исходники ядра, как обычно, хранятся в /usr/src/, но Ubuntu немного ленив и не утрудился извлечь их для нас. Сделаем это сами:

cd /usr/src
tar xvjf linux-source-2.6.20


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

rm -f linux
ln -s linux-source-2.6.20-17 linux
cd linux

Кроме того, было бы полезно использовать текущий файл конфигурации для этого ядра. Таким образом мы можем убедиться, что мы по крайней мере, начинаем с конфигурации, которая работает! Ubuntu хранит конфигурацию в директории /boot/, поэтому просто скопируйте соответствующий файл:

cp /boot/config-2.6.20-17 ./.config

Теоретически, теперь можно собрать ядро, но оно, естественно, получится таким же, какое было – проку от этого немного. На самом деле мы хотим наложить кое-какие заплатки.

Применение заплаток

Ядра Ubuntu и Debian не слишком различаются. Большинство кода, специфического для Ubuntu, гуманно отделено в подкаталог ubuntu; это несколько упрощает нашу задачу. А то, что мы сейчас делаем, латая непосредственно исходники ядра, применимо почти к любому дистрибутиву или типовому ядру с http://www.kernel.org, так что этот этап достаточно общий.

Прежде чем браться за дело, вы должны уяснить, что латание исходников ядра – штука достаточно проблематичная. Бывает, что заплатки не приходятся ко двору, а иногда – что, возможно, даже хуже – оказываются успешны лишь частично. По возможности (т.е. при наличии места на диске), прежде чем пускаться в исправления, хорошо бы клонировать «хорошее» дерево исходного кода в другой каталог. Если все пойдет до ужаса наперекосяк, вы просто вернете чистую копию.

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

Скачайте заплатку, скопируйте ее прямо в директорию /usr/src/linux и распакуйте (обычно это текстовый файл, сжатый gzip или bzip). По причинам, аналогичным приведенным ранее, можете сохранить загруженные заплатки где-нибудь еще, на случай если вам придется обновить эту директорию. Теперь протестируйте заплатку:

patch -p1 - - dry-run < patchfile-2.6.20

Вы получите вывод на консоль прогресса наложения заплатки и список всех сбоев. Он должен выглядеть примерно так:

patching file drivers/block/Kconfig
Hunk #1 succeeded at 464 (offset 8 lines).
patching file drivers/block/Makefile
patching file drivers/block/fcache.c
patching file fs/ext3/super.c
Hunk #3 succeeded at 709 (offset 40 lines).
Hunk #4 succeeded at 758 (offset 40 lines).
Hunk #5 succeeded at 786 (offset 40 lines).
Hunk #6 succeeded at 1089 (offset 40 lines).
Hunk #7 succeeded at 1446 (offset 40 lines).
Hunk #8 succeeded at 1454 (offset 40 lines).
Hunk #9 succeeded at 1533 (offset 44 lines).

Вам нужно проследить за строками, которые выглядят примерно так:

patching file mm/filemap.c
Hunk #1 succeeded at 454 (offset 20 lines).
Hunk #2 succeeded at 857 with fuzz 1 (offset 64 lines).
Hunk #3 FAILED at 1078.

Почему произошел сбой? Обычно из-за несовместимости заплаток, особенно если вы используете ядро, которое латали до вас. Иногда можно вычислить, почему заплатка слетает (вы можете увидеть сообщение о сбое, уже неплохо для начала). Ошибочные заплатки генерируют файл *.rej, там перечислен список кусков [“hunks”] кода, где имел место сбой.


У нас нет способа объяснить вам, что идет неправильно, но анализ файла .rej даст здесь пищу для ума. Часто бывает, особенно в случае заголовочных файлов, что из-за добавления новых определений (возможно, другой заплаткой), сместилась предполагаемая начальная точка вашей заплатки. Такие вещи легко исправляются ручным редактированием. Убедившись, что заплатка работает, примените ее:

patch -p1 - - dry-run < patchfile-2.6.20

Если наложение прошло нормально, следующим шагом должно быть конфигурирование ядра. Запустите make xconfig или другое приложение, которое вы используете, чтобы настроить исходный код ядра. Конфигурация теперь может включать новые опции, в зависимости от установленных заплаток. Так как вы скопировали config для немодифицированного ядра, вам придется найти и вручную установить требуемые опции, в зависимости от примененной заплатки. Подобные опции имеют не все заплатки, но многие.

Когда конфигурации завершена и записана, следующий шаг – собрать пакет. Для этого просто выполните следующие команды:

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-cust kernel_
image kernel_headers

Часть --append-to-version позволит отличить ваше самодельное творение от реальных версий пакетов из релиза – что очень упрощает жизнь, поверьте.

Этот шаг отнимает очень много времени (если только у вас не суперЭВМ), а в итоге вы получите два пакета: в одном – ядро, в другом – заголовочные файлы. Установите оба, командами

dpkg -i linux-image-2.6.20.xx-cust.xxxxx.deb
dpkg -i linux-headers-2.6.20.xx-cust.xxxxx.deb

Они заодно позаботятся о записи новых строк в загрузчик grub, сделав ваше ядро рабочим. Осталось только перезагрузиться, не позабыв выбрать новое ядро в загрузочном меню – а теперь надейтесь, что оно и вправду заработает!

Часть 2 Латаем ядро Fedora

В старые времена, Red Hat Linux и даже ранние версии Fedora компилировали ядро «обычным» способом: вы загружали пакет kernel-source, который сваливал все необходимое для сборки Fedora-совместимого ядра в директорию /usr/src/kernel-2.xx.xx/.

Однако, это, в некотором роде, не имело смысла, так как для правильной сборки ядра на RPM-системе важно, чтобы версия ядра была известна базе данных RPM (в целях соответствия модулей и т.д.). И если вы хотите собрать исправленное ядро Fedora, единственно верный способ сделать это – добраться до rpm-пакета с его исходниками (например, kernel-2.x.x.i386.src.rpm).

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

 yum install fedora-rpmdevtools

Она просто установит последнюю версию инструментов построения rpm для Fedora – скриптов, макросов и команд, используемых при генерации rpm из файла spec и исходного кода – а также очень полезный для нас скрипт, который создаст директории, необходимые для сборки ваших доморощенных файлов, потому что использовать для этого «реальные» директории rpm/usr/src/redhat) – не очень хорошая идея. Затем, переключившись на обычную учетную запись пользователя, введите команду

 fedora - buildrpmtree

что создаст копию каталога /usr/src/redhat/ для сборки rpm-файлов под именем rpmbuild, поместив ее в домашний каталог пользователя.


Следующий этап – извлечение rpm-файла ядра, используемого Fedora. Вы должны найти его в дереве исходников вашего зеркала Fedora или репозитория (увы, из yum его установить нельзя). Скачайте этот файл в учетную запись пользователя. Как правило, в Fedora пользователям не дозволяется устанавливать rpm, но так как у вас установлены инструменты сборки и имеется корректное дерево, то при установке rpm-файла все, что полагается, попадет в директорию rpmbuild.

rpm -ivh kernel-2.6.21-3913.fc7.src.rpm

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

Теперь ваша директория rpm содержит все необходимые файлы. Вы обнаружите, что файл spec для ядра создан в rpmbuild/SPECS, а исходники ядра – в SOURCES, вместе со всеми файлами примененных к нему заплаток (поскольку практически все дистрибутивы не пользуются типовым ядром).

Выбираем заплатку

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

Переименуйте ваш файл заплатки должным образом и поместите его в каталог SOURCES к другим заплаткам.

Чтобы применить заплатку для ядра, нужно включить ее в файл спецификации пакета. Итак, сдуйте пыль с вашего любимого текстового редактора и откройте файл kernel.spec. Найдите раздел с заплатками, который начинается с Patch1: xxxxx. Существует определенный порядок наложения заплаток, и вам нужно прочитать соответствующие примечания и убедиться, что вы добавили запись в нужную часть файла.

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

Applypatch kernel2.6-23.make-things-work.patch

Вводите собственные строки в правильной последовательности: например, если ваша заплатка 4005, ее нужно ввести после строки patch4004.

Вы должны также вернуться к началу файла и изменить строку, начинающуюся с

#% define buildid .local


Удалите # и поставьте что-то вместо .local (но начинающееся с .). Это будет расширение, используемое в имени нового ядра и помогающее отличить его от стандартного. В этом пункте стоит протестировать сборку, чтобы убедиться, что все работает: команда

rpmbuild -bp kernel-2.6.spec

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

Следующий шаг – сконфигурировать ядро. Вы сможете найти его исходные коды в директории ~/rpmbuild/BUILD/kernel-xxx/kernel-xxx/. Перейдите туда и скомандуйте

make xconfig

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

make rpm

Эта команда создаст rpm-пакеты как с исходными кодами, так и с двоичными файлами, которые вы найдете в директории rpmbuild/RPMs/i386/, если не укажете другую архитектуру. Можете использовать обычные инструменты RPM для их установки! LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика