質問: 使用中のdebian(etch)で、どうもdpkgコマンドが壊れて?しまったようです。 例えば、 ---------------------- $ dpkg -l バスエラー ---------------------- こんな感じで、何をやってもエラーとなってしまいます。同じくapt-getコマンドも失敗するようになりました。 オリジナルのパッケージをダウンロードして、直接展開、インストールすることは可能でしょうか? また、その場合の手順はどのような感じになるでしょうか?
回答: 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パッケージを手動で展開するための鍵は * man 5 deb http://manpages.debian.net/cgi-bin/display_man.cgi?id=060758... * gzipファイルのヘッダは 0x1f 0x8b 0x08 の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 !.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 を解凍するだけです。