Kernel/build for dummies

Материал из ALT Linux Wiki

Сборка ядра для чайников на примере Unbrekable Enterprise kernel для p6

Q: Зачем?

A: А вдруг тут правду написали http://www.opennet.ru/opennews/art.shtml?num=33344 .

Курим документацию:

  1. file:///usr/share/doc/kernel-build-tools-0.99.1/README.ru.html
  2. http://www.altlinux.org/Kernelnotes/mike

Установим инструменты:

$ apt-get install git gear kernel-build-tools

Скачать скрипт http://www.altlinux.org/Файл:Git-empty-branch.sh и сохранить как ~/bin/git-empty-branch

подготовка окружения kernel-build-tools

$ mkdir ~/kernel-build && cd ~/kernel-build

Собирать будем по корану, т.е. используя hasher

$ mkdir hasher kernel
$ cp /usr/share/doc/kernel-build-tools-*/config.sh.sample config.sh
$ echo 'hsh_workdir=${HOME}/kernel-build/hasher' > config.sh

подготовка git репозитария с исходниками ядра

Согласно корану пакеты с ядрами именуются согласно шаблону kernel-image-$flavor. kernel-build-tools для сборки требует наличие в git репозитарии локального бранча с именем kernel-image-$flavor. Далее быдем использовать flavor=el-uek.

$ cd ~/kernel-build/kernel

создадим пустой репозитарий

$ git init

создадим пустой бранч, из которого будем собирать наше ядро:

$ git-empty-branch kernel-image-el-uek

с чистой совестью проигнорируем уведомление о невозможности удаления .git/index.

Добавим репозитарии с исходниками ядер vanila и uek

$ git remote add vanila git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
$ git remote add oracle git://oss.oracle.com/git/linux-uek-2.6.39.git

проверить что мы добавили можно командой

$ git remote -v

Oracle собирая uek2 взяли за основу vanila kernel v3.0 и изменили название версии ядра, поэтому их ядро имет версию якобы 2.6.39. Это сделано для разлиной проприетарщины которая не понимает новую нумерацию версий ядра.

Скопируем бранч исходников linux-v3.0 как kernel-source:

$ git fetch vanila linux-3.0.y:kernel-source

Аналогично поступим с исходниками от oracle:

$ git fetch oracle master:kernel-source-uek

Проверяем:

 $ git branch
  * kernel-image-el-uek
    kernel-source
    kernel-source-uek


Сливаем все в кучу:

$ git merge -s ours kernel-source
$ git merge -s ours kernel-source-uek

Cоздаем или попируем файлы kernel-image.spec config-x86_64 config-i586 kernel-image.spec логично взять из репозитария aspsk@ и использовать в качестве шаблона для uek. Не забиваем на:

$ add_changelog -e 'Initial Build' kernel-image.spec

config-* создадим на предварительно собирая ядро посредством:

$ zcat /proc/config.gz > .config
$ make oldconfig && make menuconfig && make bzImage modules

Заодно создадим список модулей которые должны собираться вместе с ядром:

$ cat <<EOF >modules.build
 fglrx
 nvidia
 bcmwl
 xtables-addons
 rtl8192
 rtl8168
 e1000e
 EOF

Настроим gear. При сборке мы планируем использовать уже упакованные до нас исходники vanila kernel из пакета kernel-source-3.0 и один большой патч который можно посмотреть командой

$ git diff v3.0 v2.6.39-100.5.1
$ mkdir .gear
 cat <<EOF > .gear/rules
 cat .gear/rules 
 copy: config-*
 diff: v3.0:. v2.6.39-100.5.1:. name=kernel-image-el-uek-2.6.39.100.5.1-alt1.patch
 EOF

Уффф... коммит:

$ git add .gear 
$ git add config-*
$ git add kernel-* 
$ git add modules.build
$ git commit -am 'Initial build'
$ gear-commit -a
$ gear-update-tag -avc && git commit -am 'gear-update-tag'
$ git branch kernel-image-el-uek.Mp6 kernel-image-el-uek

Собираем

cd ..
buildkernel --hasher el-uek

Что делать есть сборка обрывается

Иптыть... обломались в процессе сборки, нужно поправить kernel-image.spec. На самом деле это не проблема, править и добивать ногами сборку будем hasher.

$ hsh-install ./hasher vim
$ hsh-shell ./hasher
$ cd /usr/src/RPM/SPECS
$ vim kernel-image.spec
 ... ...
$ rpm -bb --short-circuit /usr/src/RPM/kernel-image.spec

если в конце концов ядро собралось то необходимо вытащить все файлы которые изменялись из дириктории hasher/chroot и положить в kernel. Не забывая при этом говорить

$ git commit -am '...config changes...'

и в случае если менялся spec файл:

$ gear-commit -a

в дириктории kernel.

проверяем:

$ cd ~/kernel-build && buildkernel --hasher el-uek

если собралось, то:

$ mkdir hasher/repo/{x86_64,i586}/base
$ genbasedir --topdir=/home/kde/hasher/repo i586   hasher
$ genbasedir --topdir=/home/kde/hasher/repo x86_64 hasher

Беремся за модули

$ mkdir modules && cd modules
$ git init
$ git remote add aspsk git://git.altlinux.org/people/aspsk/packages/kernel-modules.git
$ git fetch aspsk

Смотрим что доступно для нашего дистрибутива, например p6

$ git branch -r | grep 'template.*p6$'

Создаем локальные бранчи

$ for i in `cat ../kernel/modules.build`
> do
> git branch -f template/$i/alt-linux-p6 aspsk/template/$i/alt-linux-p6
done

Собираем модули

$ cd ..
$ buildmodules -d alt-linux-p6 -k el-uek  --hasher
$ genbasedir --topdir=/home/kde/hasher/repo i586   hasher
$ genbasedir --topdir=/home/kde/hasher/repo x86_64 hasher

теперь можно выкатывать папку hashe/repo/ в pub для тестированя и использования.

Ссылки