glibcライブラリがないと言われてSlackwareが起動しなくなった!

読んで字の如しという話なのだが、先日サブマシンのThinkPad X61にインストールしている Slackware64 current(早い話が、人柱御用達ヴァージョン)のソフトウェア一式をアップグレードさせて再起動させたところ、

GLIBC_2.25

云々と書かれたメッセージが大量に表示されて起動できなくなってしまった。要するに、glibc の共有ライブラリのバージョン 2.25 に依存している大量のアプリケーションやライブラリを起動させることができなくなって、OS 自体を起動させることができなくなってしまった、ということである。

このトラブルの原因は、明らかだ。昔からずっと愛用している Alien Bob こと Eric Hameleers 氏による multilib パッケージや独自ビルドが slackpkg コマンドによって自動的に slackware 公式のビルドに置き換えられないようにしようと、/etc/slackpkg/blacklist ファイルにおいて

[0-9]+alien

という設定を書き込んでいるためだった。

原因がすぐに分かったとは言え、起動させられなかったらてんでお話にもならない。だが、ここで再インストールなどしてはいけない! 早まってはならぬ。Ubuntu や Debian ならいざ知らず、相手は Slackware だ。インストール作業それ自体はほんの2時間ぐらいで終わるし、下手をすると Windows のインストールよりもはるかに簡単に済むことであろうが、自分好みの環境を復旧させるのに軽く1週間はかかってしまう。いろいろと書き仕事の案件を抱えている身にとっては、時間と労力の無駄以外の何者でもない。こういう時にこそ、インストール時に使われたであろう OS のインストールディスクを使おう。Windows のインストールディスクと同様に、Slackware のインストールディスクもレスキュー用途でフルに使うことができるのだ。だからこそ、こうした状況に陥ってしまっても、まずはコーヒーや茶などを飲んで気持ちを落ち付けてから、インストールディスクと空き容量が十分にある適当な USB メモリを探し出そう。

復旧させる方法についてだが、大まかには Re-installing lilo from a Slackware boot CD に記されている手順をほぼそのまま踏めば良い。ただし、注意すべき点もあるので、いちおう手順を以下に少し詳し目に記しておくことにしよう。

(1)インストールディスクで Slackware64 を起動させる。

この手順については、詳述しない。Slackware の本家サイトや Alien Bob 氏のサイトにあるドキュメントを熟読されたい。

(2)起動しなくなった Linux のルートパーティションを適当なディレクトリを作成し、そこにマウントさせる。

上記のブログの方の手順に従って

mkdir /foo

というディレクトリを作る(もちろん、foo の代わりに hoge でも fuga でも何でも良い)。

わたしが使っている X61 では Linux の起動パーティションは /dev/sda3 である(sda1とsda2 は Windows 用に用いている)。

というわけで、次のコマンドをそれぞれ投入してゆく。

mount /dev/sda3 /foo
mount --bind /proc /foo/proc
mount --bind /sys /foo/sys
mount --bind /dev /foo/dev

mount コマンドの --bind オプションを用いて /proc ディレクトリ、/sys ディレクトリ、そして /dev ディレクトリを上記の場所にマウントすることの意味については、こちらを参照されたい。

(3)USB メモリをマウントさせる。

(2)で投入したコマンドの後に、Slackware の公式サイトから入手しておいた glibc-solib 2.25 のパッケージをコピーしておいた USB メモリを適当なディレクトリへマウントさせる。この作業を行ってから chroot コマンドを投入すること。chroot コマンドを投入してから mount コマンドを投入してしまうと、ルートパーティションにある mount コマンドを使うことになる。そうすると、ルートパーティションには入っていない、問題の glibc-solibを探そうとするので、USB メモリをマウントできなくなってしまうのだ。

(chroot コマンドについては、図版付きで分かりやすく説明して下さったこのサイトを参照のこと。)

わたしが用いている USB メモリは FAT32 でフォーマットされていて、ドライブが1つしかない。また、マウント先は /mnt/tmp にすることにして、以下のコマンドを投入した。ただし、いつものことながら、各自の環境に合わせて適宜読み替えること。

mount -t vfat /dev/sdc1 /foo/mnt/tmp

(4)chroot コマンドを用いて、(2)でマウントした場所をルートと見なさせる。

chroot /foo

(5)USB メモリにコピーしておいた glibc-solibs の 2.25 をインストールする。

例えば、USBメモリの glibc ディレクトリの中に上記のパッケージをコピーしておいた場合には、

upgradepkg --install-new /mnt/tmp/glibc/glibc-~1

というコマンドを補完入力しつつ投入することとなろう。(余談ながら、今となっては MS-DOS 用の短いファイルネームを使うことなど滅多にないものだから、実に懐しかった。)

(6)chroot を解除し、再起動する。

次のコマンドを順に投入されたし。

exit
reboot

(7)/etc/slackpkg/blacklist ファイルを編集し、slackpkg コマンドを再投入する。

無事起動することを確認してからログインし、root 権限で /etc/slackpkg/blacklist ファイルのうち、以下の個所を編集する。

[0-9]+alien

文頭に # を入れてコメントアウトし、slackpkg コマンドによってこれまでアップグレードされていなかったパッケージ一式をダウンロードさせてインストールする。

(先ほどの MS-DOS 用の短いファイル名が記されたファイルが /var/log/packages にできていて気持ち悪いという方は、/var/log/packages ディレクトリへ移動して

removepkg glibc-~1

というコマンドを投入してから、USB メモリにコピーしておいたパッケージを再度インストールし直す。

installpkg glibc-solibs-2.25-x86_64-2.txz

これを行ってから、下のコマンドを投入すれば良かろう。ただ、この作業を飛ばしても、下のコマンドを投入することによって再度同じパッケージがダウンロードされて上書きインストールされるので、わたしは件のファイルはそのままにしておいた。)

slackpkg install-new
slackpkg update
slackpkg upgrade-all

これで一通りの作業が完了する。

ご存じの通り、Ubuntu や Debian などとは違って、Slackware にはパッケージ間の依存関係を調べるシステムがない。それゆえ、Slackware、しかも current 版を日常的に使っていると、この種のトラブルは日常茶飯事だ。だが、基本的なことがらさえ分かっていたら、たいていのトラブルは解決できてしまう。というわけで、再インストールというカードは安易に切ることなく、むしろトラブルを楽しめるぐらいでありたいものだ。実際、今回のトラブルが発覚した際には、ブログに書くネタが一つできたと嬉しがってしまったぐらいだ。

(追記: この問題の解決法については、LinuxQuestions.org にもあったので、リンク先を紹介しておく→[SOLVED] Updated 14.2 current GLIBC_2.25 not found こちらの方が上記のものよりもずっと綺麗な解法だと思うが、こういうやり方は思い付かなかったのだ……。)

コメント

このブログの人気の投稿

TEAC CD-P800NTのリレー音問題が見事解決!

「ヴォイニッチ手稿」に関する新説が、さらにもう一つ!

時代に取り残された老害、筒井康隆