web-dev-qa-db-ja.com

Debianパッケージをアップグレードすると、依存するDebianパッケージはどうなりますか?

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は処理されますか?

5
Ricky Stewart

私が読んだものではなく、私が経験したものから。

  • ただし、Aを壊すと、AはAに依存しているため、Bも壊れます。私の質問は、dpkgにはこの状況に対処するための組み込みの方法がありますか?

    はい、次回の実行時にAを再インストールまたは再構成しようとします。

    1. 中断されたばかりの場合は、それを修正し、通常どおり動作し続けます。

    2. しかし、制御スクリプトの問題であり、何度も失敗し、このループにとどまります。それはバグであり、そのパッケージに対してレポートが記入され、手動で修正する必要があります。

  • BのインストールステータスはAのステータスに応じて変わりますか?

    いいえ、ステータスはInstalled no changeのままですが、少なくとも同じファイル内ではなく、破損した依存関係も追跡します/var/lib/dpkg/status

  • Dpkgがこの状況をインテリジェントに処理しない場合、aptはありますか?

    いいえ、APTはこの場合、干渉しません。aptdpkgを使用します。dpkgは実際にインストール、ビルドする唯一のツールです。 、Debianパッケージを削除します。


それを試してみましょう、virtualboxで行われます。

  1. ダミーパッケージを準備する

    ~$ 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
    
  2. このシナリオを試してください

    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
    
  3. インストールを完了できないループに入るには、削除もしません。

    きれいなA 1.0.1、B 1.0.0を作成しますが、A 1.0.0にはPrerm:を含むスクリプトexit 1。したがって、A 1.0.1をインストールしようとすると、dpkgはA 1.0.0の削除に失敗します。

6
user.dz

インストール済みパッケージ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.1only apt-get dist-upgradeが役立ちます。

0
GAD3R