суббота, 14 ноября 2009 г.

reiser4 для openSUSE-11.2

/*
И вновь продолжается бой,
И сердцу тревожно в груди.
И Ленин - такой молодой,
И юный Октябрь впереди!
/Н. Добронравов, 1974/

собсно продолжение "весёлой (1)" "истории (2)" с ура-патриотическим шовинистским наклоном.

потихоньку перечисляем причины, по которым задерживается/откладывается/херится компиляция рабочего софта для openSUSE-11.2:

* в текущей версии "binutils-2.19.51" кто-то умный (ОЧЕНЬ умный, да-да-да!) взял и догадался запретить "ld" делать статическую линковку бинарей по умолчанию.

абзац. передай CFLAGS параметр "-static" и можешь быть свободен (вопрос на засыпку: "а сколько проверок тех же autotools применяют статику для тестирования окружения?!"). из-за этого в Factory накрылась сборка "reiser4progs" и ваш покорный слуга "осилил" первым (damn, i'm good!) поднять "Титаник" из глубин:

пруфлинк :)

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

1) тянем с kernel.org сырцы ядра, патчим по своему усмотрению, ставим;
2) ковыряем текущие исходники от SuSE (с учётом того, что некоторые патчи из "обоймы" reiser4 уже наложены);
3) берём diff-ы reiser4 и, радостные, лепим из них сырцы ядрёного модуля для последующей сборки по фэн-шую, выкладываем в OBS, лепим src.rpm и развлекаемся по полной программе матёрого эксгибициониста.

* история нумеро уно (светлая и радостная)

теперь по-порядку. при любых раскладах нам понадобятся исходники ядра от SuSE (чтобы припухнуть от количества патчей, выбрать нужные и хоть немного, но сообразить, почему ядро от SuSE заведётся даже на Gentoo, установленной на Mac Book, с поддержкой всего найденного оборудования):

> sudo zypper si kernel-source

для простоты из "/usr/src/packages/SOURCES/patches.suse.tar.bz2#utar/patches.suse/" дёргаем лишь файл "bootsplash" как пример. вам что-то ещё нужно?! - не стесняйтесь. можно себе позволить и правой рукой, и левой и обеими одновременно. именно тот случай.

частенько встречаются индивидуумы с синдромом "мля, это говно нибуя не компилиццо!". им может помочь (в плане уменьшения расхода нервных клеток ессно, IQ приходит с опытом/возрастом... правда не ко всем... и не всегда...) простенький конструкт (дёшево и сердито, рекомендую кстати):

> sudo zypper in ccache
> mkdir $HOME/bin
> ln -s /usr/bin/ccache $HOME/bin/cc
> ln -s /usr/bin/ccache $HOME/bin/gcc
> ln -s /usr/bin/ccache $HOME/bin/g++
> export PATH="$HOME/bin:$PATH"

если вы уже упёрли kernel-2.6.31.6 (налетай, падхады!), а с офсайта оттяпали набор reiser4 патчей для пионэров - то удача близка, как никогда ранее! осталось всего-ничего: состыковать это богатство в единое целое (Кама-Сутра нам поможет), компильнуть, инстальнуть и ребутнуться.

некоторые индивидуумы перед оправлением большой нужды не заботятся о наличии "облагораживающих рулонов бумаги" поблизости. "не наш метод"(с). выбор каталога для исходников ядра (KERNELSOURCEDIR) и выбор каталога для собранных, но не установленных, файлов (KERNELBUILDDIR) очень важен. хотя бы потому, что в процессе сборки они могут занять до 4-ёх Gb дискового пространства, а то и поболее (если мы лепим модули для разных вариантов настроек ядра). все детали очень хорошо описаны в файле "Linux-2.6*/README" - изучите. и подумайте о добавлении команд "make prepare && make scripts" в рутинный процесс компиляции.

для простоты эксперимента не будем мудрить (распакуем исходники ядра в "/usr/src/"):

> export KERNELSOURCEDIR=/usr/src/linux-2.6.31.6
> export KERNELBUILDDIR=/usr/src/linux-2.6.31.6

готовимся отпатчить исходники по самое "не балуй!":

> mkdir /usr/src/patch_reiser4
> cd /usr/src/patch_reiser4/
> tar xf $PATH_TO_SOURCE/reiser4-for-2.6.31.patch.bz2
> cd /usr/src/patch_reiser4/linux-2.6.3?/
> mkdir my_additional_patches
> cd ./my_additional_patches/
> cp $PATH_TO_SOURCE/bootsplash ./bootsplash.diff

решаем шкурный вопрос о патчах reiser4 *.diff файлов. либо делаем:

> mv /usr/src/linux-2.6.31.6 /usr/src/linux-2.6.31 # и корректируем переменные KERNEL*DIR

либо

> cd /usr/src/patch_reiser4/linux-2.6.31/
> find ./ -type f -exec sed -i 's|\ linux\-2\.6\.31|\ linux\-2\.6\.31\.6|' {} \;

приводим в порядок "bootsplash.diff" заменяя аморфные " a/" и " b/" на имя каталога с нашим новым ядром - "linux-2.6.31.6" или что-там-у-вас-получилось.

настал торжественный момент! "собирайтесь, девки, в кучу, я вам чучу отчебучу!" (наше дерево патчей - в "/usr/src/patch_reiser4/linux-2.6.31/"!)

> cd /usr/src/patch_reiser4/
> find ./linux-2.6.31/ -type f -exec cat {} \; | patch -d /usr/src/ -p0 -i -

если вас устраивает текущее ядро и нет желания изображать из себя "великого оптимизатора" - пришло время расслабиться:

> cd $KERNELSOURCEDIR/
> zcat /proc/config.gz > ./.config
> make oldconfig
> make O="$KERNELBUILDDIR"
> sudo make O="$KERNELBUILDDIR" modules_install install

новые записи уже добавились в меню grub-а, хотя можно и проверить/поправить дефолт:

> sudo vim /boot/grub/menu.lst

можно (и нужно) перегрузить машину на новое ядро и (ежели таки оргазм) - прислать аффтару пиффка для рыффка. последние штрихи:

> sudo depmod -a # на всякий...
> modprobe -v reiser4
insmod /lib/modules/2.6.31.6-0.1-desktop/kernel/lib/zlib_deflate/zlib_deflate.ko
insmod /lib/modules/2.6.31.6-0.1-desktop/kernel/lib/lzo/lzo_compress.ko
insmod /lib/modules/2.6.31.6-0.1-desktop/kernel/lib/lzo/lzo_decompress.ko
insmod /lib/modules/2.6.31.6-0.1-desktop/kernel/fs/reiser4/reiser4.ko

гы :). "Отдохнул - убери за собой!"(с):

> cd $KERNELSOURCEDIR/
> make clean
> zcat /proc/config.gz > ./.config
> make oldconfig
> make prepare
> make scripts

в остатке у нас няшный latest-kernel-stable с поддержкой bootsplash (выглядит как "родной"!) и reiser4 (надеюсь, что мои пакетики с "reiser4progs" уже установлены, да?). дерево исходников очищено от мусора и можно переходить к

* истории второй, печальной и тупой...

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

засада начинается с разблядовки ядра на составляющие по-умолчанию (примерно так это выглядит):

> rpm -qa | grep kernel | sort

kernel-debug-devel-2.6.31.5-0.1.1.i586
kernel-default-devel-2.6.31.5-0.1.1.i586
kernel-desktop-2.6.31.5-0.1.1.i586
kernel-desktop-base-2.6.31.5-0.1.1.i586
kernel-desktop-devel-2.6.31.5-0.1.1.i586
kernel-firmware-20090821-4.1.noarch
kernel-pae-devel-2.6.31.5-0.1.1.i586
kernel-source-2.6.31.5-0.1.1.noarch
kernel-syms-2.6.31.5-0.1.1.i586
kernel-xen-devel-2.6.31.5-0.1.1.i586
linux-kernel-headers-2.6.31-3.4.noarch

получается, что алгоритм решения задачи должен быть примерно следующим:

a) "совместить" "объектные" файлы текущего ядра с основным деревом исходников - т.е. получить единое дерево исходников без разбивок на flavors (pae, xen, default, desktop, etc...) для ТЕКУЩЕГО! работающего ядра! т.е. сделать так, чтобы модуль мог быть подгружен в работающее ядро от SuSE!
b) удостовериться, что новое дерево стабильно и функционально (т.е. можно смело собирать бинари)
c) пропатчить новое дерево reiser4 diff-ами
d) собрать модуль reiser4, загрузить в текущее рабочее ядро
e) испытать оргазм

либо сразу отказаться от выпендрёжа и перейти к "третьему варианту" - подготовке исходников для нового модуля ядра и сборке в соответствии с CODE11.

нетрудно догадаться, что в творческом порыве аффтар не стал выполнять пункты a) и b), после чего ухитрился накомпилять ядро с новыми модулями, перетереть, старое, ребутнуться и "качнуть глибцов" по самые гланды. если кто-то думает, что всё прошло без сучка и задоринки (без разбора rej файлов, дополнительных патчей исходников...) - то он "наивный чукотский юноша". аффтар вспомнил всё и всех.

на вторую попытку силёнок не хватило. энтузиастам предложу ознакомиться с:

> ls /usr/src/linux-2.6.*-obj/$ARCH/$YOUR_FLAVOR

на предмет "соединения" с основным деревом исходников. иначе "не пойдёт!"(c). патчи - аналогично, НО:

N.B.: просмотрите в файлах (желательно пройтись по всем уже наложенным ессно)

/usr/src/packages/SOURCES/patches.suse.tar.bz2
/usr/src/packages/SOURCES/patches.fixes.tar.bz2

какие из патчей для "reiser4" уже присутствуют я ядре openSuSE и измените содержимое reiser4 diff-ов соответственно! иначе... будете как аффтар - ССЗБ.

делать "make install" не надо, тупо скопируйте "reiser4.ko" в "/lib/modules/"`uname -r`"/updates/" и, если всё хорошо, сделайте:

> sudo depmod -a
> modprobe -v reiser4

ня! (или как там получится по обстоятельствам...)

* история третья, коротенькая, но оптимистичная...

есть у меня махонький такой репо для экспериментов в часы досуга:

drivers

как только - так сразу там всё и появится. кому оно надо - загрузят "*.src.rpm" и разберутся без соплей. остальные упрут "reiser4-kmp-$FLAVOR" и будут похрюкивать от удовольствия.

* послесловие:

для модулей ядра стоит быть очень аккуратным с командой "strip". сделайте копию модуля, удалите debug символы, проверьте, загружается ли модуль после этого и только потом "режьте по живому". если нет ОСТРЕЙШЕЙ необходимости - оставьте модули как "not stripped".

вот такая вот музыка, такая, блин, Вечная Молодость...

на закуску перечислим прочие "заслуги" перед "родиной":

* в Enlightenment repo собрали новый снэпшот "fltk2" и "Dillo-2.1.1" (с поддержкой https/ssl - можно даже на gmail.com почту мусолить)

* там же в процессе грандиозная чистка spec-файлов от мусора

* там же обновлены практически все пакеты на текущие версии (включая git/svn/etc...)

* в игрушечном репо собрана новая версия "freetype2-lcd" и "igmpproxy" пропатчен для сборки/работы на openSUSE-11.2

* продолжаем готовить релиз SOAD Linux на базе oS-11.2 - тут всё грустно, ибо многие компоненты, что работают на openSUSE-11.1 в OBS не "портированы" на oS-11.2. да и прочих забот хватает.

пока так. поживём, а там видно будет.

всем удачи!

*/

2 комментария:

sda комментирует...

есть ещё один вариант, который даже рассматривать не стал:

1) устаноыка сырцов ядра
2) реверс уже наложенных патчей (из reiser4)
3) патч reiser4 diff-ами
4) сборка ядра по изменённому spec-файлу.

если делать всё как положено - то на подобную сборку со всеми flavors не хватит ни места на партиции, ни времени. если собирать только для 1-го flavor - то проще использовать 2-ой способ из заметки, ибо любая ошибка на rpmbuild отбрасывает нас к началу сборки.

sda комментирует...

репо с reiser4 модулями для ядер openSuSE готово!

забираем:

openSuSE-11.2 Update

openSuSE-11.2