Как создать поддельную установку пакета debian для использования в тестировании?
У меня есть пакет, который ранее предназначался только для дистрибутивов на основе RPM, для которых я сейчас создаю пакеты.deb для дистрибутивов на основе Debian.
Цель состоит в том, чтобы смоделировать тестовую установку из пространства пользователя, изолированного от системы, на которой вы строите. Он может быть многопользовательским, и вы не хотите требовать root-права только для сборки программного обеспечения. Многие из наших тестов уже имитируют структуру каталогов установки. Это для следующего шага, чтобы имитировать фактическую установку, используя собранные пакеты.
Для пакетов RPM я смог создать тестовые установки, используя:
WSDIR=/where/I/want/my/tests/to/run
rpmdb --initdb --dbpath "$WSDIR"/rpmdb
rpm --relocate /opt="$WSDIR"/opt --dbpath $WSDIR/rpmdb -i <package>.rpm
Эквивалент в мире Debian - это что-то вроде:
dpkg --force-not-root --admindir=$WSDIR/dpkg --root=$WSDIR/install --install "$DEB"
Тем не менее, я застрял над эквивалентом rpmdb --initdb
шаг.
Обратите внимание, что я могу просто распаковать архив, используя:
dpkg-deb -x "$DEB" $WSDIR/install
Но я бы предпочел быть ближе к тому, как установлен настоящий пакет. Также я не думаю, что это будет работать preinstall
а также postinstall
скрипты.
Подобные вопросы предложили использовать deboostrap
создать chroot
окружающая среда, но это создает совершенно новую установку. Помимо того, что это излишнее, оно слишком медленное для автоматического теста. Я намерен использовать это для быстрых тестов установочного пакета перед дальнейшим тестированием в реальных тестовых средах.
Мои эксперименты до сих пор:
(cd $WSDIR/dpkg && mkdir alternatives info parts triggers updates)
cp /var/lib/dpkg/status $WSDIR/dpkg/status
в лучшем случае привели к:
dpkg: error: unable to access dpkg status area: No such file or directory
который не указывает ясно, что не так.
Итак, как вы создаете каталог администратора dpkg?
Крест опубликован как https://superuser.com/questions/1271145/how-do-you-create-a-dpkg-admin-directory
Обновление 24/11/2017
Я попытался скопировать с помощью dpkg dir из среды, созданной [cowdancer][1] (которая использует deboostrap под капотом), или скопировать реальный из /var/lib/dpkg, но я все еще получаю то же сообщение об ошибке, так что, возможно, ошибка (и / или опция --admindir) не совсем то, что я думаю.
Обратите внимание, что:
sudo dpkg --force-not-root --root=$WSDIR/install --admindir=/var/lib/dpkg --install "$DEB"
работает. Так что это как-то связано с dir admin. Я также повторил вопрос, как "Как создать каталог администратора dpkg", это интересный вопрос, но ответ не обязательно является решением моей проблемы.
2 ответа
Минимальный способ создать базу данных dpkg - это что-то вроде этого:
$ mkdir -p db/{updates,info}
$ touch db/{status,diversions,statoverride}
Если вы хотите использовать его без полномочий root, в настоящее время лучшим способом является использование fakeroot
,
$ mkdir -p fsys
$ PATH=/sbin:/usr/sbin:$PATH fakeroot dpkg --log=/dev/null --admindir=db --instdir=fsys -i pkg.deb
Но учтите, что прохождение --root
после --admindir
или же --instdir
сбросит эти пути, что, я думаю, проблема у вас здесь.
Также используя sudo
а также --force-not-root
не имеет особого смысла?:) И определенно менее ограничен, чем использование просто fakeroot
, В ближайшее время можно будет бежать dpkg
полностью непривилегированный в каком-то местном дереве.
В конце концов я нашел на это ответ. Спасибо Гиллему Ховеру за это. Вставьте копию сюда:
mkdir fake
mkdir fake/install
mkdir -p fake/dpkg/info
mkdir -p fake/dpkg/updates
touch fake/dpkg/status
PATH=/sbin:/usr/sbin:$PATH fakeroot dpkg --force-script-chrootless --log=`pwd`/fake/dpkg.log --root=`pwd`/fake --instdir `pwd`/fake --admindir=`pwd`/fake/dpkg --install *.deb
Некоторые моменты, на которые следует обратить внимание:
--force-not-root
недостаточно.fakeroot
требуется.ldconfig
а такжеstart-stop-daemon
должен быть на пути. (отсюда PATH=/sbin:/usr/sbin:$PATH)Файл журнала необходимо переместить с значения по умолчанию
/var/log/dpkg.log
Порядок аргументов важен. Если используется
--root
должно быть до--instdir
а также--admindir
.Предполагается, что в качестве префикса админдира должен быть установлен каталог.
Если пакет содержит какие-либо сценарии до или после установки (preinst, postinst), то требуется --force-script-chrootless, поскольку эти сценарии обычно запускаются через chroot(), что дает недопустимую операцию при попытке выполнить под fakeroot.
Для быстрого тестирования тривиальных зависимостей вы можете напрямую установить в систему, используя 'dpkg -i', затем 'dpkg -P' и 'apt-get autoremove', чтобы очистить пакет и очистить зависимости.
Другим более безопасным, но более медленным решением может быть использование пакета autopkgtest: https://people.debian.org/~mpitt/autopkgtest/README.package-tests.html