Сборка проприетарного пакета с нуля
Материал из ALT Linux Wiki
Becase (обсуждение | вклад) (Создана страница :)) |
(→Примечания) |
||
(28 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
- | |||
- | |||
{{Stub}} | {{Stub}} | ||
Данное руководство покажет, как правильно собрать пакет RPM в [[Sisyphus]] с нуля в инфраструктуре [[Gear]] и [[git.alt]], не имея исходного кода пакета, на примере пакета [[Hitachi_StarBoard|StarBoardSoftware]]. | Данное руководство покажет, как правильно собрать пакет RPM в [[Sisyphus]] с нуля в инфраструктуре [[Gear]] и [[git.alt]], не имея исходного кода пакета, на примере пакета [[Hitachi_StarBoard|StarBoardSoftware]]. | ||
+ | |||
+ | == Входные требования == | ||
+ | * Желательно иметь локальное [[sisyphus-mirror|зеркало Сизифа]]. | ||
+ | * [[Hasher/Краткое_руководство|Установленный]] и немного настроенный [[hasher|hasher]]<ref>После установки hasher необходимо создать вспомогательных пользователей и перезайти в систему.</ref>. | ||
+ | * [ftp://ftp.altlinux.org/pub/people/becase/whiteboards/StarBoard/StarBoardSoftware-9.2.i586.rpm Пакет], который необходимо пересобрать для Сизифа. | ||
+ | * Ну, и самое главное, желание этим заниматься. | ||
+ | |||
+ | == Исследование пакета == | ||
+ | Первым делом нужно исследовать пакет на его кривость. | ||
+ | |||
+ | Для начала смотрим список файлов, которые появляются после установки пакета: {{cmd| rpm -qlp StarBoardSoftware-9.2.i586.rpm {{!!}} less}}. | ||
+ | |||
+ | И видим, что все файлы ставятся в каталог {{path|/usr/local/}}. | ||
+ | |||
+ | === Попытка установить пакет === | ||
+ | Пробуем поставить этот пакет в hasher, на голую систему: | ||
+ | * {{cmd|hsh --initroot-only -v ~/hasher}} | ||
+ | * {{cmd|hsh-install -v `pwd`/StarBoardSoftware-9.2.i586.rpm}} | ||
+ | |||
+ | Следующие пакеты имеют неудовлетворенные зависимости: | ||
+ | StarBoardSoftware: Требует: perl(strict) но пакет не может быть установлен | ||
+ | E: Извините, `битые' пакеты | ||
+ | |||
+ | === Удовлетворение зависимостей === | ||
+ | Ладно, создаём фиктивный пакет со следующим спеком в {{path|~/RPM/SPECS/}}: | ||
+ | Name: perl-strict | ||
+ | Version: 1.0 | ||
+ | Release: alt1 | ||
+ | Provides: perl(strict) | ||
+ | BuildArch: noarch | ||
+ | Summary: perl(strict) | ||
+ | Group: Test | ||
+ | License: test | ||
+ | %description | ||
+ | %files | ||
+ | %changelog | ||
+ | Выполняем | ||
+ | * {{cmd|rpmbuild -bb perl-strict.spec}} | ||
+ | Обрабатываются файлы: perl-strict-1.0-alt1 | ||
+ | Provides: perl(strict) | ||
+ | Записан: /home/becase/RPM/RPMS/noarch/perl-strict-1.0-alt1.noarch.rpm | ||
+ | |||
+ | Ставим наш самособранный пакет в hasher: | ||
+ | * {{cmd|hsh-install -v `pwd`/perl-strict-1.0-alt1.noarch.rpm}} | ||
+ | |||
+ | === Вторая попытка установки === | ||
+ | Второй подход к установке: | ||
+ | * {{cmd|hsh-install -v `pwd`/StarBoardSoftware-9.2.i586.rpm}} | ||
+ | |||
+ | Получаем вывод: | ||
+ | >>> preinst start | ||
+ | PARAMETERS 1 | ||
+ | /root/tmp/rpm-tmp.92646: line 36: rmmod: command not found | ||
+ | <<< preinst end | ||
+ | error: unpacking of archive failed on file /: cpio: utime failed - Operation not permitted | ||
+ | hsh-install: Packages installation failed. | ||
+ | Из этого следует, что пакет перед установкой пытается выполнить какой-то скрипт preinst, далее нам не позволяют устанавливать корень системы. | ||
+ | |||
+ | Смотрим | ||
+ | * {{cmd|rpm -qlp StarBoardSoftware-9.2.i586.rpm {{!!}} less head -n5}} | ||
+ | / | ||
+ | /usr | ||
+ | /usr/local | ||
+ | /usr/local/HitachiSolutions | ||
+ | /usr/local/HitachiSolutions/StarBoard | ||
+ | Да, действительно почему-то авторы исходного пакета решили упаковать корень. В связи с этим, при установке этого пакета rpm пытается обновить дату создания {{path|/}}. | ||
+ | |||
+ | Посмотрим установочные скрипты пакета. | ||
+ | Запускаем mc {{cmd|mc}}, смотрим содержимое пакета, входя в него, как в архив, сценарии находятся в {{path|INFO/SCRIPTS/}} во внутренностях пакета. | ||
+ | Либо в терминале выполняем команду {{cmd|rpm -qp --scripts StarBoardSoftware-9.2.i586.rpm}}. | ||
+ | Смотрим скрипты, ужасаемся и решаем, что ни в коем случае не следует устанавливать этот пакет как есть. | ||
+ | |||
+ | Зато видим, что в пункте postinstall выполняется команда | ||
+ | * {{cmd|/usr/local/StarBoardSoftware/installation-scripts/install.sh binary uspace app}} | ||
+ | Здесь-то и находится вся логика установки! | ||
+ | |||
+ | === Извлечение файлов из пакета === | ||
+ | Достаём файлы из пакета без установки: | ||
+ | * {{cmd|rpm2cpio StarBoardSoftware-9.2.i586.rpm {{!!}} cpio -i}} | ||
+ | Как мы и ожидали, у нас появился каталог {{path|usr}}. | ||
+ | |||
+ | Для удобства дальнейшей работы упаковываем этот каталог в tar-архив: {{cmd|tar -cvf starboard_usr.tar usr}} | ||
+ | |||
+ | === Исследование лицензии === | ||
+ | Также исследуем файлы на предмет наличия лицензии. | ||
+ | Находим {{path|./usr/local/StarBoardSoftware/Resources/documents/COPYING}}, который содержит GPLv2. | ||
+ | Также находим файл {{path|./usr/local/StarBoardSoftware/Resources/documents/license/ru/license.rtf}}, который содержит следующие строки: | ||
+ | Передавать Программное обеспечение и все права по данному Соглашению | ||
+ | третьей стороне вместе с копией данного Соглашения, если третья | ||
+ | сторона соглашается принять положения и условия данного Соглашения. | ||
+ | Если Вы передаете Программное обеспечение, Вы должны или одновременно | ||
+ | передать третьей стороне все копии в печатной или машиночитаемой | ||
+ | форме, включая все модификации и части Программного обеспечения, | ||
+ | содержащиеся в других программах или объединенные с ними, или | ||
+ | уничтожить все непереданные копии. | ||
+ | Значит, можно пакет пересобрать для Сизифа. | ||
+ | |||
+ | Под лицензией GPLv2 поставляется драйвер для доски StarBoard, будем считать, что он уже [http://sisyphus.ru/ru/srpm/Sisyphus/kernel-modules-lsadrv-std-def собран]. В отличии от других систем, в ALTLinux скомпилированный драйвер ядра ставится в {{path|/lib/modules/`uname -r`/lsadrv/lsadrv.ko}}. | ||
+ | |||
+ | === Автоматизация установки === | ||
+ | Для множественных попыток установить этот софт в hasher создаём сценарий автоматизации. | ||
+ | |||
+ | #!/bin/sh -x | ||
+ | |||
+ | #Корневой каталог системы в hasher | ||
+ | root=$HOME/hasher/chroot | ||
+ | |||
+ | #Корневой каталог программы | ||
+ | sroot=/usr/local/StarBoardSoftware | ||
+ | |||
+ | #Каталог с файлом starboard_usr.tar | ||
+ | archive_dir=/media/disk/ALTLinux/left/starboard2010/StarBoardSoftware | ||
+ | |||
+ | #Имя созданного нами архива | ||
+ | archive_name=starboard_usr.tar | ||
+ | |||
+ | #Префикс для запуска команды под фиктивным рутом в hasher | ||
+ | prefix="hsh-run --rooter -- " | ||
+ | |||
+ | #Пересоздание системы в hasher | ||
+ | hsh --initroot-only -v ~/hasher | ||
+ | |||
+ | #Список установки, будет дополняться, желательно как можно более приближающий систему в hasher к реальной | ||
+ | install_list="kernel-modules-lsadrv-std-def" | ||
+ | |||
+ | #Ставим в hasher пакеты из нашего списка | ||
+ | hsh-install -v $install_list | ||
+ | |||
+ | #Копируем наш архив в подкаталог фиктивного корня системы | ||
+ | rsync --progress --inplace $archive_dir/$archive_name $root/.in/ | ||
+ | |||
+ | #Запускаем от фиктивного рута установку файлов в фиктивный корень | ||
+ | $prefix tar -xvf $archive_name -C / | ||
+ | |||
+ | #Удаляем архив, чтобы не занимал место | ||
+ | rm -f $root/.in/$archive_name | ||
+ | |||
+ | #Запускается сценарий, в котором будут исправляться установочные сценарии | ||
+ | . starboard-fix-install-script | ||
+ | |||
+ | #Создаём файлы, в которых будет храниться списки файлов до запуска скрипта и после | ||
+ | touch $root/.out/filelist.1 $root/.out/filelist.2 | ||
+ | #Создаём от имени "рута" каталог, в котором будем хранить копию настроек системы | ||
+ | $prefix mkdir /.res | ||
+ | #Копируем содержимое настроек системы | ||
+ | $prefix cp -ar /etc /.res/etc | ||
+ | #Получаем список файлов до работы скрипта | ||
+ | $prefix find / > $root/.out/filelist.1 | ||
+ | |||
+ | #Запускаем скрипт, что-то вытворяющий с системой, которую нам не жалко | ||
+ | $prefix $sroot/installation-scripts/install.sh | ||
+ | |||
+ | #Получаем список файлов после работы скрипта | ||
+ | $prefix find / > $root/.out/filelist.2 | ||
+ | #Получаем список, отражающий, что этот скрипт натворил | ||
+ | diff -Nau $root/.out/filelist.1 $root/.out/filelist.2 > $root/.out/files.diff | ||
+ | #И как повлиял на содержимое файлов настройки | ||
+ | $prefix diff -Naur /.res/etc /etc > $root/.out/etc.diff | ||
+ | |||
+ | === Запуск установочного сценария === | ||
+ | После запуска нашего скрипта получаем следующее. | ||
+ | |||
+ | Ошибки сценария: | ||
+ | /usr/local/StarBoardSoftware/installation-scripts/install.sh: line 318: [: =: unary operator expected | ||
+ | /usr/local/StarBoardSoftware/installation-scripts/install.sh: line 326: $DEFAULTSLIST: ambiguous redirect | ||
+ | Смотрим, что добавилось: | ||
+ | * {{cmd|grep '+/' hasher/chroot/.out/files.diff }} | ||
+ | Что-то подозрительное: | ||
+ | +/tmp/fxduo.driver.build.log | ||
+ | +/etc/ld.so.conf.d/lsadrv.conf | ||
+ | +/lib/modules/2.6.35-std-def-alt9/kernel/drivers/usb/input | ||
+ | Выходит, что во время установки сценарий пытался скомпилировать драйвер и поставить его в {{path|/lib/modules/2.6.35-std-def-alt9/kernel/drivers/usb/input}}, но у него это не вышло. И ещё он решил добавить каталог поиска системных библиотек в {{path|/etc/ld.so.conf.d/lsadrv.conf}}, что не может не вызвать подозрение на нарушение целостности системы. | ||
+ | |||
+ | Смотрим, что там такое: | ||
+ | * {{cmd|cat hasher/chroot/etc/ld.so.conf.d/lsadrv.conf}} | ||
+ | /usr/local/lsadrv/lib | ||
+ | * {{cmd|ls hasher/chroot/usr/local/lsadrv/lib}} | ||
+ | libborqt-6.9.0-qt2.3.qm.ja liblsadev.so liblsdrv.so libQtCore.so libQtCore.so.4.5.2 libQtGui.so.4.5 | ||
+ | libborqt-6.9.0-qt2.3.so liblsadev.so.0 liblsdrv.so.2 libQtCore.so.4 libQtGui.so libQtGui.so.4.5.2 | ||
+ | libborqt-6.9-qt2.3.so liblsadev.so.0.0.0 liblsdrv.so.2.0.0 libQtCore.so.4.5 libQtGui.so.4 | ||
+ | Наличие в {{path|/usr/local/lsadrv/lib}} библиотек Qt может пагубно повлиять на системные Qt-программы, если этот путь будет использоваться системой. | ||
+ | |||
+ | === Изменённые настройки === | ||
+ | * {{cmd|grep -a diff hasher/chroot/.out/etc.diff}} | ||
+ | diff -Naur /.res/etc/ld.so.cache /etc/ld.so.cache | ||
+ | diff -Naur /.res/etc/ld.so.conf.d/lsadrv.conf /etc/ld.so.conf.d/lsadrv.conf | ||
+ | diff -Naur /.res/etc/lsadrv/lsdrv.ini /etc/lsadrv/lsdrv.ini | ||
+ | diff -Naur /.res/etc/lsdrv.ini /etc/lsdrv.ini | ||
+ | diff -Naur /.res/etc/modules /etc/modules | ||
+ | diff -Naur /.res/etc/modules.bak /etc/modules.bak | ||
+ | diff -Naur /.res/etc/starboard/registry/HKEY_LOCAL_MACHINE.reg /etc/starboard/registry/HKEY_LOCAL_MACHINE.reg | ||
+ | diff -Naur /.res/etc/udev/rules.d/42-starboard.rules /etc/udev/rules.d/42-starboard.rules | ||
+ | Отсюда видим, что изменился файл, в котором указывается список загружаемых при старте модулей {{path|/etc/modules}}, также изменился кэш с информацией о системных библиотеках {{path|/etc/ld.so.cache}}. Если первое ещё терпимо, то второе уж точно в данном случае допускать нельзя. | ||
+ | |||
+ | === Исправление сценария установки === | ||
+ | ==== Где что находится ==== | ||
+ | Смотрим, где нужно править путь к модулю: | ||
+ | * {{cmd|cd ~/hasher/chroot/usr/local/StarBoardSoftware}} | ||
+ | * {{cmd|grep -r --binary-files{{=}}without-match kernel/drivers/usb/input .}} | ||
+ | ./software/bin/reinstalldriver.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/ | ||
+ | ./installation-tools/reinstalldriver.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/ | ||
+ | ./installation-tools/starboardservice: MODULEFILE=/lib/modules/`uname -r`/kernel/drivers/usb/input/lsadrv.ko | ||
+ | ./installation-scripts/uninstall.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/ | ||
+ | ./installation-scripts/install.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/ | ||
+ | |||
+ | Где возможно отсутствует установка {{path|/usr/local/lsadrv/lib}} в LD_LIBRARY_PATH: | ||
+ | * {{cmd|grep -r --binary-files{{=}}without-match LD_LIBRARY_PATH . 2>/dev/null {{!!}} grep -v '/usr/local/lsadrv/lib' {{!!}} grep -v export}} | ||
+ | ./StarBoard.sh:LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/software/bin" | ||
+ | ./installation-tools/starboardservice:#LD_LIBRARY_PATH=$INSTALL/software/bin:$INSTALL/bin:$LD_LIBRARY_PATH:$LSADRV_DEST/lib: | ||
+ | ./installation-tools/starboardservice:LD_LIBRARY_PATH=$LSADRV_DEST/lib:$INSTALL/software/bin:$INSTALL/software/bin/stardriver: | ||
+ | После изучения скриптов, выясняется, что в {{path|./installation-tools/starboardservice}} под {{path|LSADRV_DEST}} значится {{path|/usr/local/lsadrv}}, значит это пока править не нужно. | ||
+ | |||
+ | Где вызывается обновление кэша системных библиотек: | ||
+ | * {{cmd|grep -rn --binary-files{{=}}without-match ldconfig . 2>/dev/null}} | ||
+ | ./installation-scripts/uninstall.sh:153: ldconfig -i /usr/local/lsadrv/lib; ldconfig | ||
+ | ./installation-scripts/install.sh:229: ldconfig | ||
+ | ./installation-scripts/install.sh:539:ldconfig /usr/local/lsadrv/lib | ||
+ | |||
+ | ==== Сценарий исправления сценария установки ==== | ||
+ | Для исправления сценария используется команда {{cmd|sed}} с синтаксисом: {{cmd|sed -i "s/что заменить/на что заменить/g"}}. | ||
+ | Переменные {{path|$prefix}} и {{path|$sroot}} ещё установлены в предыдущем сценарии. | ||
+ | |||
+ | Содержимое starboard-fix-install-script: | ||
+ | #!/bin/sh -x | ||
+ | |||
+ | #Исправляем синтаксическую ошибку | ||
+ | $prefix sed -i 's/$DEFAULTSLIST =/"$DEFAULTSLIST" =/g' $sroot/installation-scripts/install.sh | ||
+ | |||
+ | #Исправляем путь к модулю ядра | ||
+ | for i in installation-scripts/{,un}install.sh installation-tools/{reinstalldriver.sh,starboardservice} ; do | ||
+ | $prefix sed -i "s/kernel\/drivers\/usb\/input/lsadrv/g" $sroot/$i | ||
+ | done; | ||
+ | |||
+ | #Удаляем вызов ldconfig | ||
+ | for i in installation-scripts/{,un}install.sh ; do | ||
+ | $prefix sed -i "s/ldconfig/#ldconfig/g" $sroot/$i | ||
+ | done; | ||
+ | #Добавляем в LD_LIBRARY_PATH путь к /usr/local/lsadrv/lib | ||
+ | $prefix sed -i "s/LD_LIBRARY_PATH=\"/LD_LIBRARY_PATH=\"\/usr\/local\/lsadrv\/lib:/g" $sroot/StarBoard.sh | ||
+ | #Убираем запись /etc/ld.so.conf.d/lsadrv.conf | ||
+ | $prefix sed -i 's/echo $LSADRV_DEST\/lib/true #/g' $sroot/installation-scripts/install.sh | ||
+ | |||
+ | #Модуль у нас уже собран, компилировать и ставить его здесь не нужно | ||
+ | $prefix sed -i "s/MODULE=0/MODULE=1/g" $sroot/installation-scripts/install.sh | ||
+ | |||
+ | #Копируем файл со службой, чтобы её можно было использовать | ||
+ | $prefix sed -i 's/alterservice.pl -cx/cp $ROOT\/installation-tools\/starboardservice \/etc\/init.d\/;alterservice.pl -cx/g' $sroot/installation-scripts/install.sh | ||
+ | #Удаляем зачем-то установленный параметр {{path|--set}}, из-за которого не работает {{cmd|chkconfig}} | ||
+ | $prefix sed -i "s/--set//g" $sroot/installation-tools/alterservice.pl | ||
+ | |||
+ | #Делаем скрипты более разговорчивыми | ||
+ | $prefix sed -i 's/#!\/bin\/bash/#!\/bin\/bash -x/g' $sroot/installation-scripts/install.sh | ||
+ | $prefix sed -i 's/#!\/bin\/sh/#!\/bin\/sh -x/g' $sroot/installation-tools/install_touchscreen_xorg | ||
+ | |||
+ | #Изменяем список выполняемых по умолчанию действий | ||
+ | $prefix sed -i "s/binary builder source uspace app/x11 uspace app/g" $sroot/installation-scripts/install.sh | ||
+ | |||
+ | #Не нужно нам ставить никакие пакеты | ||
+ | $prefix sed -i 's/installApp_sub/#installApp_sub/g' $sroot/installation-scripts/install.sh | ||
+ | |||
+ | #Путь к модулям X11 у нас тоже другой | ||
+ | for i in examineSystem detectX11 ; do | ||
+ | $prefix sed -i "s/usr\/lib\/xorg/usr\/lib\/X11/g" $sroot/installation-tools/$i.pl | ||
+ | done | ||
+ | |||
+ | === Какие требуются каталоги === | ||
+ | * {{cmd| grep -rnI -- ' -d ' .}} | ||
+ | ./StarBoard.sh:18:# DRIFLG=`glxinfo | grep "direct rendering:" | sed -e "s/direct rendering: //" | cut -d " " -f 1` | ||
+ | ./installation-scripts/install.sh:7:if [ -d /var/log/ ] | ||
+ | ./installation-scripts/install.sh:31: if [ -d $i ] | ||
+ | ./installation-scripts/install.sh:210: if [ -d /etc/ld.so.conf.d/ ] | ||
+ | ./installation-scripts/install.sh:232: if [ ! -d "$RULESDIR" ] | ||
+ | ./installation-scripts/install.sh:296: if [ -d $DESKTOP_DIR/applications ] | ||
+ | ./installation-scripts/install.sh:350: if [ ! -d $ICONDIR ] | ||
+ | ./installation-scripts/install.sh:357: if [ -d $ICONDIR/$size/mimetypes ] | ||
+ | ./installation-scripts/install.sh:364: if [ -d $ICONDIR/$size/apps ] | ||
+ | ./installation-scripts/install.sh:394: if [ ! -d $X_MODULES ] | ||
+ | ./installation-scripts/install.sh:400: if [ ! -d $ROOT/xdriver/$X_ABI/ ] | ||
+ | ./installation-scripts/uninstall.sh:7:if [ -d /var/log/ ] | ||
+ | ./installation-scripts/uninstall.sh:112: if [ -d "/etc/lsadrv" ] | ||
+ | ./installation-scripts/uninstall.sh:121: if [ -d "/etc/starboard" ] | ||
+ | ./installation-scripts/uninstall.sh:135: if [ -d "/var/log/lsadrv" ] | ||
+ | ./installation-scripts/uninstall.sh:139: if [ -d "/usr/share/pixmaps/lsadrv" ] | ||
+ | ./installation-scripts/uninstall.sh:150: if [ -d "/usr/local/lsadrv" ] | ||
+ | ./installation-scripts/uninstall.sh:160: if [ -d $ROOT/kerneldriver/source/lsadrv ] | ||
+ | ./installation-scripts/uninstall.sh:180: if [ -d $DESKTOP_DIR/applications ] | ||
+ | ./installation-scripts/uninstall.sh:225: if [ ! -d /usr/share/icons/$dirname ] | ||
+ | ./installation-tools/alterservice.pl:84: if ( ! -d $_ ) { next;} | ||
+ | ./installation-tools/desktopRoutines.sh:7: if [ ! -d $DESKTOP_DIR/applications ] | ||
+ | ./installation-tools/detectX11.pl:181:if (! -d $xmodules) | ||
+ | ./installation-tools/examineSystem.pl:248:if ( ! -d $values{"x.modules"}) { $values{"x.modules"}.=" [MISSING]"; } | ||
+ | ./installation-tools/examineSystem.pl:322: if ( -d $dir) | ||
+ | ./installation-tools/examineSystem.pl:340: if ( -d $dir) | ||
+ | ./installation-tools/examineSystem.pl:361: if ( -f $_ || -d $_) | ||
+ | ./installation-tools/remove_if_identical:85: if ( -d $name) | ||
+ | ./installation-tools/remove_if_identical:100: if ( -d $name) | ||
+ | ./installation-tools/starboardservice:186: if [ -d $KERNELDRIVERPATH ] | ||
+ | |||
+ | == Примечания == | ||
+ | {{примечания}} | ||
+ | [[Категория:Интерактивные доски]] | ||
+ | {{Category navigation|title=Сборка пакетов|category=Сборка пакетов|sortkey={{SUBPAGENAME}}}} |
Текущая версия на 05:13, 3 марта 2016
Данное руководство покажет, как правильно собрать пакет RPM в Sisyphus с нуля в инфраструктуре Gear и git.alt, не имея исходного кода пакета, на примере пакета StarBoardSoftware.
Содержание
|
Входные требования
- Желательно иметь локальное зеркало Сизифа.
- Установленный и немного настроенный hasher[1].
- Пакет, который необходимо пересобрать для Сизифа.
- Ну, и самое главное, желание этим заниматься.
Исследование пакета
Первым делом нужно исследовать пакет на его кривость.
Для начала смотрим список файлов, которые появляются после установки пакета: rpm -qlp StarBoardSoftware-9.2.i586.rpm | less.
И видим, что все файлы ставятся в каталог /usr/local/.
Попытка установить пакет
Пробуем поставить этот пакет в hasher, на голую систему:
- hsh --initroot-only -v ~/hasher
- hsh-install -v `pwd`/StarBoardSoftware-9.2.i586.rpm
Следующие пакеты имеют неудовлетворенные зависимости: StarBoardSoftware: Требует: perl(strict) но пакет не может быть установлен E: Извините, `битые' пакеты
Удовлетворение зависимостей
Ладно, создаём фиктивный пакет со следующим спеком в ~/RPM/SPECS/:
Name: perl-strict Version: 1.0 Release: alt1 Provides: perl(strict) BuildArch: noarch Summary: perl(strict) Group: Test License: test %description %files %changelog
Выполняем
- rpmbuild -bb perl-strict.spec
Обрабатываются файлы: perl-strict-1.0-alt1 Provides: perl(strict) Записан: /home/becase/RPM/RPMS/noarch/perl-strict-1.0-alt1.noarch.rpm
Ставим наш самособранный пакет в hasher:
- hsh-install -v `pwd`/perl-strict-1.0-alt1.noarch.rpm
Вторая попытка установки
Второй подход к установке:
- hsh-install -v `pwd`/StarBoardSoftware-9.2.i586.rpm
Получаем вывод:
>>> preinst start PARAMETERS 1 /root/tmp/rpm-tmp.92646: line 36: rmmod: command not found <<< preinst end error: unpacking of archive failed on file /: cpio: utime failed - Operation not permitted hsh-install: Packages installation failed.
Из этого следует, что пакет перед установкой пытается выполнить какой-то скрипт preinst, далее нам не позволяют устанавливать корень системы.
Смотрим
- rpm -qlp StarBoardSoftware-9.2.i586.rpm | less head -n5
/ /usr /usr/local /usr/local/HitachiSolutions /usr/local/HitachiSolutions/StarBoard
Да, действительно почему-то авторы исходного пакета решили упаковать корень. В связи с этим, при установке этого пакета rpm пытается обновить дату создания /.
Посмотрим установочные скрипты пакета. Запускаем mc mc, смотрим содержимое пакета, входя в него, как в архив, сценарии находятся в INFO/SCRIPTS/ во внутренностях пакета. Либо в терминале выполняем команду rpm -qp --scripts StarBoardSoftware-9.2.i586.rpm. Смотрим скрипты, ужасаемся и решаем, что ни в коем случае не следует устанавливать этот пакет как есть.
Зато видим, что в пункте postinstall выполняется команда
- /usr/local/StarBoardSoftware/installation-scripts/install.sh binary uspace app
Здесь-то и находится вся логика установки!
Извлечение файлов из пакета
Достаём файлы из пакета без установки:
- rpm2cpio StarBoardSoftware-9.2.i586.rpm | cpio -i
Как мы и ожидали, у нас появился каталог usr.
Для удобства дальнейшей работы упаковываем этот каталог в tar-архив: tar -cvf starboard_usr.tar usr
Исследование лицензии
Также исследуем файлы на предмет наличия лицензии. Находим ./usr/local/StarBoardSoftware/Resources/documents/COPYING, который содержит GPLv2. Также находим файл ./usr/local/StarBoardSoftware/Resources/documents/license/ru/license.rtf, который содержит следующие строки:
Передавать Программное обеспечение и все права по данному Соглашению третьей стороне вместе с копией данного Соглашения, если третья сторона соглашается принять положения и условия данного Соглашения. Если Вы передаете Программное обеспечение, Вы должны или одновременно передать третьей стороне все копии в печатной или машиночитаемой форме, включая все модификации и части Программного обеспечения, содержащиеся в других программах или объединенные с ними, или уничтожить все непереданные копии.
Значит, можно пакет пересобрать для Сизифа.
Под лицензией GPLv2 поставляется драйвер для доски StarBoard, будем считать, что он уже собран. В отличии от других систем, в ALTLinux скомпилированный драйвер ядра ставится в /lib/modules/`uname -r`/lsadrv/lsadrv.ko.
Автоматизация установки
Для множественных попыток установить этот софт в hasher создаём сценарий автоматизации.
#!/bin/sh -x #Корневой каталог системы в hasher root=$HOME/hasher/chroot #Корневой каталог программы sroot=/usr/local/StarBoardSoftware #Каталог с файлом starboard_usr.tar archive_dir=/media/disk/ALTLinux/left/starboard2010/StarBoardSoftware #Имя созданного нами архива archive_name=starboard_usr.tar #Префикс для запуска команды под фиктивным рутом в hasher prefix="hsh-run --rooter -- " #Пересоздание системы в hasher hsh --initroot-only -v ~/hasher #Список установки, будет дополняться, желательно как можно более приближающий систему в hasher к реальной install_list="kernel-modules-lsadrv-std-def" #Ставим в hasher пакеты из нашего списка hsh-install -v $install_list #Копируем наш архив в подкаталог фиктивного корня системы rsync --progress --inplace $archive_dir/$archive_name $root/.in/ #Запускаем от фиктивного рута установку файлов в фиктивный корень $prefix tar -xvf $archive_name -C / #Удаляем архив, чтобы не занимал место rm -f $root/.in/$archive_name #Запускается сценарий, в котором будут исправляться установочные сценарии . starboard-fix-install-script #Создаём файлы, в которых будет храниться списки файлов до запуска скрипта и после touch $root/.out/filelist.1 $root/.out/filelist.2 #Создаём от имени "рута" каталог, в котором будем хранить копию настроек системы $prefix mkdir /.res #Копируем содержимое настроек системы $prefix cp -ar /etc /.res/etc #Получаем список файлов до работы скрипта $prefix find / > $root/.out/filelist.1 #Запускаем скрипт, что-то вытворяющий с системой, которую нам не жалко $prefix $sroot/installation-scripts/install.sh #Получаем список файлов после работы скрипта $prefix find / > $root/.out/filelist.2 #Получаем список, отражающий, что этот скрипт натворил diff -Nau $root/.out/filelist.1 $root/.out/filelist.2 > $root/.out/files.diff #И как повлиял на содержимое файлов настройки $prefix diff -Naur /.res/etc /etc > $root/.out/etc.diff
Запуск установочного сценария
После запуска нашего скрипта получаем следующее.
Ошибки сценария:
/usr/local/StarBoardSoftware/installation-scripts/install.sh: line 318: [: =: unary operator expected /usr/local/StarBoardSoftware/installation-scripts/install.sh: line 326: $DEFAULTSLIST: ambiguous redirect
Смотрим, что добавилось:
- grep '+/' hasher/chroot/.out/files.diff
Что-то подозрительное:
+/tmp/fxduo.driver.build.log +/etc/ld.so.conf.d/lsadrv.conf +/lib/modules/2.6.35-std-def-alt9/kernel/drivers/usb/input
Выходит, что во время установки сценарий пытался скомпилировать драйвер и поставить его в /lib/modules/2.6.35-std-def-alt9/kernel/drivers/usb/input, но у него это не вышло. И ещё он решил добавить каталог поиска системных библиотек в /etc/ld.so.conf.d/lsadrv.conf, что не может не вызвать подозрение на нарушение целостности системы.
Смотрим, что там такое:
- cat hasher/chroot/etc/ld.so.conf.d/lsadrv.conf
/usr/local/lsadrv/lib
- ls hasher/chroot/usr/local/lsadrv/lib
libborqt-6.9.0-qt2.3.qm.ja liblsadev.so liblsdrv.so libQtCore.so libQtCore.so.4.5.2 libQtGui.so.4.5 libborqt-6.9.0-qt2.3.so liblsadev.so.0 liblsdrv.so.2 libQtCore.so.4 libQtGui.so libQtGui.so.4.5.2 libborqt-6.9-qt2.3.so liblsadev.so.0.0.0 liblsdrv.so.2.0.0 libQtCore.so.4.5 libQtGui.so.4
Наличие в /usr/local/lsadrv/lib библиотек Qt может пагубно повлиять на системные Qt-программы, если этот путь будет использоваться системой.
Изменённые настройки
- grep -a diff hasher/chroot/.out/etc.diff
diff -Naur /.res/etc/ld.so.cache /etc/ld.so.cache diff -Naur /.res/etc/ld.so.conf.d/lsadrv.conf /etc/ld.so.conf.d/lsadrv.conf diff -Naur /.res/etc/lsadrv/lsdrv.ini /etc/lsadrv/lsdrv.ini diff -Naur /.res/etc/lsdrv.ini /etc/lsdrv.ini diff -Naur /.res/etc/modules /etc/modules diff -Naur /.res/etc/modules.bak /etc/modules.bak diff -Naur /.res/etc/starboard/registry/HKEY_LOCAL_MACHINE.reg /etc/starboard/registry/HKEY_LOCAL_MACHINE.reg diff -Naur /.res/etc/udev/rules.d/42-starboard.rules /etc/udev/rules.d/42-starboard.rules
Отсюда видим, что изменился файл, в котором указывается список загружаемых при старте модулей /etc/modules, также изменился кэш с информацией о системных библиотеках /etc/ld.so.cache. Если первое ещё терпимо, то второе уж точно в данном случае допускать нельзя.
Исправление сценария установки
Где что находится
Смотрим, где нужно править путь к модулю:
- cd ~/hasher/chroot/usr/local/StarBoardSoftware
- grep -r --binary-files=without-match kernel/drivers/usb/input .
./software/bin/reinstalldriver.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/ ./installation-tools/reinstalldriver.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/ ./installation-tools/starboardservice: MODULEFILE=/lib/modules/`uname -r`/kernel/drivers/usb/input/lsadrv.ko ./installation-scripts/uninstall.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/ ./installation-scripts/install.sh:MODULELOC=/lib/modules/`uname -r`/kernel/drivers/usb/input/
Где возможно отсутствует установка /usr/local/lsadrv/lib в LD_LIBRARY_PATH:
- grep -r --binary-files=without-match LD_LIBRARY_PATH . 2>/dev/null | grep -v '/usr/local/lsadrv/lib' | grep -v export
./StarBoard.sh:LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/software/bin" ./installation-tools/starboardservice:#LD_LIBRARY_PATH=$INSTALL/software/bin:$INSTALL/bin:$LD_LIBRARY_PATH:$LSADRV_DEST/lib: ./installation-tools/starboardservice:LD_LIBRARY_PATH=$LSADRV_DEST/lib:$INSTALL/software/bin:$INSTALL/software/bin/stardriver:
После изучения скриптов, выясняется, что в ./installation-tools/starboardservice под LSADRV_DEST значится /usr/local/lsadrv, значит это пока править не нужно.
Где вызывается обновление кэша системных библиотек:
- grep -rn --binary-files=without-match ldconfig . 2>/dev/null
./installation-scripts/uninstall.sh:153: ldconfig -i /usr/local/lsadrv/lib; ldconfig ./installation-scripts/install.sh:229: ldconfig ./installation-scripts/install.sh:539:ldconfig /usr/local/lsadrv/lib
Сценарий исправления сценария установки
Для исправления сценария используется команда sed с синтаксисом: sed -i "s/что заменить/на что заменить/g". Переменные $prefix и $sroot ещё установлены в предыдущем сценарии.
Содержимое starboard-fix-install-script:
#!/bin/sh -x #Исправляем синтаксическую ошибку $prefix sed -i 's/$DEFAULTSLIST =/"$DEFAULTSLIST" =/g' $sroot/installation-scripts/install.sh #Исправляем путь к модулю ядра for i in installation-scripts/{,un}install.sh installation-tools/{reinstalldriver.sh,starboardservice} ; do $prefix sed -i "s/kernel\/drivers\/usb\/input/lsadrv/g" $sroot/$i done; #Удаляем вызов ldconfig for i in installation-scripts/{,un}install.sh ; do $prefix sed -i "s/ldconfig/#ldconfig/g" $sroot/$i done; #Добавляем в LD_LIBRARY_PATH путь к /usr/local/lsadrv/lib $prefix sed -i "s/LD_LIBRARY_PATH=\"/LD_LIBRARY_PATH=\"\/usr\/local\/lsadrv\/lib:/g" $sroot/StarBoard.sh #Убираем запись /etc/ld.so.conf.d/lsadrv.conf $prefix sed -i 's/echo $LSADRV_DEST\/lib/true #/g' $sroot/installation-scripts/install.sh #Модуль у нас уже собран, компилировать и ставить его здесь не нужно $prefix sed -i "s/MODULE=0/MODULE=1/g" $sroot/installation-scripts/install.sh #Копируем файл со службой, чтобы её можно было использовать $prefix sed -i 's/alterservice.pl -cx/cp $ROOT\/installation-tools\/starboardservice \/etc\/init.d\/;alterservice.pl -cx/g' $sroot/installation-scripts/install.sh #Удаляем зачем-то установленный параметр --set, из-за которого не работает chkconfig $prefix sed -i "s/--set//g" $sroot/installation-tools/alterservice.pl #Делаем скрипты более разговорчивыми $prefix sed -i 's/#!\/bin\/bash/#!\/bin\/bash -x/g' $sroot/installation-scripts/install.sh $prefix sed -i 's/#!\/bin\/sh/#!\/bin\/sh -x/g' $sroot/installation-tools/install_touchscreen_xorg #Изменяем список выполняемых по умолчанию действий $prefix sed -i "s/binary builder source uspace app/x11 uspace app/g" $sroot/installation-scripts/install.sh #Не нужно нам ставить никакие пакеты $prefix sed -i 's/installApp_sub/#installApp_sub/g' $sroot/installation-scripts/install.sh #Путь к модулям X11 у нас тоже другой for i in examineSystem detectX11 ; do $prefix sed -i "s/usr\/lib\/xorg/usr\/lib\/X11/g" $sroot/installation-tools/$i.pl done
Какие требуются каталоги
- grep -rnI -- ' -d ' .
./StarBoard.sh:18:# DRIFLG=`glxinfo | grep "direct rendering:" | sed -e "s/direct rendering: //" | cut -d " " -f 1` ./installation-scripts/install.sh:7:if [ -d /var/log/ ] ./installation-scripts/install.sh:31: if [ -d $i ] ./installation-scripts/install.sh:210: if [ -d /etc/ld.so.conf.d/ ] ./installation-scripts/install.sh:232: if [ ! -d "$RULESDIR" ] ./installation-scripts/install.sh:296: if [ -d $DESKTOP_DIR/applications ] ./installation-scripts/install.sh:350: if [ ! -d $ICONDIR ] ./installation-scripts/install.sh:357: if [ -d $ICONDIR/$size/mimetypes ] ./installation-scripts/install.sh:364: if [ -d $ICONDIR/$size/apps ] ./installation-scripts/install.sh:394: if [ ! -d $X_MODULES ] ./installation-scripts/install.sh:400: if [ ! -d $ROOT/xdriver/$X_ABI/ ] ./installation-scripts/uninstall.sh:7:if [ -d /var/log/ ] ./installation-scripts/uninstall.sh:112: if [ -d "/etc/lsadrv" ] ./installation-scripts/uninstall.sh:121: if [ -d "/etc/starboard" ] ./installation-scripts/uninstall.sh:135: if [ -d "/var/log/lsadrv" ] ./installation-scripts/uninstall.sh:139: if [ -d "/usr/share/pixmaps/lsadrv" ] ./installation-scripts/uninstall.sh:150: if [ -d "/usr/local/lsadrv" ] ./installation-scripts/uninstall.sh:160: if [ -d $ROOT/kerneldriver/source/lsadrv ] ./installation-scripts/uninstall.sh:180: if [ -d $DESKTOP_DIR/applications ] ./installation-scripts/uninstall.sh:225: if [ ! -d /usr/share/icons/$dirname ] ./installation-tools/alterservice.pl:84: if ( ! -d $_ ) { next;} ./installation-tools/desktopRoutines.sh:7: if [ ! -d $DESKTOP_DIR/applications ] ./installation-tools/detectX11.pl:181:if (! -d $xmodules) ./installation-tools/examineSystem.pl:248:if ( ! -d $values{"x.modules"}) { $values{"x.modules"}.=" [MISSING]"; } ./installation-tools/examineSystem.pl:322: if ( -d $dir) ./installation-tools/examineSystem.pl:340: if ( -d $dir) ./installation-tools/examineSystem.pl:361: if ( -f $_ || -d $_) ./installation-tools/remove_if_identical:85: if ( -d $name) ./installation-tools/remove_if_identical:100: if ( -d $name) ./installation-tools/starboardservice:186: if [ -d $KERNELDRIVERPATH ]
Примечания
- ↑ После установки hasher необходимо создать вспомогательных пользователей и перезайти в систему.