Linuxで壊れたパッケージを修正する方法

Linuxのパッケージマネージャー、AptやDNFは非常に強力で直感的ですが、物事がうまくいかないこともあります。時折、パッケージのインストールが失敗し、あなたはその後始末をしなければなりません。パッケージマネージャーには、壊れたパッケージを修正し、壊れた更新をスキップしてシステムを再稼働させ、将来のトラブルを回避する能力があります。
この記事では、Linuxで壊れたパッケージを修正する方法を説明します。これらの修正は、ほとんどのケースであなたを助けるはずです。
目次
- Ubuntu/Mint/Debianでの壊れたパッケージの修正
- Fedora/CentOS/RHELでの壊れたパッケージの修正
- Archでの壊れたパッケージの修正
- よくある質問
Ubuntu/Mint/Debianでの壊れたパッケージの修正
Aptには、インストール中に何らかの理由で壊れた依存関係やパッケージを修正するためのいくつかのフラグがあります。ここで一般的な使用法は、サードパーティの.debをインストールし、それに関する依存関係がわからないことです。それらの依存関係はおそらく自動的には引き込まれず、dpkgは依存関係を解決できないと文句を言います。いずれにせよ、次の手順を試すことができます。
注意: 以下の修正を試みる前に、Aptの動作を学んでください。

- 必要なパッケージの新しいバージョンがないことを確認するために、更新を実行します:
sudo apt --fix-missing update- 問題のあるパッケージを再度インストールしようとする際に、Aptに欠落している依存関係や壊れたパッケージを探して修正させます。これにより、欠落している依存関係がインストールされ、既存のインストールが修復されます:
sudo apt install-fDPKG設定の問題を修正する
パッケージインストール中にエラーが発生する別の場所は、設定プロセスです。裏で、dpkgがこの部分を処理するため、パッケージが設定中に失敗した場合、dpkgが修正するためのツールです。

- まず、壊れたまたは部分的に設定されたパッケージを再構成するようにdpkgを強制します:
sudodpkg--configure-a- それでも問題が解決しない場合は、より強力なアプローチを取ります。dpkgが再インストールを必要としているとマークしたパッケージをリストします:
sudodpkg-l|grep ^..r上記のコマンドは、問題を引き起こしているパッケージを表示します。この次のステップでは、再インストールのためにマークされたパッケージが本当に壊れていることを確認します。sudo apt reinstallを実行し、どのパッケージが再インストールに失敗するかに注意を払います。
- 再インストールに失敗した各パッケージについて、名前を取得し、壊れたパッケージを強制的に削除します:
sudodpkg--remove--force-remove-reinstreq[package name]- Dpkgは今やクリーンであるべきです。Aptでクリーンアップを行います:
sudo apt clean &&sudo apt update運が良ければ、元の状態に戻るでしょう。壊れたパッケージはインストールされませんが、少なくともAptは再び機能し、元々インストールしようとしていたパッケージとその依存関係をインストールするために戻ることができます。
永続的なDPKGロック
dpkgロックによって何もできなくなるというあまり一般的でない問題があります。Aptやdpkgを使用しようとするたびに、別のアプリケーションがすでにそれを使用しているというエラーが表示されます…実際にはそうではないのですが。
Aptを使用できるようにするためにロックファイルを削除するのは簡単です。時には、インストールエラーや停電の後にこれらのロックファイルが残り、プロセスを妨げ、自動的にファイルが削除されるのを防ぎます。この場合、自分で行う必要があります。
sudorm/var/lib/apt/lists/lock念のため、キャッシュ内のロックも削除します。
sudorm/var/cache/apt/archives/lock警告: このロックを削除する前に、それが使用されていないことを確認してください。Ubuntuでは、システムと一緒に起動するアップデーターがあり、更新を検索しているときにDPKG/APTをロックします。アップデーターが実行中かどうかわからない場合は、Winキーを押してアクティビティセンターを表示し、「ソフトウェアアップデーター」と入力してEnterを押して開きます。

アップデーターが実行できないと言っていて、バックグラウンドでパッケージマネージャーが実行されているターミナルが開いていない場合は、上記の指示に従ってください。
壊れたパッケージの問題の代わりにソフトウェアセンターが機能しない問題に直面している場合は、修正があります。
Fedora/CentOS/RHELでの壊れたパッケージの修正
Fedora/CentOS/RHELでの壊れたパッケージの修正はあまり一般的ではありません。dnfは、パッケージが正しくインストールされるように非常に優れた作業を行います。それでも完璧ではなく、パッケージ管理で混乱することがあります。
注意: Fedora、CentOS、RHELの違いを学んでください。
1. 問題のあるパッケージをリストする
RHELベースのシステム(Fedoraなど)でこれを解決するためのコマンドは:
sudo rpm -Va
-Vオプションは確認するためのもので、インストールされたファイルの情報をrpmデータベースに保存されている情報と比較します。-aを付けると、すべてのコアパッケージを確認します。これは少し役に立たないことが多く、通常は長いファイルのリストを提供しますが、特定のアプリケーションに問題がある場合の出発点を提供することができます。
たとえば、ターミナルで「missing」とマークされたものを見ると、その特定のパッケージに欠落しているファイルがあることを示します。
2. 再インストールを試みる
リストに表示される問題のあるパッケージに対してdnf reinstallを実行します。
sudo dnf --refresh reinstall [package name]これにより、すべてのメタデータが期限切れとして設定され、すべての有効なリポジトリをクロールしてそのパッケージの新しいバージョンを探します。そのパッケージに壊れた依存関係がある場合、DNFはおそらく文句を言い、--skip-brokenフラグを使用するように指示します。これにより、そのパッケージは完全にスキップされ、通常通りにシステムを更新できます。
3. 最後の手段 – パッケージを削除する
更新を完了するために--skip-brokenを使用しなければならない場合、システムの衛生上、完全に削除する方が良いです。
再インストールに失敗したパッケージの名前を覚えておき、それをアンインストールします:
sudo dnf remove [package name]ここで最悪の事態は、ブラウザなどの日常の流れのコア部分を削除してしまい、代替手段を見つけなければならないことです。
ヒント: Fedoraでパッケージをより良く管理するためにflatpakの使い方を学んでください。
Archでの壊れたパッケージの修正
Archのパッケージマネージャーは、ここにリストされている他のものといくつかの類似点があります(つまり、データベースロックファイルがあり、依存関係を同様の方法で引き込む)が、その論理の構造に関してはまったく異なる存在です。問題を診断する最初のステップは、リポジトリが最新であることを確認し、完全なアップグレードを試みることです:
sudo pacman -Syuパッケージのインストールやシステムのアップグレードの試みがまだ失敗する場合、ターミナルがあなたに伝えたことに基づいて原因を特定する必要があります。
注意: 修正を試みる前にpacmanの動作を学んでください。
「無効または破損したパッケージ」
「pacman.conf」を何らかの方法で変更すると、pacmanがパッケージを誤って破損としてラベル付けする問題が発生する可能性があります。最も可能性の高い原因は、パッケージマネージャーキャッシュ内の部分的(「.part」)ファイルであり、解決策はそれを削除することです:
sudofind/var/cache/pacman/pkg/-iname"*.part"-deleteインストールしようとしているパッケージが実際に破損していて、Archのパッケージマネージャーに有効なメタデータを提供していない可能性もあります。その場合、パッケージのメンテナーが更新するのを待つ必要があります。パッケージがシステムにインストールされていて、アップグレード中に問題を引き起こしている場合は、次のコマンドで削除します:
sudo pacman -Rns[package name]「データベースをロックできません」
Debianのaptと同様に、Archのパッケージマネージャーは操作中にロックファイルを作成します。停電が発生したり、pacmanがハードインタラプトを受けてロックを削除できなかった場合、ロックファイルが残る可能性が非常に高いです。
まず、コンピュータ上のどのプロセスがまだファイルを使用しているかを確認します:
sudofuser/var/lib/pacman/db.lck上の画像では、ID 121497のプロセスがファイルロックを使用しています。プロセスについて興味がある場合は、psを使用します:
ps-p[PID#]私の場合、別のpacmanインスタンスがロックファイルを所有しています。ロックを削除する最も安全な方法は、まずそのプロセスを終了させることです:
sudokill[PID#]プロセスが終了したので、ロックファイルを削除します:
sudorm/var/lib/pacman/db.lckこれで大丈夫です!
「競合するファイル/ファイルがファイルシステムに存在します」
これは、アップグレード中にpacmanが所有権の競合を検出する際に発生します。何かを修正する前に、パッケージマネージャーが不満を持っているファイルのパスに注意を払ってください。
ファイルの所有者を見つけるには:
pacman -Qo[path to the file]それがユーザーによって所有されている場合は、他のパッケージではなく、単に削除します:
sudorm[path to the file]他のパッケージによって所有されている場合、最も安全なことは、パッケージのメンテナーがこの競合を自分で修正するのを待つことです。しかし、時にはそれが選択肢ではなく、今すぐに物事を進めたいと思うこともあります。
これを達成する最も簡単な方法は、pacmanで--overwriteフラグを使用することです。ただし、これは一般的に安全ではなく、システム内の一部のアプリケーションが正しく動作しない可能性があります。実行する前にバックアップを作成することをお勧めします。
--overwriteフラグを使用すると、Archのパッケージマネージャーは特定のファイルの所有権ルールを無視し、更新を強行することができます。例:
sudo pacman -Syu--overwrite[file name]上記のコマンドが機能しない場合は、ファイル名をその絶対パスに置き換えます。いくつかのユーザーは、パスの前のスラッシュ(「/」)を削除すると、コマンドが頑固なときに機能することを報告しています。
または、pacmanに必要なすべてを上書きするように指示することもできます:
sudo pacman -Syu--overwrite='*'「無効または破損したパッケージ(PGP署名)」
メンテナンスが不十分なパッケージでは、開発者がパッケージを認証するデジタル署名を適切に更新する時間や意欲がない場合があります。これにより、インストール中にターミナルに「[誰か]からの署名は限られた信頼です」というメッセージが表示され、その後パッケージマネージャーがファイルを削除するかどうかを尋ねることになります。
署名の更新は完全にメンテナーに依存するため、ターミナルから状況を修正するために現実的にできることは何もありません。更新を行い、パッケージを保持したい場合は、そのパッケージに対して特に--ignoreフラグを使用します:
sudo pacman -Syu--ignore[package name]多くのパッケージでこれが発生する場合、キーリングが古くなっている可能性があります。次のコマンドで更新します:
sudo pacman -S archlinux-keyringよくある質問
AURヘルパーでArchの修正を適用できますか?
一般的に、はい。この記事のコマンド内で「pacman」をAURヘルパーに置き換えます。例: yay -Qo /path/to/file
更新を中断した場合はどうすればよいですか?
Ctrl + Cを押したり、パッケージマネージャーのプロセスを強制終了したり、ターミナルを早期に閉じたりすると、パッケージデータベースに何らかのレベルの破損が発生し、他の何かをインストールしようとしたときに問題が複雑になる可能性があります。これを修正するには、キャッシュをクリアし、更新を繰り返します。
画像クレジット: Flickr. すべてのスクリーンショットはMiguel Leiva-Gomezによるものです。