2014年5月30日金曜日

[解決済み] UEFI nvramが壊れた

ごぶさたです.
ネタあったけどしばらく投稿してませんでした.

4月頭の話です

UEFIではマシンがbootmenuというブートローダーみたいなのを持ち,
*.efiなブートローダーもしくはOSカーネルへのパスエントリとエントリの名前とをセットで保存でき,
HDDやUSB-HDD,FDD,CD/DVDを含めたそれらエントリの起動優先順をbootorderの形で保持しています.これらはnvramに記録されます.

ひとつ前のefibootmgr(0.7.0のひとつ前)の時,libefivarがブッ壊れてたっぽいことがありました.
そしてこいつがnvramに保持されたbootmenuへのデータを壊してしまったのです.

以下その顛末



私は現在ブートローダにrEFIndを使用しています.GRUBよりよっぽどシンプルで,しかもUEFI環境をうまく活用していて構造がわかりやすく,機能豊富です.

最初は私もGRUB2を使用していたので,しばらくGRUB2のエントリとデータも残していましたが,
どうせ使わないのでそれを消すことにしたのです.

とりあえずpacmanでgrubをアンインストールし,efibootmgrでエントリを削除し,これでおーけーです.
確認のために起動しました

これが悲劇のはじまりでした

なぜかGRUBのresucueモードが動きます


なぜ? why?

EFI System Partionの\EFI\Boot\bootx64.efiはブートエントリが存在しない場合の
fall backとして動作するのです.

そう,ここにgrubをコピーしてそのまま残しっぱなしだったのです.
しかし,rEFIndのエントリはどこにいった?
最悪Windowsのエントリが動きはじめるはずでは?

GRUB rescueだけで実際のGRUBのモジュールはもう全部アンインストールしてあるので,
プロンプトが上がるだけでコマンドが一切つかえないゴミです.

しょうがないのでUEFI BIOSの設定を見ようと再起動すると……
なぜかGRUB rescueに落ちるまで一切のキー入力を受けつけない!!!!!

わけがわかりません.コマンドがひとつもつかえないGRUB rescue以外に何もできなくなりました.


USBメモリからブートしようにもUSBメモリを挿してもHDDからGRUB rescueが立ち上がります


ここで私は思いついた策を実行しました.
それは……

1) ラップトップの蓋を開く
2) HDDの接続を外し,USBメモリを挿しながら起動
3) USBメモリのArchLinuxのloader.efiがLinuxカーネルを起こす前にHDDを接続しなおし

これで,efibootmgrが壊れてないArchLinuxが起動した上にHDDを認識させることに成功しました.

この状態でefibootmgrでエントリを覗いてみると……
なんかbootorderに存在しないエントリ番号(FFFFとかFFE4とかありえないナンバー)が並んでました.
絶対なにかオーバーフローしてます.

とりあえずbootorderをクリアした上でrEFIndのブートエントリを追加しなおし,事無きを得たのでしたとさ.

おしまい.


最後にTIPS.

今回の事案には関係ないですがメモ
efibootmgrは-dでディスクを選択できます.
また,ThinkPad Edge E145などはEFI System Partitionが/dev/sda2だったりするので厄介ですが
efibootmgrの-pオプションでパーティションを選択できるので問題ないです