ブートしなくなったLinuxの修復

(Last Updated On: 2021/04/06)

VMwareゲストのFedora 33が起動しなくってしまい直す事にしました。原因は今一つ判っていないのですが、ホストのFeodra 33のカーネルに外れがありシステムが連続してフリーズしたりことがあります。恐らくこれが原因でしょう。

どうせテスト用なので再インストールでも良かったのですが、直せる物は直すということで直しました。

現象

ブートメニューは普通に表示され、カーネルも普通に起動しようとするがrootファイルシステムをマウントしようとした時にフリーズしてしまう。エラーメッセージ等は取得できない。

シングルユーザーモードやrescueカーネルでも同じくrootファイルシステムをマウントしようとしたところでフリーズする。

トラブルシューティング

FedoraのインストールDVDを起動して問題のゲストの/bootと/パーテションをマウントして確認すると問題なくマウント可能でした。

今のFedora DVDには既存システムレスキュー用のオプションが無いようなのでLiveとして起動し、”su -” でrootになった後

mkdir /mnt/sysroot 
mount /dev/sda3 /mnt/sysroot 
mount /dev/sda1 /mnt/sysroot/boot  
for dir in proc dev sys; do mount --bind $dir /mnt/sysroot/$dir; done 
chroot /mnt/sysroot

とやって見ると /lib64/libelf* がロードエラーになりました。/lib64の中身を見るとsymlinkされた実体ファイルが2バージョンありファイルサイズ0の新しいバージョンの方にリンクしていました。

問題の原因

ここまでで恐らくdnf update中にシステムが固まった為に中途半端にsymlinkが作られてしまいライブラリが読込めない為にブートできなかったと分かります。

実際、壊れ方の様子からdnf update中のホストPCのフリーズが原因でしょう。

問題の修正

libelf(Linux実行バイナリであるELFバイナリを処理するライブラリ)が読込めないのは致命的でどうしようもないです。chrootしてシェルが動作する為に必要なライブラリを他のFedoraからrsync -ae sshでコピーしてchroot可能にした後にディスクからブートしてみます。

GUIで起動するにはライブラリが足りなくてブートできません。

grubのブートメニューから”e”コマンドで編集モードに入ってlinux カーネルのブートオプションにsingleを追加しシングルユーザーモードで起動します。

chrootが動作するくらいにはライブラリは直っているのでシングルユーザーモードでは問題なく起動します。NetworkManagerでネットワーク設定がされているいて手動で設定するのは手間なのでランレベルをtelinit 3を実行してマルチユーザーモードにします。問題なくマルチユーザーモードになりネットワークも使えるようになりました。ここまで来れば簡単です。

ldconfigを実行してリンクがおかしくなっているライブラリをチェックします。2つのバージョンのライブラリがインストールされている状態になっていたので

rpm -qf <リンクがおかしいライブラリファイルへのパス>

でrpmパッケージ名とバージョンを確認し

dnf reinstall -y --allowerasing <pkgname-version付き>

として新しいバージョンのrpmのみで再インストールします。

どのライブラリが使えなくなっているのかにより、使えるコマンドが変わるのでその辺りは適宜使えるコマンドで直していくと良いでしょう。ライブラリがおかしな場合は、このライブラリがロードできない、とエラーになるのでどれを修正すれば良いのか分かります。

システム全体のチェック

自分が普段使うコマンドや機能だけチェックしても、おかしくなっているライブラリやファイルもあるはずです。rpmの検証機能で簡単に確認できます。

rpm -Va

これでrpmがインストールされた時から変更されたファイルを全てチェックできます。

幾つかのアプリケーションが2つインストールされた状態になっていたのでdnf reinstall –alllowerasingで直しました。

昔取った杵塚でブートしなくなったLinuxを直す作業には慣れているので再インストールよりは速く直せたと思います。