Apt や DNF のような Linux パッケージマネージャは非常に強力で直感的ですが、だからといって物事がうまくいかないというわけではありません。時折、パッケージのインストールがうまくいかず、破片を拾わなければならなくなることがあります。パッケージマネージャは壊れたパッケージを修正したり、壊れたアップデートをスキップする機能を持っており、システムを再び動作させ、将来的なトラブルを回避することができます。

この記事では、Linux で壊れたパッケージを修正する方法について説明します。これらの修正は、ほとんどの場合において、問題を解決するのに役立つはずです。

Ubuntu/Mint/Debian で壊れたパッケージを修正する

Apt には、欠落している依存関係や、インストール中に何らかの理由で壊れてしまったパッケージを修正するためのフラグがいくつかあります。よくあるのは、サードパーティの .deb をインストールしたら、知らない間に依存関係ができていた、というような場合です。これらの依存関係はおそらく勝手に引き込まれることはなく、 dpkg は依存関係を解決できないと文句を言うでしょう。いずれにせよ、以下の手順を試してみてください。

注意: 以下の修正を試みる前に、Aptがどのように動作するかを学んでください。

  1. アップデートを実行して、必要なパッケージの新しいバージョンが存在しないことを確認します。
 sudo apt --fix-missing update を実行します。
    1. 問題のあるパッケージを再度インストールしようとしたときに、Apt に欠落している依存 関係や壊れているパッケージを探させ、修正させます。これにより、欠落している依存関係をインストールし、既存のインストールを修 正することができます。
sudo apt install -f

DPKG 設定の問題を修正する

パッケージのインストールでエラーが出る可能性があるもう一つの場所は、設定プロセスです。裏側では dpkg がこの部分を担当しているので、設定中にパッケージが失敗した場合、dpkg がそれを修正するツールになります。

  1. まず、壊れたパッケージや部分的に設定されたパッケージを、dpkg に強制的に再設定させることから始めましょう。
sudo dpkg --configure -a
  1. それでも問題が解決しない場合は、より強力なアプローチをとってください。まず、dpkg が再インストールが必要だとマークしたパッケージの一覧を表示し ます。
sudo dpkg -l | grep ^..r

上記のコマンドで、問題のあるパッケージが表示されます。次のステップでは、再インストールが必要だとマークされたパッケージが本当に壊れているのかどうかを確認します。sudo apt reinstall` を実行し、どのパッケージが再インストールに失敗するかに注 目してください。

    1. 再インストールに失敗した各パッケージについて、名前を調べて、壊れたパッケ ージを強制的に削除してください。
sudo dpkg --remove --force-remove-reinstreq [パッケージ名].
  1. これで Dpkg はきれいになったはずです。Aptでクリーンアップを行います。
sudo apt clean && sudo apt update

運が良ければ、これで最初の状態に戻れます。インストールしようとした壊れたパッケージは手に入りませんが、少なくとも Apt は再び機能するようになり、元々インストールしようとしていたパッケージとその依存関係をインストールするために、Apt を使用するように戻ることができるようになります。

永久的な DPKG ロック

あまり一般的ではありませんが、dpkg ロックによって何もできなくなる問題があります。Apt や dpkg を使おうとするたびに、他のアプリケーションがすでに使っている というエラーが出ます……使っていないのですが……。

Aptの使用を妨げているロックファイルを削除して、必要な作業に戻るのは簡単です。インストールエラーや停電の後、これらのロックファイルが残ってしまい、プロセスが中断され、ファイルが自動的に削除されなくなることがあります。この場合、自分で削除する必要があります。

sudo rm /var/lib/apt/lists/lock

念のため、キャッシュにあるロックを削除します。

sudo rm /var/cache/apt/archives/lock

警告 です。このロックを削除する前に、使用されていないことを確認してください。Ubuntuでは、システムとともに起動するアップデータがあり、アップデートを検索する際にDPKG/APTをロックしています。アップデータが起動しているかどうかわからない場合は、Winキーを押してアクティビティセンターを表示させ、「Software Updater」と入力し、Enterキーを押して開いてみてください。

アップデータが実行できないと表示され、バックグラウンドでパッケージマネージャを実行しているターミナルが開いていない場合、上記の手順を実行してください。

壊れたパッケージの問題の代わりに、ソフトウェアセンターが機能しない問題に直面している場合、我々は修正策を用意しています。

Fedora/CentOS/RHEL で壊れたパッケージを修正する

Fedora/CentOS/RHEL で壊れたパッケージを修正するのは、あまり一般的ではありません。dnf` はパッケージが正しくインストールされていることを確認するために、本当に素晴らしい仕事をしてくれます。とはいえ、まだ完璧ではありませんし、パッケージの管理で混乱することもあります。

Note: Fedora、CentOS、RHEL の違いを学びましょう。

1. 面倒なパッケージのリストアップ

Fedora のような RHEL ベースのシステムでこれを整理するコマンドは次のとおりです。

sudo rpm -Va

Vオプションは検証を意味し、インストールされたファイルの情報をrpmデータベースに保存されている情報と比較します。これに-a` をつけると、すべてのコアパッケージが検証されます。通常、ファイルの長いリストが得られるので、これは少し役に立ちませんが、特定のアプリケーションに問題がある場合に、どこから始めるかを教えてくれるでしょう。

例えば、ターミナルで “missing” とマークされたものがあれば、そのパッケージで欠けているファイルがあることを示します。

2. 2. 再インストールを試みる

  1. 再インストールを試みる このリストで問題がありそうなパッケージに対して dnf reinstall を実行し てください。
sudo dnf --refresh reinstall [パッケージ名].

これにより、すべてのメタデータが期限切れになり、有効になっているすべてのリポジトリを這い回り、そのパッケージの新しいバージョンを探します。もしそのパッケージの依存関係が壊れていることがわかったら、DNF はおそらく文句を言って --skip-broken フラグを使うように言ってくるでしょう。これはそのパッケージを完全にスキップし、普通にシステムを更新できるようにします。

3. 最後の手段 - パッケージを削除する

アップデートを完了させるために --skip-broken を使わなければならないところまで来てしまった場合、パッケージを完全に削除したほうがシステムにとって衛生的です。

正しく再インストールできなかったパッケージの名前を思い出しながら、アンインストールします。

sudo dnf remove [パッケージ名].

ここで起こりうる最悪の事態は、ブラウザのような日常生活の中核となる部分を削除してしまい、代替手段を探さざるを得なくなることです。

ヒント: Fedora で flatpak を使って、パッケージをよりよく管理する方法を学んでください。

Fixing Broken Packages in Arch (日本語)

Arch のパッケージマネージャはここに挙げた他のものと類似していますが(つまり、データベースロックファイルを持ち、似たような方法で依存関係を引き出します)、そのロジックの構造に関しては全く別の獣のようなものです。あなたの問題を診断する最初のステップは、リポジトリが最新であることを確認し、完全なアップグレードを試みることです。

sudo pacman -Syu

パッケージのインストールやシステムのアップグレードがまだ失敗している場合、ターミナルに表示された内容に従って原因を切り分けなければなりません。

Note: 修正しようとする前に pacman がどう動くか学んでください。

“無効または破損したパッケージ”

何らかの方法で “pacman.conf” に変更を加えると、pacman がパッケージを破損していると誤ってラベル付けする問題を引き起こす可能性があります。最もありそうな原因はパッケージマネージャのキャッシュにあるパーシャルファイル (".part") で、それを削除することが解決策になります。

sudo find /var/cache/pacman/pkg/ -iname "\*.part" -delete

インストールしようとしているパッケージが本当に壊れており、Arch のパッケージマネージャに有効なメタデータを提供していない可能性があります。この場合、パッケージメンテナがアップデートするのを待つ必要があります。もしそのパッケージがあなたのシステムにインストールされていて、アップグレードの際に問題を起こしているのなら、それを削除してください。

sudo pacman -Rns [パッケージ名].

“Unable to Lock Database” (日本語)

Debian の apt のように、Arch のパッケージマネージャは操作中にロックファイルを作成します。もし停電を経験したり、pacman がハード的に中断してロックを外せなかったりした場合、ロックファイルを残している可能性が非常に高いです。

まず、あなたのコンピュータのどこかのプロセスがまだそのファイルを使っているかどうか調べてください。

sudo fuser /var/lib/pacman/db.lck

上の画像では、ID 121497 のプロセスがファイルロックを使用しています。もし、このプロセスが気になり、もっと情報が欲しい場合は、ps を使ってください。

ps -p [PID#] です。

私の場合、別の pacman インスタンスがロックファイルを所有しています。ロックを解除する一番安全な方法は、まずそのプロセスを殺すことです。

sudo kill [PID#] (日本語)

プロセスが死んだら、ロックファイルを削除します。

sudo rm /var/lib/pacman/db.lck

もう大丈夫です!

“競合するファイル/ファイルがファイルシステムに存在する” ### “競合するファイル/ファイルがファイルシステムに存在する”

これはアップグレード中に pacman が所有権の競合を検出したときに起こります。何かを修正する前に、パッケージマネージャが文句を言っているファイルのパスに注意してください。

誰がそのファイルを所有しているか調べるには

pacman -Qo [ファイルへのパス].

もしファイルの所有者がユーザーで、他のパッケージでないなら、削除してください。

sudo rm [ファイルへのパス].

他のパッケージが所有している場合、最も安全な方法は、そのパッケージのメンテナがこの競合を修正するのを待つことです。しかし、そうもいかず、今すぐにでも解決したいこともあるでしょう。

これを実現する一番簡単な方法は、 pacman--overwrite フラグを使うことです。ただ、これは 一般的に 安全ではなく、あなたのシステムでいくつかのアプリケーションが正しく動作しなくなる可能性があることを知っておいてください。これを実行する前にバックアップを取ることをお勧めします。

overwrite` フラグは Arch のパッケージマネージャが特定のファイルの所有者ルールを無視してアップデートを実行することを可能にします。例

sudo pacman -Syu --overwrite [ファイル名].

もし上記のコマンドがうまくいかない場合は、ファイル名を絶対パスに置き換えてください。パスの前にあるスラッシュ ("/") を取り除くと、頑固なコマンドでも動くようになったという報告もあります。

別の方法として、pacman に必要なものを全て上書きするように指示することもできます。

sudo pacman -Syu --overwrite='\*'.

“無効または破損したパッケージ (PGP シグネチャ)”

メンテナンスが行き届いていないパッケージでは、開発者が自分のパッケージを証明する電子署名を適切に更新する時間や意欲がない場合があります。その結果、インストールしようとするとターミナルに「[signature from [someone] is marginal trust」というメッセージが表示され、パッケージマネージャがファイルを削除するかどうか聞いてくるようになります。

署名の更新はすべてメンテナに依存しているので、ターミナルからこの 状況を修正することは現実的に不可能です。もしアップデートをする際に、そのパッケージを残しておきたいのなら、特にそのパッケージに対して --ignore フラグを使ってください。

sudo pacman -Syu --ignore [パッケージ名].

多くのパッケージでこのフラグが立っている場合、キーリングが古くなっている可能性があります。更新してください。

sudo pacman -S archlinux-keyring

Frequently Asked Questions (日本語)

AUR ヘルパーを使って Arch Fixes を適用することはできますか?

一般的に、はい。このガイドにあるコマンドの “pacman” をあなたの AUR ヘルパーに置き換えてください。例: yay -Qo /path/to/file.

アップデートを中断したらどうすればいいですか?

アップデート中に Ctrl + C を押したり、パッケージマネージャのプロセスを終了させたり、ターミナルを閉じたりすると、パッケージのデータベースが破損し、他のものをインストールしようとしたときに複雑な状況になる可能性があります。これを解決するには、キャッシュをクリアしてアップデートを繰り返してください。

画像引用: Flickr. すべてのスクリーンショットはMiguel Leiva-Gomezによるものです。

Akira
Akiraは情熱的なゲーマーであり、製品レビュアーです。ゲームをしていないときは、最新のゲーミングアクセサリーを試したり、製品のレビューをしていることが多い。彼の分かりやすいスタイルは、ゲーマーが自分のニーズに最も適した製品を簡単に判断できるようにするものです。また、技術的な問題にも精通しており、その解決方法も知っている。