私は-fが--fix-broken
マニュアルの意味であることを知っています。パッケージの問題を解決しようとしていますが、正確に何をしますか?これらのパッケージを修正する方法、または変更が必要かどうか、およびどのように決定しますか?時々失敗する理由は何ですか?
答え1
、--fix-broken
またはオプションをtrueに-f
設定しますAPT::Get::Fix-Broken
が、これは面白い部分ではありません。APT::Get::Fix-Broken
それが本当であるたびにブール値を設定します。FixBroken
trueと呼んでください。apt-getでより多くのロジックを有効にする。このロジックは2つのことを行います。つまり、pkgFixBroken
falseを返す必要があるアルゴリズム.ccファイル内の関数を呼び出し、BrokenCount()
関数が0を返すことを確認します。後者は明らかです。 BrokenCountが0でない場合、破損したパケットがあり、何かが間違っています。ここで関連部分は、pkgFixBroken
初期化された後に関数として呼び出されるクラスのインスタンスですResolve()
。
パッケージの回復は、pkgFixBroken
インストールされているすべてのパッケージをアップグレード可能としてマークし、ダウンロード可能なバージョンがないパッケージを回復可能としてマークするのと同じくらい簡単です。操作が完了するとpkgProblemResolver
関数(または何でも)を呼び出すため、状況は少し複雑になります。しかし、何が起こっているのか、ある程度説明するコメントがあります。
このルーチンは各パケットのスコアを計算することで動作します。スコアは、パッケージの優先順位とすべての逆方向の依存関係を考慮して得られます。これは、パッケージの調整によって引き起こされる可能性のある損傷の程度を反映する整数を提供します。
最高得点から最低得点に進みます。依存パッケージを維持または削除して中断を修正します。。失敗した場合は、パッケージ自体を削除して続行します。ルーチンは、破損した状態から固定状態にインテリジェントに切り替えることができなければなりません。
BrokenFixフラグは、アルゴリズムが問題を回避するためにパッケージをアップグレードしようとするモードを有効にします。
それはある程度説明になります。スコアを割り当て、スコアが高いパッケージのすべてのパッケージの依存関係を解決しようとします。
そうでない場合を除いて、ほとんどの問題を解決するのに十分なようです。その理由は、「壊れた部分の修正」がパッケージを「修正」しようとするのではなく、単にすべてのパッケージの依存関係が満たされていることを確認するためです。つまり、AがBとCに依存している場合、BとCがAの前にインストールされていることを確認し、他の人はいません。。
一般的な失敗の理由は、依存関係が満たされていないためではありません。つまり、すべてのパッケージが存在し、理論的にインストールできるわけではなく、失敗する別のdpkgテストがあるからです。この場合、dpkg --audit
適切なdpkg --configure -a
情報よりも多くの情報を提供できます。
すべての説明を読むことをお勧めします。C ++の背景知識がある場合は、そのコードが何をしているのかについてより思慮深い説明が必要な場合は、コードをお読みください。