起動しないマシンをUEFI Shellで救う

UEFIマザーボードには各種設定やファイル表示・変更ができるコマンドラインシェル機能があります。これを使用すればOSが起動する前にファイル変更・移動・削除できるので、誤設定で起動しなくなったマシンを救えます。

UEFI Shellへの入り方

UEFI Shellは、UEFI環境で動作するオープンソフトウェアです。Cloverをインストールすると、EFI/CLOVER/toolsの下にShell64.efiというような名前でインストールされます。Cloverの起動ドライブ設定画面から「Start UEFI Shell 64」を選択すると起動します。

最近のマザーボードには、マザーボード内のメモリーにもすでにUEFI Shellがインストールされています。なので、BIOSメニューの中からもシェルを起動できます。起動メニューは、BIOSのSave & Exitの項目の中にあることが多いです。下は、MSIのマザーボードの例です。「UEFI: Built-in EFI Shell」というメニューを選ぶとシェルに入ります。

CloverのESPにあるシェルとマザーボードで用意されているシェルは、バージョンが異なります。Cloverから起動できるシェルの方が機能が多いです。以下では、Cloverから起動したシェルで説明します。

ESPのあるファイルシステムに移動する

シェルが起動したら、

help -b

とタイプするとヘルプの一覧が出ます。-bオプションは、画面1ページごとに一旦停止して表示するためのオプションです。このオプションはほかのコマンドでも使えます。今回使うべき機能は、

  • bcfg NVRAMに保存されたbootとdriverオプションを管理します。
  • cd ディレクトリーを移動します
  • cp ファイルやディレクトリをコピーします
  • edit エディタを起動してファイルを編集します
  • exit シェルを終了します
  • ls ディレクトリの中のファイルを表示します
  • map ファイルシステム (FS) のマップを表示・定義します
  • reset システムをリセットします
  • mv ファイルやディレクトリを移動・改名します
  • rm ファイルやディレクトリを消去します

です。このうちbcfg, edit, map以外はmacOSの(というかUnixの)シェルコマンドと同じです。シェルが起動したらまずは、

bcfg boot dump

とタイプします。NVRAMに保存された起動情報をdump(画面表示)するコマンドです。これでboot可能なドライブ一覧が表示されます。boot可能ドライブが1個しかなければ、1個が表示されます。複数あれば複数表示されます。複数現れる場合はbootの優先順です。

何かの不具合でブートドライブとして見えない場合はこのコマンドで追加もできます。例えばaddコマンドを使って、fs1:\EFI\EFI\BOOT\にあるBOOTX64.efiをブート順位2(先頭は0)に、Boot macOSという表示名で追加する場合は以下のようにします。

bcfg boot add 2 fs1:\EFI\EFI\BOOT\BOOTX64.efi "Boot macOS"

また不要なドライブを一覧から消すこともできます。例えばrmコマンドを使って順位4を削除する場合は、以下のようにします。

bcfg boot rm 4

今回はdumpコマンドを使って単に閲覧するだけにします。以下は、bootドライブが一つだけの場合のdumpコマンドの実行例です。

UEFIはBOOTX64.EFIというファイルを見つけてコンピュータのbootを行うのですが、そこに至るパスがDevPathという項目に書いてあります。最初がドライブの種類で、パーティションがGPTであるかなどが書かれています。そのあとに32桁の16進数があります。これはパーティションを特定するUUIDです。ESP (EFI System Partition) がdisk0s1の場合、macOSのターミナルからdiskutilコマンドを使って、

diskutil info disk0s1

とタイプするとESPのパーティションUUIDがわかるのですが、それと同一のものが見えているはずです。これでESPのパーティションUUIDの目星をつけてメモしておきます。UUID全部をメモする必要はなくて、最初と最後の数桁で良いです。

次に

map -b

とタイプします。ファイルシステムのマップが出てきます。この中に、先ほどのESPのUUIDと同じものがあるはずです。それを見つけて、ESPのファイルシステム番号を確認します。行頭にFSと書いてある次の番号です。ドライブが1個しかなければ、ESPは大抵FS0:に割り当てられています。以下は、ESPがFS0:に割り当てられていた場合で説明します。

次に

fs0:

とタイプします。Unix系のファイル操作と違って、ファイルシステム(ほぼパーティションに相当します)ごとにルートディレクトリがあります。C:ドライブやD:ドライブのあるWindowsの方式に近いです。Windowsではドライブキャラクタにコロンをつけるとそのドライブ内のルートディレクトリに移動します。このシェルでも同様にfs0:でESPのルートディレクトリに移動します。なのでこの後、

ls

コマンドをタイプすると、ESPのルートのファイル名(多分EFIというディレクトリが一つ)見えます。この後は、ls, cd, cp, mv, cp, rm, edit, type (Unixのcatに相当)コマンドを駆使して、ファイルを操作します。

config.plistを書き換える

動いているマシンのconfig.plistをちょっと変更したら起動しなくなってしまった、という経験は皆さん何度もされていると思います。そんな場合はUEFI Shellでconfig.plistを元のように書き換えてしまうことができます。起動しなくなってもCloverの起動選択画面表示はされると思いますので、そこでUEFI Shellを起動します。上記の手順を踏んで、ESPのファイルシステムに移動します。その後、

cd EFI\CLOVER
ls
edit config.plist

とタイプすれば、CLOVERのディレクトリに行き、ファイルを一覧し、config.plistを編集できます。ディレクトリの区切りは、Unixのように/(スラッシュ)ではなく、\(逆スラッシュ)です。これもWindowsのような流儀ですね。また、タブキーで補完機能が効くので、例えばedit conあたりでタブを押せばあとを補完してくれます。(Unixの補完と違って最初にヒットした名前に補完されるので多少注意が必要です。)

editコマンドではフルスクリーンのテキストエディタが開きます。コントロールEでヘルプが表示されます。操作は簡単で、

  • Ctrl-G 行に移動。行番号の入力を促される
  • Ctrl-S ファイルを保存する
  • Ctrl-Q 終了する
  • Ctrl-F 検索する
  • Ctrl-R 検索・置換する
  • Ctrl-K 行をカットする
  • Ctrl-U 行をペーストする
  • Ctrl-O ファイルを開く
  • Ctrl-T ASCIIとUNICODEの切り替え
  • Ctrl-E ヘルプを開く
  • Ctrl-W ヘルプを閉じる

です。これで大体の編集は可能なので、config.plistを元に戻すことができます。config.plistを保存し、エディタを終了した後で、

exit

もしくは

reset

コマンドをタイプしてシェルを抜けます。resetコマンドはシステムがリセットされます。exitコマンドでは、Clover選択画面に戻ります。大体はexitコマンドでokですが、変更内容によっては変更が反映されないことがあります。resetの方がより確実です。

kext/efiファイルを差し替える

kextやefiファイルを追加したり削除したことで起動しなくなる事故も多いです。これもEFI Shellの操作で復帰できます。kextやefiファイルを外したい場合は、cdコマンドでEFI/CLOVER/kexts/Otherに移動して(EFI Shellの中では区切りを逆スラッシュで指定します)、rmコマンドで削除するか、mvコマンドでバックアップ用のディレクトリに移動させるのが良いです。例えば、_unusedというディレクトリ(名前の最初の文字をアンダースコアにした理由は、ファインダーで上位に表示されるので分かりやすいかと思ったからです)がkextsの中に作ってある場合、ABCD.kextというkextは、

mv ABCD.kext ..\_unused\.

で移動します。もしくは、mvコマンドで、ABCD.kext.backupというようにファイルタイプを変えてしまうのも良いかと思います。バックアップせずにrmコマンドで消してしまっても良いです。

起動に必須だったkext/efiを削除して起動しなくなった場合も同様な方法が可能です。上の例と同様に、もし削除する前に_unusedフォルダのような場所にバックアップされてあればそこから戻せます。

mv ..\_unused\ABCD.kext .

kext/efiとは違うファイルタイプに変えてあるのでしたら、名称変更すれば良いです。

mv ABCD.kext.backup ABCD.kext

ということで、kext/efiを削除する場合は、起動しなくなる状況に備えて戻せるように、ESPのどこかに残しておく事が重要です。

また新たに必要なファイルをUSBメモリに入れて、それを起動ESPに追加することも可能です。例えば、USBメモリの場所がfs3だったら、

cp fs3:\DSDT-XXXX.aml .

のようにしてコピーすることが可能です。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です