Kernel/build for dummies
Сборка ядра для чайников на примере Unbrekable Enterprise kernel для p6
Q: Зачем?
A: А вдруг тут правду написали http://www.opennet.ru/opennews/art.shtml?num=33344 .
Курим документацию:
- file:///usr/share/doc/kernel-build-tools-0.99.1/README.ru.html
- 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=hasher/repo i586 hasher $ genbasedir --topdir=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=hasher/repo i586 hasher $ genbasedir --topdir=hasher/repo x86_64 hasher
теперь можно выкатывать папку hashe/repo/ в pub для тестированя и использования.