これは元々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ディレクトリをどのように作成するか」という質問のタイトルを変更しましたが、答えは必ずしも私の問題の解決策ではありません。
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
が必要です。
ldconfig
とstart-stop-daemon
がパス上にある必要があります。 (したがって、PATH =/sbin:/ usr/sbin:$ PATH)
ログファイルは、デフォルトの/var/log/dpkg.log
から再配置する必要があります
引数の順序は重要です。使用する場合、--root
は--instdir
および--admindir
の前になければなりません。
Admindirには、プレフィックスとしてインストールディレクトリが必要です。
パッケージにインストール前またはインストール後のスクリプト(preinst、postinst)が含まれている場合、これらのスクリプトは通常chroot()を介して実行されるため、-force-script-chrootlessが必要です。