web-dev-qa-db-ja.com

テストで使用するためのdebianパッケージの偽のインストールをどのように作成しますか?

これは元々stackoverflowに投稿されました( https://stackoverflow.com/questions/47099045/how-do-you-create-a-dpkg-admin-directory )が、おそらく代わりにここに属します

以前はRPMベースのディストリビューションのみを対象としていたパッケージがあり、現在はDebianベースのディストリビューション用の.debパッケージを構築しています。

目的は、構築しているシステムから分離されたユーザースペースからのテストインストールをシミュレートすることです。マルチユーザーの可能性があり、ソフトウェアをビルドするためだけにルートアクセスを要求したくない場合があります。テストの多くは、すでにインストールディレクトリ構造をシミュレートしています。これは、ビルドされたパッケージを使用して実際のインストールをシミュレートするための次のステップです。

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

これは何が悪いのか明確に示しているわけではありません。

では、どのようにdodpkg管理ディレクトリを作成しますか?


2017年11月24日更新

cowdancer (内部でdeboostrapを使用)によって作成された環境からdpkg dirを使用してコピーしようとしたか、/ var/lib/dpkgから実際のディレクトリをコピーしようとしましたが、それでも同じエラーメッセージが表示されますしたがって、おそらくエラー(および/または--admindirオプション)は、私が考えていることをまったく意味していません。

ご了承ください:

Sudo dpkg --force-not-root --root=$WSDIR/install  --admindir=/var/lib/dpkg --install "$DEB"

動作します。つまり、これはadmindディレクトリと関係があります。

また、「dpkg adminディレクトリをどのように作成するか」という質問のタイトルを変更しましたが、答えは必ずしも私の問題の解決策ではありません。

1
Bruce Adams

Guillem Jover( https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=8837 を参照)と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が必要です。

  • ldconfigstart-stop-daemonがパス上にある必要があります。 (したがって、PATH =/sbin:/ usr/sbin:$ PATH)

  • ログファイルは、デフォルトの/var/log/dpkg.logから再配置する必要があります

  • 引数の順序は重要です。使用する場合、--root--instdirおよび--admindirの前になければなりません。

  • Admindirには、プレフィックスとしてインストールディレクトリが必要です。

  • パッケージにインストール前またはインストール後のスクリプト(preinst、postinst)が含まれている場合、これらのスクリプトは通常chroot()を介して実行されるため、-force-script-chrootlessが必要です。

2
Bruce Adams