使用中のdebian(etch)で、どうもdpkgコマンドが壊れて?しまったようです。

例えば、
----------------------
$ dpkg -l
バスエラー
----------------------
こんな感じで、何をやってもエラーとなってしまいます。同じくapt-getコマンドも失敗するようになりました。
オリジナルのパッケージをダウンロードして、直接展開、インストールすることは可能でしょうか?
また、その場合の手順はどのような感じになるでしょうか?

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2006/09/11 01:20:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a_b_y No.2

回答回数16ベストアンサー獲得回数6

ポイント100pt

ブログを拝見するに、

apt-get update

でエラーが出て、その後

dpkg --configure -a

やったらバスエラーに、ということですがこの辺のエラーメッセージ細かく覚えていらっしゃいませんか?あれば何かのヒントになると思うのですが。

う〜ん…とにかくバスエラーの原因・発生箇所を特定するしかないとして……一つ確認ですが、dpkgは全てのオプションが使用できない状態でしょうか、それとも特定のオプションだけでしょうか。例えば

dpkg -X dpkg_1.13.22_i386.deb ./

のように個々のdebファイルに対する操作は通るが dpkg -l などシステム全体に関する情報が必要なものは通らない、という状況であれば、上記の事も合わせて察っするに /var/lib/dpkg/ 以下のファイルあたりが壊れている可能性が考えられます。私が以前 sid を使っていたときは /var/lib/dpkg/status がパッケージのバグで壊されてしまい apt-get などが動かなくなることを何度か経験しましたが、これと同じ状況ならば http://lists.debian.or.jp/debian-users/200404/msg00132.html あたりが参考になるかもしれません。

どうしてもあたりが付かなければ、私だったら最終的には dpkg のソース取ってきてデバッガの中で走らせるでしょうか。状況を整理してから debian-users-ML あたりで聞いた方がよいアドバイスを受けられるかもしれませんね。(少なくとも私は数年Debianから離れていて手元にDebian環境もないのでピンポイントのアドバイスはできそうにありません。お力になれず申し訳ない。)

あと、いっそシステム全体を再インストールした方が楽という可能性もありますね(^_^;)

id:kazz7

いろいろと役立つ情報をありがとうございます。

今試してみましたが、dpkg -X は正常に動作しました。dpkg -l はやっぱりダメですが。

/var/lib/dpkg/status を以前のものに置き換えたりもしてみましたが、こちらもダメでした。

何気なく/var/log/syslogを見てみると、そこには大量のエラーメッセージが出力されていました。(こんな感じのものが何度も繰り返し出力されています。)

Sep 11 01:14:32 kuro-box kernel: end_request: I/O error, dev 03:01 (hda), sector 3589984
Sep 11 01:14:33 kuro-box kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Sep 11 01:14:33 kuro-box kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=106431, h
igh=0, low=106431, sector=106368

これはもう、素直にハードディスクを交換して、システム全体の再インストールを下法が良さそうですね。

いろいろとアドバイスいただきましたが、時間を作ってもう一度1からやり直してみることにします。ありがとうございました。

2006/09/11 01:19:34

その他の回答1件)

id:a_b_y No.1

回答回数16ベストアンサー獲得回数6

ポイント100pt

APTはdpkgのフロントエンドなので、dpkgが異常終了してしまう以上apt-getも使えません。バスエラーだけではどこで問題が起っているのはっきりしませんが、 とりあえずdpkg(だけ)が壊れていると仮定して回答します。

方法は少なくとも二つあって、一つはdpkgを使うことのできる1 CD Linux (Knoppixあたり?)を使ってレスキューすることで、これが楽な方法だと思います。

% dpkg -X dpkg_1.13.22_i386.deb ./

とすることで、カレントディレクトリにファイルを展開することができます。

もう一つは、どうしてもdpkgを使うことができない場合に、debファイルを手動で展開する方法です。ただ、そのためには dd tar gzip などが正常に動く必要があり、またできればバイナリエディタが欲しい(emacsかviが動けば十分)のですが、これらのコマンドは正常に動きますか?動くようであれば以下の方法でdpkgを強引に上書きインストールすることができます。(これがベストなのかどうかはわかりません。あと、しばらくDebianから離れているのでどこか見落しがあったらすみません。)

debパッケージを手動で展開するための鍵は

の2つです。マニュアルによれば、インストールされるファイルは data.tar.gz に格納されているので、これをdebバイナリから抽出してやれば、あとはこれを解凍して必要なファイルを手動でコピーするだけです。

具体的な抽出方法ですが、例えば以下のようにします。ここでは、先程ミラーサーバーからダウンロードしてきた dpkg_1.13.22_i386.deb を例に説明してみます。(なおdebファイルの場所はミラーサーバーのpool/main/d/dpkg/以下です。)これを emacs の hexl-mode で開くと先頭部分は次のようになっています。

00000000: 213c 6172 6368 3e0a 6465 6269 616e 2d62  !<arch>.debian-b
00000010: 696e 6172 7920 2020 3131 3530 3930 3235  inary   11509025
00000020: 3930 2020 3020 2020 2020 3020 2020 2020  90  0     0     
00000030: 3130 3036 3434 2020 3420 2020 2020 2020  100644  4       
00000040: 2020 600a 322e 300a 636f 6e74 726f 6c2e    `.2.0.control.
00000050: 7461 722e 677a 2020 3131 3530 3930 3235  tar.gz  11509025
00000060: 3930 2020 3020 2020 2020 3020 2020 2020  90  0     0     
00000070: 3130 3036 3434 2020 3731 3030 2020 2020  100644  7100    
00000080: 2020 600a 1f8b 0800 0000 0000 0003 ed5c    `............\

00000084 からの 1f8b08 の部分が control.tar.gz の開始部なので、さらに後方をサーチして、data.tar.gz の開始部を探すと、

00001c40: 6461 7461 2e74 6172 2e67 7a20 2020 2020  data.tar.gz     
00001c50: 3131 3530 3930 3235 3930 2020 3020 2020  1150902590  0   
00001c60: 2020 3020 2020 2020 3130 3036 3434 2020    0     100644  
00001c70: 3136 3237 3236 3120 2020 600a 1f8b 0800  1627261   `.....
00001c80: 0000 0000 0003 ecbd 095c 5555 f737 7eee  .........\UU.7~.

となっていて 00001c7c からが data.tar.gz なので、ここからファイルの終わりまでを dd で抜き出します。

%  dd if=dpkg_1.13.22_i386.deb of=data.tar.gz bs=2 skip=3646

あとは出来上がった data.tar.gz を解凍するだけです。

id:kazz7

回答、詳しい手順ありがとうございます。

この手順を参考にdpkgコマンドを抽出して、既存のファイルに上書きしてみたのですが、やはり実行すると「バスエラー」となります。

その他のコマンドは普通に使えていますが、やっぱりdpkgだけが不調です。この先どのあたりから調べていけばいいのか悩んでいます。

2006/09/10 09:50:07
id:a_b_y No.2

回答回数16ベストアンサー獲得回数6ここでベストアンサー

ポイント100pt

ブログを拝見するに、

apt-get update

でエラーが出て、その後

dpkg --configure -a

やったらバスエラーに、ということですがこの辺のエラーメッセージ細かく覚えていらっしゃいませんか?あれば何かのヒントになると思うのですが。

う〜ん…とにかくバスエラーの原因・発生箇所を特定するしかないとして……一つ確認ですが、dpkgは全てのオプションが使用できない状態でしょうか、それとも特定のオプションだけでしょうか。例えば

dpkg -X dpkg_1.13.22_i386.deb ./

のように個々のdebファイルに対する操作は通るが dpkg -l などシステム全体に関する情報が必要なものは通らない、という状況であれば、上記の事も合わせて察っするに /var/lib/dpkg/ 以下のファイルあたりが壊れている可能性が考えられます。私が以前 sid を使っていたときは /var/lib/dpkg/status がパッケージのバグで壊されてしまい apt-get などが動かなくなることを何度か経験しましたが、これと同じ状況ならば http://lists.debian.or.jp/debian-users/200404/msg00132.html あたりが参考になるかもしれません。

どうしてもあたりが付かなければ、私だったら最終的には dpkg のソース取ってきてデバッガの中で走らせるでしょうか。状況を整理してから debian-users-ML あたりで聞いた方がよいアドバイスを受けられるかもしれませんね。(少なくとも私は数年Debianから離れていて手元にDebian環境もないのでピンポイントのアドバイスはできそうにありません。お力になれず申し訳ない。)

あと、いっそシステム全体を再インストールした方が楽という可能性もありますね(^_^;)

id:kazz7

いろいろと役立つ情報をありがとうございます。

今試してみましたが、dpkg -X は正常に動作しました。dpkg -l はやっぱりダメですが。

/var/lib/dpkg/status を以前のものに置き換えたりもしてみましたが、こちらもダメでした。

何気なく/var/log/syslogを見てみると、そこには大量のエラーメッセージが出力されていました。(こんな感じのものが何度も繰り返し出力されています。)

Sep 11 01:14:32 kuro-box kernel: end_request: I/O error, dev 03:01 (hda), sector 3589984
Sep 11 01:14:33 kuro-box kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Sep 11 01:14:33 kuro-box kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=106431, h
igh=0, low=106431, sector=106368

これはもう、素直にハードディスクを交換して、システム全体の再インストールを下法が良さそうですね。

いろいろとアドバイスいただきましたが、時間を作ってもう一度1からやり直してみることにします。ありがとうございました。

2006/09/11 01:19:34
  • id:a_b_y
    回答で /var/lib/dpkg/status 云々と書きながらも実は「でも多分それでバスエラーにはならんよなぁ…何だろ?」と思っていたのですが、HDDでしたか。その可能性を考えてなかった。修行が足りんなぁ…
    fsckで直ってくれたりしないかな、と淡い期待を持たないでもないですが、おとなしくHDDを交換する方が楽そうですね(金銭面を除けば)。御健闘をお祈りします!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません