2004年1月12日月曜日

Debian GNU/Linux, ライブラリの恐怖(もし、ldconfigとlddが消えたら...)

ライブラリの恐怖(もし、ldconfigとlddが消えたら...)

ヤツはあまりにも、強く、そして、レアだった。
筆者にDebianの再インストールすら考えさせるほどの強敵であった。 ヤツとはだれか? それはライブラリであった。

IRC狂の筆者にとって、IRCボットというのはとても魅惑的に見えた。 もちろん、今も使っている。 それはplumである。(たぶんココ>http://plum.madoka.org/)
指定された人に対し勝手になるとは配るは、伝言は預るは、特定の語に対して勝手に返事をしてくれるは、ログを盗り続けてくれるは........まさしくボット導入はIRC狂の夢である。 (次なる筆者の夢は、家庭でirc鯖(ircd)を上げて.....とかだったり.....) もちろん、クライアントソフト単体で自動でなるとを配ってくれたりログを盗ってくれたりする、そういうよくできたソフトもあるが、 plumならば、クライアントソフトに何を使おうが、上記の役目を果たしてくれる。
かくして、筆者は「自動オペレータ機能」を求め、plumを導入することを決める。 しかし、だいぶ後になってから、irchat-PJ(http://irc.fan.gr.jp/pj/)という、自動オペがクライアント単体で実現されているものを見つけてしまったりする。
まあ、世の中そんなもんだろう........。
ただし、必要なものはPerl(ver.4.036以上)@linuxである。 MS-DOSならばネットワーク対応のPerlをわざわざ使わねばならない。 (筆者はwin版を使ったことはないが、どうやらwin版だと、わざわざDOS窓上げてコマンドを打たねばならんらしい、まあ、当り前か)

話が脱線しかけた。 筆者は上記の理由で、plumを導入することにした。 バージョンは2.33.1-9。 このバージョンのplumをいれるには、libc6の2.2.4-7が必要だということなので、 後先考えず、筆者はlibc6を2.1.3-10から2.2.4-7へアップグレードしてしまう。

それが苦労の始まりとなるとは、当時、思いもしなかった。

libc6というのはその名の通り、ライブラリである。 当時の筆者にとってライブラリというものの認識はまったくもって低く、 今でもこの軽はずみな行動を悔いている。

ライブラリをアップグレードして、まずエラーを吐いたのは、 日本語漢字変換のcannaであった。 boot時にcannaサーバと繋げないというエラーが出るのだ。 もちろん、そんな状態では、まともに日本語を打つことはできない。 kinputでひらがなの入力はできても、cannaと繋がらないため、 漢字に変換することができないのである。 そのため、ircではひらがなでしか喋ることができず、まわりに迷惑をかけてしまった。 ひらがなだけで喋れば、それは大変読みにくいものである。
その後、wmaker、kterm、mozilla、netscapeなどでも異常が発生することが判明した。 wmakerでは日本語が使えなくなり、日本語が表示されるはずの場所が全て 化けてしまい、どうしようもなくなる。 ktermでも同様。 mozilla、netscapeでは「ロケールがサポートされてない」というエラーが吐かれた。

多くのアプリケーションは、かくのごとく、ライブラリというものに依存している。 当のライブラリを勝手に変えてしまっては、動くものも動かなくなるのは当然のことである。
そこで筆者はlibc6(ライブラリ)を前のバージョンに戻すことを決意するのであった。

悲劇のはじまり
筆者はlibc6のダウングレード(2.2.4-7から2.1.3-10)を行う。 だが、このダウングレードも$ dpkg -Cというコマンドを打つと、「完璧にインストールされていない」と認識されていた。
とりあえずplumの2.33.1-9を消して、2.33.1-2.1をいれようとしたときだった。

dpkg: 'ldconfig' not found on PATH
dpkg: 1 expected program(s) not found on PATH
NB: root's PATH should usually contain /usr/local/sbin, /usr/sbin, and /sbin

このようなエラーがdpkgの最中に出て、dpkgの実行が止まってしまうのだ。 そこで、上記のエラー出力の中の3つのPATH、/usr/local/sbin、/usr/sbin、/sbin を調べてみると、確かにldconfigというコマンドが存在しない。 さらに調べてみると、ldconfigのみならず、lddというコマンドも消えていた。 dpkg関連のコマンド、つまり、ソフトのインストールやアンインストールを行いたいときには必ずこのldconfigが存在しないというエラーが出てしまい、作業が止まってしまうのである。
ライブラリをダウングレードしようにも、ldconfigが消えたため、手も足もでない。
アンインストールもインストールもldconfigが存在しないというエラーによって止まってしまう。 もちろん、ldconfigとlddの入っているパッケージ(ldsoという)をインストールする、ということもできはしない。 筆者はこんな八方塞がりの状態に陥ってしまったのだ。
#こういう状態も でっどろっく っていうんでしょうかね?

筆者はDebianの再インストールを考えた。 もちろんそうすればまっさらな、正常な状態から始められる。 しかし、いままで積み上げてきた「Xの設定」「日本語の設定」「PPxPの設定」「ウィンドウマネージャの設定」.....そういった全てを失ってしまう.....。 再インストールと言う道は、一番手っ取り早い逃げ道ではあるが、その逃げた先には再設定という茨の道が待っているのだ。


一から出直すのはいくらなんでも嫌である。

なんとしても、ldconfigとlddを復活させなくてはならない。

第1の方法
Linuxを使っている人に、「ldconfigくれ」と言ってみた。 しかし、気持ちが伝わらなかったらしい。 もらうことはできなかった。

第2の方法
ネット上から探してみる。 それらしきものはあるのだが、BSD用っぽく、コンパイルすら通らなかった。

第3の方法、ついに.....
debianインストールCDをマウント、そして、超強引に ldsoパッケージを探す。

$ mount /cdrom
$ find /cdrom -iname 'ldso*'

結果として、ldso_1.9.11-9.debというものが見つかった。 これを# dpkg -i --force-bad-pathコマンドで インストールをする。
結果的には強引なこの方法で/sbin/ldconfigと/usr/bin/lddが復活する。 ヤツを打破した瞬間であった。

原因
なぜ、二人(ldconfigとldd)はいなくなってしまったのか、その原因を追求してみた。 すると、このようなホームページ(MLだろうけど.....)を発見した。
https://linux.rice.edu/pipermail/rlug-discuss/2000-October/001009.html
訳せって?
ldsoパッケージからldconfigとlddの2つが、バージョン2.1.93のlibc6に移された。 (ついでに、若いバージョンのlibc6 2.1.93 はldconfigを持っていないらしい。)

筆者の環境に置き換えてみると.....

  1. ircボット駐在ソフトのplumインストールのため、libc6のバージョンを上げた。
  2. 新しいlibc6のldconfig、lddが使えるようになる?
  3. libc6のダウングレードをしようとする。
  4. その途中、ldconfigとlddもダウングレードに従って、消える?
  5. だけどldconfigがないとアンインストールなどがまともにできない。
  6. よって、ダウングレードがうまくできない。<$ dpkg -C の出力より
  7. いろんなアプリケーションが正しいライブラリを参照できなくて、異常をおこしまくる。

こんな感じだろうか? よくわからん。 だが、この「ldsoからlibc6へと二人(ldconfig、ldd)が移された」という仕様に問題がありそうではある。

もし、あなたのパソコンからldconfigとlddの二人が消えたら、 libc6のバージョンとldsoパッケージをチェックしてみてほしい。