
私は次のLinuxディストリビューションを実行しています。
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
入ってみるaptitude
と、私がインストールした1,425個のパッケージが使用されなくなったため、すべて削除されるというメッセージが表示されます。私が考えることができたのは、私が誤って間違ったキーを押した可能性があるということだけでしたaptitude
。
この問題を正しく解決するにはどうすればよいですか?
よろしくお願いします。
ポリスチレン:私の/etc/sources.list
ファイルと/etc/sources.list.d
ディレクトリは変更されていません。
ポリフェニレンスルフィド:今、私はこれが私のパッケージ全体ではなく、わずか半分であることに気づきました。しかし、通常は標準のLinuxパッケージです。
購買力の評価処置:aptitude keep-all
実行時にエラー・メッセージは生成されませんが、問題は解決されません。ただし、GUIに移動してaptitude
パッケージ内のプラス記号()をクリックすると、+
[次のパッケージを現在のバージョンに保つ]を選択できる[検査]ダイアログボックスに移動します。そのオプションを選択すると、パッケージは削除対象として表示されなくなります。ただし、パッケージは1,400を超えるため、すべてのパッケージに手動でタグを付けてこのダイアログボックスに移動するには時間がかかります。 1つのコマンドでこれらすべてのパッケージに対してこのようなことが起こるようにする方法はありますか?
答え1
dpkgデータベース(in /var/lib/dpkg/status
)ストレージ故意にパッケージの状態は同じ行にあります。現在の説明された状態dpkg(1)
。したがって、インストールされたパッケージには、次の例のような項目があります。
# dpkg -s hello| egrep '^(Package|Status|Architecture):'
Package: hello
Status: install ok installed
Architecture: amd64
ツールを使用して削除意図を設定すると、次のように表示されます。
# dpkg -s hello| egrep '^(Package|Status|Architecture):'
Package: hello
Status: deinstall ok installed
Architecture: amd64
代わりにパッケージを削除する必要がありますpurge
。deinstall
選択した他のパッケージまたはパッケージ全体の変更をトリガーする重要なパッケージを選択(削除)できます。
これを実行できるツールには、古代、dselect
低aptitude
レベルdpkg --set-selections
、またはapt-mark
。後者は使いやすいですが、まだ変更されたことを確認するために使用することはできず(上記とdeinstall
比較していないためinstalled
)、一度に1つの操作しか実行できないため、複数の回復に非常に遅いです。タイムズ。dpkg --set-selections
1回の呼び出しでこれを行うことができるので、これは好まれます。
複数のアーキテクチャを使用すると、すべてが少し複雑になり、両方のArchitecture
アーキテクチャに2回インストールされたパッケージを区別するために値を取得する必要があります。スキーマは、all
実際のスキーマのないパッケージでも機能します。
cancel-changes.awk
以下は、現在の状態と互換性のあるインテントを設定するスクリプトです:to fit dpkg --set-selections
。
#!/usr/bin/awk -f
/^Package:/ { package=$2; newintent="none" }
/^Status: (purge|deinstall) ok installed$/ { newintent="install" }
/^Status: install ok config-files$/ { newintent="deinstall" }
/^Status: install ok not-installed$/ { newintent="purge" }
/^Architecture:/ { package=package ":" $2 }
/^$/ && newintent != "none" { print package, newintent }
実際にスクリプトを提供する前に、スクリプトの出力を確認する必要がありますdpkg --set-selections
。 Debian(およびUbuntu)の将来のバージョンでは、内部フォーマットが変更される可能性があります。
これは被害者パッケージをテストするためのDebian 10の使用例ですhello
。
# apt-get install hello
[...]
# apt-mark remove hello
Selected hello for removal.
# dpkg -l hello
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-==================================
ri hello 2.10-2 amd64 example package based on GNU hello
# cancel-changes.awk < /var/lib/dpkg/status
hello:amd64 install
# cancel-changes.awk < /var/lib/dpkg/status | dpkg --set-selections
# dpkg -l hello
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-==================================
ii hello 2.10-2 amd64 example package based on GNU hello
答え2
わかりました問題を解決することができましたが、それが実際の解決策であるか、より深くて根本的な問題をカバーする「絆創膏」であるかはわかりません。これは私がしたことです...
apt install
まず、削除マークされたパッケージの1つを使用して作業しようとしました。成功し、出力の各行に複数のパッケージを含む残りの1,400以上のパッケージのリストを提供しました。
パッケージリストをファイルにコピーし、各行の前にプレフィックスを付けてから、シェルを介してapt install
実行しました。
これにより、これらのパッケージはすべて「自動」から「手動」に変換されます。
その後、実行しましたが、aptitude keep-all
すべてのパッケージが「廃止されました」と表示されなくなりました。
これは幸いですが、最初にこの問題がどのように発生したのかはまだ混乱しています。前述のように、私のシステムに修正する必要apt
があるもう1つのより基本的な問題があるかどうかはわかりません。aptitude