2007/06/09

debianでハマった

家のdebian/testing (on VMware Server)の話です。

ふと思い立って不用意にapt-get upgradeしたら見事にやられました。upgrade中にlibc6が2.5以上のlibc6はカーネル2.6.1以上じゃないとうごかねーよーというpre-installスクリプトのエラーで終了してしまって身動きができない状態に。

libc6 2.3.6.ds1-13 を (.../libc6_2.5-9+b1_i386.deb で) 置換するための準備をしています ...
WARNING: POSIX threads library NPTL requires kernel version
2.6.1 or later. If you use a kernel 2.4, please upgrade it
before installing glibc.
dpkg: /var/cache/apt/archives/libc6_2.5-9+b1_i386.deb の処理中にエラーが発生しました (--unpack):
 サブプロセス pre-installation script はエラー終了ステータス 1 を返しました
以下のパッケージの処理中にエラーが発生しました:
 /var/cache/apt/archives/libc6_2.5-9+b1_i386.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

は?! なにいってるの?! と思ってuname -aしてみたら

debian:~# uname -a
Linux debian 2.4.27-3-386 #1 Thu Sep 14 08:44:58 UTC 2006 i686 GNU/Linux

そういえば前debian再構成したときにカーネルを2.4から2.6に変えてなかったな…。引っかかってる依存関係をみてみると…

debian:~# apt-get check
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
これらを直すためには 'apt-get -f install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
  binutils: 依存: libc6 (>= 2.5-5) しかし、2.3.6.ds1-13 はインストールされています
  libc6-dev: 依存: libc6 (= 2.5-9+b1) しかし、2.3.6.ds1-13 はインストールされています
  locales: 依存: glibc-2.5-1
E: 未解決の依存関係があります。-f オプションを試してください。

ともあれ、apt-get -f installで修復しようと思ったんですが、やっぱりさっきのpre-installation scriptのエラーがでてアウトー。ということで、やっぱりだめなものはだめーと。それならlinux-image-2.6-686を入れて再起動してやり直せばいいなーとおもったんですが、依存関係が壊れてるので何もできません。さてこまった…。

ていうかひどい! libc6を新しくしたときにカーネル2.6.xが必要なら依存関係を設定しておけばいいのに! とか思ったりしないでもないですが、よく考えてみるとそのバージョンのカーネルが入ってても2.4で起動する場合とかがあるから単純に依存関係の話でもないのでaptは悪くないよ、うん。カーネル2.6.xで使ってなかったオレが悪いんだよね…。

さて、どうしよう? 予想だとdpkg -i --ignore-dependsを使ってlinux-image-2.6-686をなんとか突っ込んでリブートして、2.6ベースのカーネルでちゃんと起動すればあとはapt-get -f upgradeで何事もなかったかのように行くと思うんだけど、起動しなくなると困るのでちょっと怖いです。

ということで、VMwareの仮想HDDのバックアップをとったんですが、よく考えたらVMwareなんだからそういう重要なことをするまえにスナップショットをとっておけという話ですよね。でも、スナップショットってHDDのイメージまで保存されるのかしらー。されないならあんまり意味ないけど、スナップショットとるたびにHDDイメージまで保存してたらすぐにHDDの容量を突き抜けそうな気がしないでもない今日この頃です。(12:30)

速攻なおった

2.6のカーネルイメージをむりやり入れるのも確かに1つの案だけど、依存関係がおかしくなってるパッケージを元に戻したらいいんじゃないか? ということで3つしかおかしくなってないんだから戻そうよということでやってみた。

えーと、/var/cache/apt/archivesを見る限り、戻すべきバージョンは2.17-3なので、バージョン指定してのインストールはapt-get install binutils=2.17-3でいいんだよなー。

debian:/var/cache/apt/archives# ls binutils*
binutils_2.17-3_i386.deb  binutils_2.17cvs20070426-8_i386.deb
debian:/var/cache/apt/archives# apt-get install binutils=2.17-3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
E: 'binutils' のバージョン '2.17-3' が見つかりませんでした

がびーん。なんでやねん…。

ということで、途方に暮れてたんですが、よく考えたら当たり前だよワトソン君。apt-getはあくまでもapt-lineに書いたパッケージレポジトリを元にバージョンとか探してくるわけで、apt-get updateしたからもう2.17-3なんてバージョンはそこにないのだ。

じゃあどうすればいいかというと、普通にdpkgでそのdebファイルをインストールすりゃいいんだということで、dpkg -i binutils_2.17-3_i386.debしたらあっさりロールバック成功。他の2つのパッケージも同じ要領でロールバックしてapt-get checkでエラーが出なくなったところで2.6系カーネルイメージをインストール。これでもう大丈夫だ。

あとはリブートして2.6系で起動して、また不用意にapt-get upgradeしたら何事もなく最後までupgradeできました。めでたしめでたし。

実は一昨日のInstallShieldに引き続き昨日は業務でrpmパッケージの作り方を調べてて、specファイルの書き方とrpmの仕組みがわかった直後だったので、オラなんかよくわかんないけどパッケージシステムとかの仕組みがやっと理解できたぞ! みたいな今日この頃です。 (18:50)

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac