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

Материал из ALT Linux Wiki
(→‎Исследование пакета: Добавлена автоматизация установки)
мНет описания правки
 
(не показано 16 промежуточных версий 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}}.


Строка 143: Строка 154:
  #Получаем список файлов до работы скрипта
  #Получаем список файлов до работы скрипта
  $prefix find / > $root/.out/filelist.1
  $prefix find / > $root/.out/filelist.1
  #Запускаем скрипт
  #Запускаем скрипт, что-то вытворяющий с системой, которую нам не жалко
  $prefix $sroot/installation-scripts/install.sh
  $prefix $sroot/installation-scripts/install.sh
  #Получаем список файлы после работы скрипта
  #Получаем список файлов после работы скрипта
  $prefix find / > $root/.out/filelist.2
  $prefix find / > $root/.out/filelist.2
  #Получаем список, отражающий, что этот скрипт натворил
  #Получаем список, отражающий, что этот скрипт натворил
Строка 151: Строка 164:
  #И как повлиял на содержимое файлов настройки
  #И как повлиял на содержимое файлов настройки
  $prefix diff -Naur /.res/etc /etc > $root/.out/etc.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 необходимо создать вспомогательных пользователей и перезайти в систему.