Сборка проприетарного пакета с нуля: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
мНет описания правки
 
(не показано 17 промежуточных версий 5 участников)
Строка 1: Строка 1:
[[Категория:HOWTO]]
[[Категория:Руководства]]
{{Stub}}
{{Stub}}


Строка 10: Строка 8:
* [ftp://ftp.altlinux.org/pub/people/becase/whiteboards/StarBoard/StarBoardSoftware-9.2.i586.rpm Пакет], который необходимо пересобрать для Сизифа.
* [ftp://ftp.altlinux.org/pub/people/becase/whiteboards/StarBoard/StarBoardSoftware-9.2.i586.rpm Пакет], который необходимо пересобрать для Сизифа.
* Ну, и самое главное, желание этим заниматься.
* Ну, и самое главное, желание этим заниматься.
Если нет желания глубоко погружаться, можно выполнить
$ epm repack сторонний.rpm
и получить пригодный к установке пакет.


== Исследование пакета ==
== Исследование пакета ==
Строка 40: Строка 42:
  %files
  %files
  %changelog
  %changelog
Выполняем {{cmd|rpmbuild -bb perl-strict.spec}}
Выполняем  
* {{cmd|rpmbuild -bb perl-strict.spec}}
  Обрабатываются файлы: perl-strict-1.0-alt1
  Обрабатываются файлы: perl-strict-1.0-alt1
  Provides: perl(strict)
  Provides: perl(strict)
  Записан: /home/becase/RPM/RPMS/noarch/perl-strict-1.0-alt1.noarch.rpm
  Записан: /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}}
Ставим наш самособранный пакет в hasher:  
* {{cmd|hsh-install -v `pwd`/perl-strict-1.0-alt1.noarch.rpm}}


=== Вторая попытка установки ===
=== Вторая попытка установки ===
Второй подход к установке: {{cmd|hsh-install -v `pwd`/StarBoardSoftware-9.2.i586.rpm}}
Второй подход к установке:  
* {{cmd|hsh-install -v `pwd`/StarBoardSoftware-9.2.i586.rpm}}


Получаем вывод:
Получаем вывод:
Строка 59: Строка 64:
Из этого следует, что пакет перед установкой пытается выполнить какой-то скрипт preinst, далее нам не позволяют устанавливать корень системы.
Из этого следует, что пакет перед установкой пытается выполнить какой-то скрипт preinst, далее нам не позволяют устанавливать корень системы.


Смотрим {{cmd|rpm -qlp StarBoardSoftware-9.2.i586.rpm {{!!}} less head -n5}}
Смотрим  
* {{cmd|rpm -qlp StarBoardSoftware-9.2.i586.rpm {{!!}} less head -n5}}
  /
  /
  /usr
  /usr
Строка 65: Строка 71:
  /usr/local/HitachiSolutions
  /usr/local/HitachiSolutions
  /usr/local/HitachiSolutions/StarBoard
  /usr/local/HitachiSolutions/StarBoard
Да, действительно почему-то авторы исходного пакета решили упаковать корень.
Да, действительно почему-то авторы исходного пакета решили упаковать корень. В связи с этим, при установке этого пакета rpm пытается обновить дату создания {{path|/}}.


Запускаем mc {{cmd|mc}}, смотрим содержимое пакета, входя в него, как в архив. В частности, нас интересуют действия, выполняемые в сценариях установки. Они находятся в {{path|INFO/SCRIPTS/}} во внутренностях пакета. Смотрим скрипты, ужасаемся и решаем, что ни в коем случае не следует устанавливать этот пакет как есть.
Посмотрим установочные скрипты пакета.
Запускаем 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}}.
Зато видим, что в пункте postinstall выполняется команда  
* {{cmd|/usr/local/StarBoardSoftware/installation-scripts/install.sh binary uspace app}}
Здесь-то и находится вся логика установки!
Здесь-то и находится вся логика установки!


=== Извлечение файлов из пакета ===
=== Извлечение файлов из пакета ===
Достаём файлы из пакета без установки: {{cmd|rpm2cpio StarBoardSoftware-9.2.i586.rpm {{!!}} cpio -i}}
Достаём файлы из пакета без установки:  
* {{cmd|rpm2cpio StarBoardSoftware-9.2.i586.rpm {{!!}} cpio -i}}
Как мы и ожидали, у нас появился каталог {{path|usr}}.
Как мы и ожидали, у нас появился каталог {{path|usr}}.


Строка 91: Строка 102:
  уничтожить все непереданные копии.  
  уничтожить все непереданные копии.  
Значит, можно пакет пересобрать для Сизифа.
Значит, можно пакет пересобрать для Сизифа.
Под лицензией 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}}}}
[[Категория:Использование Epm]]

Текущая версия от 19:53, 14 мая 2023

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Данное руководство покажет, как правильно собрать пакет RPM в Sisyphus с нуля в инфраструктуре Gear и git.alt, не имея исходного кода пакета, на примере пакета StarBoardSoftware.

Входные требования

Если нет желания глубоко погружаться, можно выполнить

$ epm repack сторонний.rpm

и получить пригодный к установке пакет.

Исследование пакета

Первым делом нужно исследовать пакет на его кривость.

Для начала смотрим список файлов, которые появляются после установки пакета: 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 ]

Примечания

  1. После установки hasher необходимо создать вспомогательных пользователей и перезайти в систему.