web-dev-qa-db-ja.com

ひどく破損したパッケージシステムからの回復(dpkg + python ???)

いくつかの前文が通常尋ねられます...

OS: Ubuntu 14.04 (AMD64)
Python2: /usr/bin/python -V -> Python 2.7.12
Python2default: which python -> /usr/local/bin/python
/usr/local/bin/python -V -> Python 2.7.12
dpkg: dpkg --version -> Debian `dpkg' package management program version 1.17.5 (AMD64).
apt: Sudo apt --version -> apt 1.0.1ubuntu2 for AMD64 compiled on Apr 12 2018 10:14:36
c: gcc --version -> gcc (Ubuntu 4.8.5-4ubuntu8~14.04.2) 4.8.5
llvm: clang --version -> clang version 3.9.1-4ubuntu3~14.04.3 (tags/RELEASE_391/rc2)

ここまでは順調ですね。考えられる原因の理論:

  • 更新されたCビルドシステム(最近のubuntyの更新でいくつかのcアップグレードに気づきました。ここにc v5が表示されると予想されますが、インストールが保留されている可能性があります)
  • llvmを最新のものにインストールしました(他の目的のためですが、そのllvmがバージョン6であっても、影響を受ける可能性があります。14の最新のllvmはまだ3.9.xです)
  • / usr/local pythonをビルドしてバージョン2.7.15に更新しようとしました(これはpythonモジュールを再コンパイルする傾向があることに気付きました。より野心的で、以前にインストールされたものを壊す可能性があります)

どちらが問題を引き起こしたのかはわかりませんが、ある時点で何か間違ったことをしていた可能性があります。私は自分の問題を修正し、パッケージシステムを回復するために多くのことを試みました(多くの同様の問題を調査しました)。

途中で、UbuntuはPythonに非常に依存しているため、これは驚異的であることがわかりました。そして、私はそれから可能な方法を夢見ています:

  • システム(パッケージ)を使用するために、最小限のPythonの特別なインストールが必要です。ここでの問題は、ユーザー側のシステムpythonが、ユーザーがpythonの上位バージョンに移行すると同時に脆弱になり、システムの機能が大きく乱れることです。代替(/ usr/local/bin)を使用しても、ユーザーが誤ってデフォルトのインストールを台無しにするリスクが高くなります。
  • コンパイルされたバイナリとおそらくいくつかの外部スクリプトに基づいたパッケージングシステムがあり、pythonスクリプトを使用して動作しません。私の場合のように、壊れたpythonは、dpkg(およびおそらくいくつかのシステムライブラリ)のインストール(またはおそらく壊れている可能性がある)のインストールを停止します
  • 別のツールを使用して機能する代替パッケージングシステムがあるため、代替パッケージングインストーラーを使用して正しいパッケージを再インストールできます。
  • 監査システムがあります(たとえば、パッケージpacx.xはxxxファイルがyyyの場所にあることをユーザーに通知します。何かが一致しない場合(ユーザーが何か他のものをインストールしてx-elseを使用し、ライブラリ)。
  • インストールリカバリの最小システムが0である-ユーザーがUNIXツールを介してインストールして、より精巧なシステムまたは主要なシステムが適切な場所に戻るまでスムーズにパッケージングシステムを実行できるようにするもの。

OK。十分な理論!

ステップ1:依存関係で何かが壊れている場合の修正を試みる:

$ Sudo apt-get -f install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following extra packages will be installed:
  python-distlib
The following NEW packages will be installed:
  python-distlib
0 upgraded, 1 newly installed, 0 to remove and 13 not upgraded.
9 not fully installed or removed.
Need to get 0 B/2,120 kB of archives.
After this operation, 559 kB of additional disk space will be used.
Do you want to continue? [Y/n] 
dpkg: error processing package dpkg (--configure):
 package is in a very bad inconsistent state; you should
 reinstall it before attempting configuration
Errors were encountered while processing:
 dpkg
E: Sub-process /usr/bin/dpkg returned an error code (1)

Step2:dpkgの回復を提案しました。

$ Sudo apt-get install dpkg
Reading package lists... Done
Building dependency tree       
Reading state information... Done
dpkg is already the newest version.
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 python-pip : Depends: python-distlib but it is not going to be installed
              Recommends: python-dev-all (>= 2.6) but it is not installable
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

ステップ3:ステップ1を繰り返します-同じ結果が得られます

ステップ4:dpkgを強制的に再インストールしてみる

$ Sudo apt-get install --reinstall dpkg
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 python-pip : Depends: python-distlib but it is not going to be installed
              Recommends: python-dev-all (>= 2.6) but it is not installable
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Step5:OK OKこの厄介なpython-distlibを最初にインストールする必要があります...

$ Sudo apt-get install --reinstall python-distlib
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  python-distlib
0 upgraded, 1 newly installed, 0 to remove and 13 not upgraded.
9 not fully installed or removed.
Need to get 0 B/2,120 kB of archives.
After this operation, 559 kB of additional disk space will be used.
dpkg: error processing package dpkg (--configure):
 package is in a very bad inconsistent state; you should
 reinstall it before attempting configuration
Errors were encountered while processing:
 dpkg
E: Sub-process /usr/bin/dpkg returned an error code (1)

ステップ6:今、私は非常に悪い状態です。推奨されるのは、ステップ2、3、および4で試したdpkgシステムの(再)インストールです(結果はイライラします)

今何ができますか?

/ var/lib/dpkg/statusへのハッキングを試み、リポジトリリスト/ etc/aptを再作成しようとしました。次からコンパイルすることにより、Python 12、14および15の代替インストールを試みました。公式pythonソース(何も助けなかったので、12のままにしました)。

実際、修正が必要な壊れたパッケージが他にもあることは知っています(例にはリストされていません)。ある瞬間、システムが非常に壊れたため、グラフィカル環境を失い、端末で作業しなければなりませんでした(幸いなことに、lin-unixはウィンドウやosxのようなグラフィックスに依存していません)。少なくともグラフィカルモードに戻るには、Unity-Desktopを再インストールする必要がありました(壊れたpythonは影響力が大きかったため、ubuntuのグラフィカルUIの依存関係でも簡単に取り消されました)

最後の手段は、CDからUbuntuの同じバージョンまたは新しいバージョン(14.04またはubuntu 16)をインストールすることです。いくつかのテストを終了したいので、この特定のハードウェアでうまく動作するため、14のままにしておきます。

最後に-質問:

代替パッケージのインストールシステムを使用したり、一部のパッケージを取得/ダウンロードしたり、最終的に手動でコンパイルおよび/またはインストールしたりすることで、パッケージシステムを合理的に機能する状態に回復することができます。

私は修正する必要があります:

  • pythonのデフォルト/システムのインストール(バージョンが低下することを意味するものであっても、安定した状態で-インストール時の元のpythonは2.7.6であったことを覚えています(完全に消えました)
  • dpkg

後世では、2018年7月です。

すべてのヒントを歓迎します。現在よりも事態を悪化させることはほとんどできません。


編集1:

Python 2.7を2.xの最新バージョンに更新 に関連している可能性が高いppa jonathoffを発見しました

ppaリポジトリから2.7.12が自動的に取得される可能性があります。このPPAをレポのリストに追加したときのことは思い出せませんが、このレシピを使用したことを覚えています。

現在、python27パッケージファイルを取得できない理由について確立しようとしています。


編集2:

はい。これは現在私の仕事の理論です:

https://launchpad.net/~jonathonf ppaをリストに追加しました。やがて、システムpythonを2.6から2.7に移動しました。 py 2.7.12までは問題ありませんでした。 python27が2.7.14に移行すると、問題が発生しました。

pythonバージョンが移動したことに気づくでしょうが、これは通常のUbuntuのアップグレードだと思いました。

今、Jonのプロジェクトを調べると、現在のpython2.7が実際には2.7.14であることがわかります(ubuntu 16向けの彼のページによると、おそらく https://launchpad.net/~jonathonf/ + archive/ubuntu/python-2.7 )python27が私にとって機能していない場合、このバージョン。

私は2.7.12をソースからビルドして自分でインストールすることで問題を解決しようとしたと思いますが、そのバージョンはそれ自体と同じくらい良いです、それはユーザー/プログラミング用に作られており、システムのubuntuバージョンとは異なりますpython(ここには微妙な違いがありますが、他で読んだことがありますが、これが機能することを願っています。機能しませんでした。絶望的な時期には必死の対策が必要ですが、それは悪い選択でした).

元のubuntuアーカイブシステムでは、Ubuntu14のpythonはまだ2.7.6であると予想されるため、ubuntuリリースアーカイブでpython27を見つけようとしても、見つからない可能性があります。 (誰かがこれについて間違っていることを証明し、異なるリビジョンでpython27を入手できる場所を教えてください)

ここで質問は、このppaの以前のアーカイブを見つけて、pythonを作業バージョンに復活させることです。

私にとってaptでうまく機能した最後のバージョンは2.7.12でした。

問題は、その特定のアーカイブをどこで入手するかです。時間内に失われない場合。

1
user309383

dpkgを手動で修復することができます(ダウンロードしてファイルシステムに抽出します)。

wget http://mirrors.kernel.org/ubuntu/pool/main/d/dpkg/dpkg_1.17.5ubuntu5.8_AMD64.deb

ar x dpkg_1.17.5ubuntu5.8_AMD64.deb
Sudo tar -xvf data.tar.gz -C /

その後、再インストールします。

Sudo apt-get install dpkg --reinstall

ローカルPythonを削除するには

Sudo rm /usr/local/bin/python*

Python関連のPPAを削除します。

Sudo ppa-purge ppa:jonathonf/python-2.7

リポジトリから通常のpythonをインストールします

Sudo apt-get install --reinstall libpython-stdlib python-minimal python2.7 \
python-apt python-distlib libpython2.7-minimal libpython2.7-stdlib

システム全体を修正します。

Sudo apt-get install -f
Sudo dpkg --configure -a

最終段階で、apt-getおよびdebsumsを使用してシステムの整合性を確認します。

Sudo apt-get check
# debsums
Sudo apt-get install debsums
Sudo debsums_init
Sudo debsums --changed --silent
# afterwards reinstall listed packages with
# Sudo apt-get install --reinstall package-name
2
N0rbert