DebianパッケージA-1.0.0.deb
(ライブラリを含む)と、A
ライブラリに依存する別のパッケージB-1.0.0.deb
(サービスを含む)があるとします。 A-1.0.1.deb
にアップグレードしたいとします。
このドキュメント によれば、dpkg
はかなり複雑なアルゴリズムを経て、アップグレードプロセスの一部として各パッケージに対してどのパッケージメンテナースクリプトが呼び出されるかを判断します。これらのステップのいくつかが失敗した場合、A
は何らかのリンボ状態のままになる可能性があります(たとえば、「Half-installed」)。
ただし、A
を壊すと、B
に依存するため、A
も壊れます。私の質問は、dpkg
にこの状況に対処するための組み込みの方法がありますか? B
のインストールステータスは、A
のステータスに応じて変わりますか?理想的には、dpkg
には、B
をインストール済み状態から別の状態に移動する組み込み機能があります(B
サービスがA
] _は健全です)が、dpkg
のドキュメントにはこれが行われていることを示唆するものは何も見つかりません。
dpkg
がこの状況をインテリジェントに処理しない場合、apt
は処理されますか?
私が読んだものではなく、私が経験したものから。
ただし、Aを壊すと、AはAに依存しているため、Bも壊れます。私の質問は、dpkgにはこの状況に対処するための組み込みの方法がありますか?
はい、次回の実行時にAを再インストールまたは再構成しようとします。
中断されたばかりの場合は、それを修正し、通常どおり動作し続けます。
しかし、制御スクリプトの問題であり、何度も失敗し、このループにとどまります。それはバグであり、そのパッケージに対してレポートが記入され、手動で修正する必要があります。
BのインストールステータスはAのステータスに応じて変わりますか?
いいえ、ステータスはInstalled no changeのままですが、少なくとも同じファイル内ではなく、破損した依存関係も追跡します/var/lib/dpkg/status
。
Dpkgがこの状況をインテリジェントに処理しない場合、aptはありますか?
いいえ、APTはこの場合、干渉しません。apt
はdpkg
を使用します。dpkgは実際にインストール、ビルドする唯一のツールです。 、Debianパッケージを削除します。
それを試してみましょう、virtualboxで行われます。
ダミーパッケージを準備する
~$ Sudo apt install equivs
~$ mkdir deleteme
~$ cd deleteme
B 1.0.0はAに依存
~/deleteme$ equivs-control b0
~/deleteme$ nano b0
...
Package: b
Version: 1.0.0
...
Depends: a
...
~/deleteme$ equivs-build b0
1.0.0のクリーンインストールと削除
~/deleteme$ equivs-control a0
~/deleteme$ nano a0
...
Package: a
Version: 1.0.0
...
~/deleteme$ equivs-build a0
1.0.1のダーティインストール、ただし完全削除
~/deleteme$ cp a0 a1
~/deleteme$ nano a1
...
Package: a
Version: 1.0.1
...
Postinst: a1.postinst
...
~/deleteme$ nano a1.postinst
#!/bin/sh
exit 1
~/deleteme$ equivs-build a1
今、あなたは持っている必要があります:
~/deleteme$ ls -1
a0
a1
a_1.0.0_all.deb
a_1.0.1_all.deb
a1.postinst
b0
b_1.0.0_all.deb
このシナリオを試してください
Sudo su
dpkg -i b_1.0.0_all.deb
dpkg --audit
dpkg -i a_1.0.0_all.deb
dpkg --audit
dpkg --configure -a
dpkg --audit
dpkg --remove a
dpkg --remove b
dpkg --remove a
dpkg -i a_1.0.0_all.deb
dpkg -i b_1.0.0_all.deb
dpkg --audit
dpkg -i a_1.0.1_all.deb
dpkg --audit
dpkg --remove a
apt purge a
インストールを完了できないループに入るには、削除もしません。
きれいなA 1.0.1、B 1.0.0を作成しますが、A 1.0.0にはPrerm:
を含むスクリプトexit 1
。したがって、A 1.0.1をインストールしようとすると、dpkgはA 1.0.0の削除に失敗します。
インストール済みパッケージA
の依存関係B
が変更された場合、apt-get update && apt-get upgrade
の実行後にエラーが表示されます。パッケージはkept back
としてマークされます。
The following packages have been kept back
B-1.0.0
dpkg
は役に立ちません。アップグレードが利用可能な場合はB-1.0.1
only apt-get dist-upgrade
が役立ちます。