壊れた荷物の管理方法

壊れた荷物の管理方法

Ubuntuユーザーは時々、aptまたはapt-get、形式は次のようになります。

The package some-package needs to be reinstalled, but I can't find an archive for it.

壊れたパッケージが重要で多くの依存関係がある場合でも、このエラーを再現して安全に修正する方法を見つけられるように、このエラーの原因を知りたいです。このビットAPT ソースコード少しは手がかりになるかもしれませんが、パッケージがエラーの原因となるステータスを取得する方法がわかりません。

(Ubuntu MATE 17.10) システムでテストするときにこのエラーを生成するにはどうすればよいですか?

これは、最近の Ask Ubuntu の質問そして、この誤りについての質問を締め切ることに対する私の長年の不快感はApt/Synaptic はパッケージを再インストールする必要がありますが、アーカイブが見つかりません、その回答を使用して、dpkg --force-all問題のあるパッケージを削除します。匿名のフィードバックこの解決策は多くのユーザーにとって有効であることが示唆されていますが、使用することで--force-all後で問題が発生しないかどうか、またはこの方法を使用して APT などの重要なパッケージを削除するのが良い考えであるかどうかは自信がありません。

答え1

「Apt/Synaptic はパッケージを再インストールする必要がありますが、そのアーカイブが見つかりません」というエラーは、特定の原因が特定できない場合があります。

このエラーが最もよく見られるのは、Ubuntu をあるバージョンから別のバージョンにアップグレードするときです。

注記: Ubuntuはapt-getからaptに移行中ですが、この記事ではapt-getを使用しています。詳細については、およびを参照してくださいman apthttps://www.debian.org/doc/manuals/debian-reference/ch02.en.html

このエラーの最も一般的な原因は、ユーザーがパッケージをインストールした後、.debを削除した場合です。通常は、sudo apt-get clean

http://manpages.ubuntu.com/manpages/zesty/man8/apt-get.8.html

クリーン

       clean clears out the local repository of retrieved package files.
       It removes everything but the lock file from
       /var/cache/apt/archives/ and /var/cache/apt/archives/partial/

その後、ある時点で、dpkg --reconfigureユーザーによって、またはアップグレードによって、またはある時点でユーザーがパッケージを再インストールしようとして再インストールされるsudo apt-get --reinstall fooか、何らかのバリエーションによって、が呼び出されます。

パッケージが削除された(まれ)、リポジトリがシステムから削除された、またはアップグレードされてパッケージが新しいリポジトリに存在しないなどの理由で、apt がリポジトリ内の .deb を見つけられない場合は、「Apt/Synaptic はパッケージを再インストールする必要がありますが、そのアーカイブが見つかりません」というエラーが表示されます。


しかし、エラーは他の原因から発生する可能性があります。

dpkgのマニュアルページから関連セクションを引用します(http://manpages.ubuntu.com/manpages/trusty/man1/dpkg.1.html詳細については )

パッケージに関する情報 dpkg は、利用可能なパッケージに関する有用な情報を保持しています。情報は、状態、選択状態、フラグの 3 つのクラスに分かれています。これらの値は、主に dselect を使用して変更することを目的としています。

パッケージの状態

   not-installed
          The package is not installed on your system.

   config-files
          Only the configuration files of the package exist on the system.

   half-installed
          The  installation  of  the  package  has  been  started, but not
          completed for some reason.

   unpacked
          The package is unpacked, but not configured.

   half-configured
          The package is unpacked and configuration has been started,  but
          not yet completed for some reason.

   triggers-awaited
          The package awaits trigger processing by another package.

   triggers-pending
          The package has been triggered.

   installed
          The package is unpacked and configured OK.

行動

   -i, --install package-file...
          Install the package. If --recursive or -R option  is  specified,
          package-file must refer to a directory instead.

          Installation consists of the following steps:

          1. Extract the control files of the new package.

          2.  If  another version of the same package was installed before
          the new installation, execute prerm script of the old package.

          3. Run preinst script, if provided by the package.

          4. Unpack the new files, and at the same time back  up  the  old
          files, so that if something goes wrong, they can be restored.

          5.  If  another version of the same package was installed before
          the new installation, execute  the  postrm  script  of  the  old
          package.  Note  that  this  script is executed after the preinst
          script of the new package, because new files are written at  the
          same time old files are removed.

          6.   Configure   the   package.  See  --configure  for  detailed
          information about how this is done.

--パッケージを構成...|-a|--pending

          Configure  a  package  which  has  been  unpacked  but  not  yet
          configured.  If -a or --pending is given instead of package, all
          unpacked but unconfigured packages are configured.

          To reconfigure a package which has already been configured,  try
          the dpkg-reconfigure(8) command instead.

          Configuring consists of the following steps:

          1.  Unpack  the  conffiles, and at the same time back up the old
          conffiles, so that they can be restored if something goes wrong.

          2. Run postinst script, if provided by the package.

   /var/lib/dpkg/status

          Statuses  of  available packages. This file contains information
          about whether a package is marked for removing or  not,  whether
          it  is  installed  or  not,  etc.  See section INFORMATION ABOUT
          PACKAGES for more info.

マニュアルページが tl;dr の場合 -> インストールの一環として、 .deb / dpkg / apt はインストール前 / インストール後のスクリプトやその他の機能を実行します。これらのインストール / 削除スクリプトがさまざまな理由で失敗した場合、パッケージは「半分インストール済み」(またはインストールされていない / インストール済み以外の状態) としてマークされます。そのクリーンでない状態では、「Apt/Synaptic はパッケージを再インストールする必要がありますが、そのアーカイブが見つかりません」というエラーが表示されることもあります。この例では、問題はアーカイブが見つからないことではなく、インストール前 / インストール後のスクリプトの問題であり、それらを再実行しても解決できません。したがって、エラーは時々特定されません。


壊れた荷物の管理方法

  1. まず、適切な PPA / リポジトリ (たとえば、universe) または必要なリポジトリが有効になっていることを確認して、依存関係を修正してみてください。

    そして悪名高い

    sudo apt-get install -f
    

    読む出力とエラー メッセージを確認し、ヘルプが必要な場合はコマンドと出力をここに投稿してください。

  2. 再構成を試みる

    sudo dpkg --configure -a
    

    これにより、設定スクリプトが実行されます。-a ではなくパッケージを指定することもできますが、問題が発生している場合は -a の方が役立ちます。

    読む出力とエラー メッセージを確認し、ヘルプが必要な場合はコマンドと出力をここに投稿してください。

    失敗したスクリプトを確認し、可能であればスクリプト内のエラー/問題を修正してください。

  3. 問題のあるパッケージを、必要であれば強制的に削除してみてください。重要なパッケージや、さらに悪いことに重要なパッケージのセットを強制的に削除してしまう可能性があるため、ここでは非常に注意する必要があります。次のコマンドは、丁寧なものからあまり丁寧でない、そして完全に強制的なものまであります。順番に試してください。

    sudo dpkg --remove $broken_package
    sudo dpkg --remove --force-remove-reinstreq $broken_package
    sudo dpkg --remove --force-all $broken_package
    

    これらのいずれかが機能する場合は、 を実行します。また、および/またはもsudo apt-get update && sudo apt-get upgrade実行する必要がある可能性があります。sudo apt-get -f installsudo dpkg --configure -a

  4. それが失敗した場合は、パッケージを手動で削除する必要があります。これには、システム上のすべてのコンポーネントを見つけて手動で削除することが必要になる場合があります。

    以下の手順で

    dpkg情報を削除します(上記参照)

    cd /var/lib/dpkg/info
    sudo rm -i package_name*
    

    ここで必要以上に削除しないように注意してください。

    最後に問題のあるパッケージを削除します

    sudo dpkg --remove --force-remove-reinstreq package_name
    

    これでaptが使えるようになるはずです

    sudo apt-get update
    sudo apt-get install -f
    sudo apt-get upgrade
    
  5. 必要な場合にのみ、システムに残っているファイルを見つけて手動で削除します。これは手動の手順であり、設定ファイルや/etcマニュアル ページ、共有データが含まれる場合があります。残っている可能性のあるファイルを特定するには、find または locate を使用します。

    当然のことながら、システム ファイルを削除するときは細心の注意を払う必要があります。理解できないものや、そのコマンドが何を行うかを理解せずに使用しないものは削除しないでくださいrm -Rf。オプションで確認を求めるrm -iので、おそらくこれがより適切です。-i


この問題を再現する

/var/lib/dpkg/infoこのエラーメッセージは、任意のパッケージのdpkgステータスファイルを手動で編集し、ステータスを半分インストール済みに変更することで再現できる場合があります。

sudo nano /var/lib/dpkg/info/some_package

ステータス行を次のように編集します。

ステータス: purge reinstreq が半分インストールされました

次に、 を実行してみてくださいapt-get

それでも問題が解決しない場合は、PPA からパッケージをインストールし、apt-get clean を実行して、PPA を削除してから、パッケージを再インストールまたは再構成してみてください。

長い投稿で申し訳ありませんが、この複雑なエラー メッセージ「Apt/Synaptic はパッケージを再インストールする必要がありますが、アーカイブが見つかりません」の原因と解決方法についての洞察が得られることを願っています。

関連情報