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

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


== Примечания ==
== Примечания ==
{{примечания}}
{{примечания}}

Версия от 16:18, 6 марта 2011

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


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

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

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

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

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

Да, действительно почему-то авторы исходного пакета решили упаковать корень.

Запускаем mc mc, смотрим содержимое пакета, входя в него, как в архив. В частности, нас интересуют действия, выполняемые в сценариях установки. Они находятся в INFO/SCRIPTS/ во внутренностях пакета. Смотрим скрипты, ужасаемся и решаем, что ни в коем случае не следует устанавливать этот пакет как есть.

Зато видим, что в пункте 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

Примечания

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