Оригинальная статья находится на CustomKernel (последним исправлял(а) RubenKerkhof (http://fedoraproject.org/wiki/RubenKerkhof)2007-06-04 19:36:13)
Создание ядра из src.rpm
Этот документ содержит инструкции для опытных пользователей, которые хотят пересобрать ядро. Опытные пользователи создают пользовательские ядра, по целому ряду причин :
* Чтобы применить тестовые патчи для испытаний, которые они создают или получают из другого источника
* Для перенастройки существующего ядра
* Чтобы узнать больше о ядре, и разработке ядра.
Перед началом, убедитесь, что в системе имеются все необходимые пакеты, в том числе следующие :
*
rpmdevtools
Прим Полезный набор инструментов для сборки rpm-пакетов. В том числе, позволяет собирать пакеты пользователю без дополнительных настроек.
*
yum-utils
Для установки этих пакетов используйте следующую команду :
Код: Выделить всё
su -c 'yum install yum-utils rpmdevtools'Прим можно скачать отдельно и установить.
Шаг 1 : Получение исходных текстов
!!!Важно!!!
Не собирайте пакеты, как root. Создание пакетов root`ом по своей сути является опасным и не требуется, даже для ядра. Следующие инструкции позволяют обычному пользователю установить и построить ядра из исходных текстов.
1. Подготовка среды построения пакетов RPM в своем домашнем каталоге. Выполните следующую команду :
Код: Выделить всё
rpmdev-setuptreeПрим gpg ключи должны быть сгенерированы, иначе gpg --gen-key или отключите
Код: Выделить всё
# Whether or not to gpg sign modules
%define with_modsign 0в kernel-2.6.spec см ниже
2.
Скачайте ядро kernel-<version>.src.rpm file. <version>. src.rpm. Включите source репозитории с помощью --enablerepo.
Код: Выделить всё
yumdownloader --source kernelПрим можно скачать отдельно я делал именно так так как yum выдал ошибку
3.
Установите необходиме зависимости для исходников ядра:
Код: Выделить всё
yum-builddep kernel-<version>.src.rpmПрим можно скачать отдельно
4.
Установите kernel-<version>.src.rpm с помощью следующей команды:
Код: Выделить всё
rpm -Uvh kernel-<version>.src.rpmЭта команда записывает содержимое RPM в ${HOME}/rpmbuild/SOURSES и ${HOME}/rpmbuild/SPECS, где $ {HOME} ваш домашний каталог. Можно смело игнорировать все сообщения, аналогичный приведенному ниже :
Код: Выделить всё
warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root!!!!Важно
Требуемое пространство. Процесс полного построения ядра требует нескольких гигабайт дополнительное место на файловой системы, содержащий домашний каталог.
Прим у меня он использовал так-же /var/tmp. 3,1G rpmbuild/
1. Подготовьте ядро, используя следующие команды :
Код: Выделить всё
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel-2.6.specИсходные коды ядра расположены в каталоге ~/rpmbuild/BUILD/kernel-<version>/linux- <version>.<arch>
Шаг 2 : Скопируйте исходные коды и создайте обновление
Копия исходного кода, чтобы сохранить подлинное дерево и внесения изменений в копии :
Код: Выделить всё
cp -rv ~/rpmbuild/redhat/BUILD/kernel-2.6.x ~/rpmbuild/redhat/kernel-2.6.x.orig
cp -alv ~/rpmbuild/redhat/kernel-2.6.x.orig ~/rpmbuild/redhat/kernel-2.6.x.new!!!Важно
Вторая комана cp создаст жесткую ссылку .orig и .new,что позволит diff работать быстрее. Большинство текстовых редакторов знают, как разорвать жесткую ссылку правильно, чтобы избежать проблем.
Вносите изменений непосредственно в дерево .new исходного кода, или скопировать в модифицированный файл. Этот файл может исходить от разработчика, который просил испытания, из новейшего ядра, или другое. После модификации .new исходного кода можно создавать патч. Для создания патча запустите diff в отношении всего дерева .new:
*
Код: Выделить всё
cd ~/rpmbuild/redhat/BUILD
diff -uNrp kernel-2.6.orig kernel-2.6.new > ../SOURCES/kernel-2.6-my-new-patch.patch! Дополнительная информация на man-страницах для diff(1) и patch(1).
Прим Мне кажется, тут ошибка каталог /rpmbuild/redhat/ -не существует.
Шаг 3 : Настройка параметров ядра
1. Перейдите в каталог исходных кодов ядра:
Код: Выделить всё
cd ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>/2.
Выберите нужный файл конфигурации из ~/rpmbuild/BUILD/kernel-<version>/linux- <version>.<arch>/configs . Скопируйте желаемый конфигурационный файл в ~/rpmbuild/BUILD/kernel-<version>/linux- <version>.<arch>/.config :
Код: Выделить всё
cp configs/<desired-config-file> .config3. Выполните следующую команду :
Код: Выделить всё
make oldconfig4. Выполните следующую команду, выбора и сохранения желаемых опций ядра :
Код: Выделить всё
make menuconfigПрим Проверяем .config. Он должен начинаться со строки
# i386
Если нет - добавьте ее в самое начало файла. Без этой строки ядро не соберется.
5.
Скопируйте файл конфигурации в ~/rpmbuild/SOURCES/ :
Код: Выделить всё
cp .config ~/rpmbuild/SOURCES/kernel-<version>-<arch>.configШаг 4 : Подготовка spec
1.
Добавте уникальную строку версии spec файле. Это позволит не путать Ваше ядро с дистрибутивным ядром.Найдите строку, которая выглядит примерно так:
Код: Выделить всё
%define release %(R="$Revision: 1.2997 $"; RR="${R##: }"; echo ${RR%%?})%{?dist}2.
Добавте уникального идентификатора перед %{?dist} тегом. Соответствующий идентификатор начинается с "." и позволяет четко различать Ваше ядро и официальное Fedora ядро:
3.
Ваше имя или инициалы, например .Sfw и .Swilliams
4.
Название системы и даты, такие, как .Gandalf20070409
5.
.test , .test001 , или .test20070409.
Код: Выделить всё
%define release %(R="$Revision: 1.2997 $"; RR="${R##: }"; echo ${RR%%?}).test%{?dist}%6.
Перейдите в каталог ~/rpmbuild/redhat/SPECS :
Код: Выделить всё
cd ~/rpmbuild/redhat/SPECS7.
Добавте патч в kernel-<version>.spec, желательно в конец списка всех существующих патчей и четко прокомментируте.
Код: Выделить всё
Patch20002: xen-grant-security.patch
Patch20015: xen-oprofile-on-intel-core.patch
# END OF PATCH DEFINITIONS
# This is my test patch. I should describe it here
Patch30005: kernel-2.6-my-new-patch.patch
...
%patch20002 -p1
%patch20015 -p1
# This is my test patch. I should describe here too
%patch30005 -p1* Две строки были добавлены. В первой объявлен файл
. Patch30005: kernel-2.6-my-new-patch.patch
* Во второй макрос:
%patch30005 -p1
Шаг 5 : Построение нового ядра
Выполните rpmbuild для создания нового ядра:
Код: Выделить всё
rpmbuild -ba --target=`uname -m` kernel-2.6.specПакеты с новыми ядрами будут построены в каталоге ~/rpmbuild/redhat/RPMS .
Прим во время генерации ключа (на экране +++++++) желательно что-нибудь делать - шевелить мышь, переключать рабочие столы и т.п.
Для совместимости
Многие учебные пособия, примеры, и учебники по разработке ядра предпологают, что исходные тексты ядраустановлены в /usr/src/linux/ . Если вы сделаете символическую ссылку, как показано ниже, Вы сможете использовать эти учебные материалы с Fedora пакетами. Установите соответствующий пакет ядра, как это показано выше, а затем выполните следующие команды :
Код: Выделить всё
su -c 'ln -s /usr/src/kernels/<version>.<release>-<ar ch> /usr/src/linux'Введите пароль суперпользователя при запросе.
Шаг 6 : Установка нового ядра
Для установки нового ядра, используте rpm -ivh , не -U , --upgrade :
Код: Выделить всё
rpm -ivh ~/rpmbuild/redhat/RPMS/i686/kernel-<vers ion>.<arch>rpmСборка только модулей ядра
Не нужно скачивать и пересобрать ядро, чтобы построить модуль. Для создания модуля текущего исполняемого ядра достаточно пакета kernel-devel. Выполните следующую команду для установки kernel-devel,используя yum.
Код: Выделить всё
su -c 'yum install kernel-develНапример, чтобы собрать модуль foo.ko, создайте следующий Makefile в каталоге, содержащем файл foo.c :
Код: Выделить всё
obj-m := foo.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modulesЗатем выполнить make, чтобы собрать модуль foo.ko.
Прим перед $(MAKE) табуляция
Прим rpmbuild по умолчанию собирает все возможные варианты пакетов для данной архитектуры, как правило все они не нужны и можно собрать только
нужные исправив spec файл.
Мне не удалось понять правильный синтаксис .rpmmacros для изменения флагов оптимизации . Буду признателен за информацию об этом.