EFI System Partition (ESP)の中のconfig.plistやkext類を変更して、macOSが起動しなくなってしまうことがあります。そんな時のためにUEFI shellを使えるようにしておくと復旧作業に役立ちます。CloverやOpenCoreにはUEFI shellを起動する機能がありますが、BIOSメニューから起動する方法をまとめました。
Table of Contents
UEFI Shellで復旧する(おさらい)
UEFI shellを使えば、OSが起動する前段階のUEFIが制御している状態で、ファイルシステムの中身を編集できます。なのでOSの起動に失敗している場合に、その状況を治せる可能性があります。ただしUEFIから読み書きできるファイルシステムに限定されるので、APFSやHFS+の中身は見ることも書き換えることもできません。でも、通常FAT32でフォーマットされるESPは編集可能です。ESPの中のconfig.plistやkext類を変更して起動しなくなってしまった場合は、UEFI shellで編集できるので、システムを復旧させることが可能です。UEFI shellについては、過去の記事でも紹介しました。
UEFIマザーボードには各種設定やファイル表示・変更ができるコマンドラインシェル機能があります。これを使用すればOSが起動する前にファイル変更・移動・削除できるので、誤設定で起動しなくなったマシンを救えます。UEFI Shellへの入り方UEFI Shellは、UEFI環境で動作するオープンソフトウェアです。Cloverをインストールすると、EFI/CLOVER/toolsの下にShell64.efiというような名前でインストールされます。Cloverの起動ドライブ設定画面から「Start UEFI Shell 64」を選択すると起動します。最近のマザーボードには、マザーボード... 起動しないマシンをUEFI Shellで救う - Boot macOS |
この記事では、CloverまたはBIOSからUEFI shellを起動して、ESPを復旧する方法を説明しました。OpenCoreでも、EFI/OC/ToolsにOpenShell.efiを入れておき、config.plistでこれを認識するよう設定すれば、OpenCoreの起動メニューからUEFI shellを起動できます。この先は、以前の記事のダイジェストになりますが、基本的には
- OpenCoreを入れたESPの場所を探して、
- shellコマンドで編集する
という作業を行います。UEFI shellの使い方は、こちらのサイトの説明が簡潔でわかりやすかったです。
概要 UEFI Shellについてのメモ。 目次 概要 目次 UEFI Shellとは UEFI Shell の動作環境構築 Ubuntu 20.04上のQEMU上でShellを試す インストール方法 起動方法 Shell上からホスト上のディレクトリにアクセスできるようにする リンク ソース ユースケース help コマンドの一覧 や 各コマンドの内容について調べる ファイル/ディレクトリ ファイルパスについて マウント可能な一覧を確認する(map) ファイルシステムをマウントする ディレクトリの一覧を表示する(ls/dir) ファイルのコピー(cp/copy)/消去(rm/del)/移動・リ… UEFI Shell の コマンド - 一寸先は/dev/null - 一寸先は/dev/null |
UEFIから見えるボリュームは、fs0:, fs1:, fs2: …のように名前がついています。shellコマンドから
ls fs0:
などと入力すれば、この例ではfs0:のルート部分が見えます。この内容を見ながら、OpoenCoreが使っているESPの場所を探して行きます。接続されたボリュームの数が少なければ、fs0:かfs1:くらいでOpenCoreのESP見つかりますが、多い場合は探すのが大変です。そんな時に、mapコマンドが便利です。mapとタイプすると(またはmap -bとすれば画面に合わせて表示が停止します)、例えば以下のような表示がされます。長いので…で省略してます。
> map Mapping table FS0: Alias(s):HD0c0a0b:;BLK1: PciRoot(0x0)/Pci(0x14,0x0)/USB(0x2,0x0)/USB(0x0,0x0)/HD(1,MBR,... FS1: Alias(s):HD1a65535a1:;BLK3: PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x0,0xFFFF,0x0)/HD(1,GPT,... FS2: Alias(s):HD1a65535a2:;BLK4: PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x0,0xFFFF,0x0)/HD(2,GPT,... FS3: Alias(s):HD1a65535a4:;BLK6: PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x0,0xFFFF,0x0)/HD(4,GPT,... FS4: Alias(s):HD1a65535a5:;BLK7: PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x0,0xFFFF,0x0)/HD(5,GPT,... FS5: Alias(s):HD1b65535a1:;BLK9: PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x1,0xFFFF,0x0)/HD(1,GPT,... FS6: Alias(s):HD1c65535a1:;BLK12: PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x2,0xFFFF,0x0)/HD(1,GPT,... FS7: Alias(s):HD1d65535a1:;BLK15: PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x3,0xFFFF,0x0)/HD(1,GPT,... FS8: Alias(s):HD2b:;BLK20: PciRoot(0x0)/Pci(0x1B,0x4)/Pci(0x0,0x0)/NVMe(0x1,...)/HD(1,GPT,... ...
これを見れば、探すべきドライブの検討をつけることができます。接続方式がUSB, SATA, NVMeと分類されています。またパーティションマップが、MBRなのかGPTなのかもわかります。このマシンでは、NVMeにOpenCoreのESPを入れているので、fs8:が探しているボリュームだとわかります。その場合、
fs8:
とタイプしてそのボリュームに移動します。Windowsでcドライブやdドライブに移動する方法と同じです。次に、cdコマンドでOCのディレクトリに移動して、
cd EFI\OC
ここでls, cd, cp, mv, cp, rm, edit, type (Unixのcatに相当)コマンドを駆使して、ファイルを操作します。ディレクトリの区切りが、macOSやLinuxと違い、Windows風の逆スラッシュになってます。config.plistのバックアップがあってそれがもしconfig_old.plistという名前なら、
mv config_old.plist config.plist
コマンドで元に戻せます。config.plistを変更する場合には、このように確実に動くバージョンを残しておくと、簡単に元に戻せるので楽です。config.plsitを編集したい場合は、
edit config.plist
でエディタを起動します。このエディタでは、コントロール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コマンドでは、OpenCore選択画面に戻ります。大体はexitコマンドでokですが、変更内容によっては変更が反映されないことがあります。resetの方がより確実です。
USBメモリーから起動する
UEFI shellはCloverやOpenCoreの選択画面から起動するだけなく、UEFI環境でshellを直接起動することもできます。UEFI shellはHackintoshのためのツールではありませんので、こちらが本来の使い方です。
通常のUEFIマザーボードの起動ステップでは、FAT32でフォーマットされたドライブの中にある、EFI/Boot/bootx64.efiというファイルを実行しているようです。実際に、OpenCoreのESPにもEFI/BOOT/BOOTx64.efiというファイルがあります。WindowsをインストールしたドライブのESPにも、EFI/Boot/bootx64.efiというファイルがありました。ディレクト名やファイル名の大文字小文字はどちらでも良いようです。UEFI shellのプログラムにbootx64.efiという名前をつけて、このディレクトリにおけば良いようです。
そこで、まずはUSBメモリをFAT32でフォーマットします。パーティションマップはMBRでもGPTでも良いようですが、今回は単純にMBRで試しました。次にこのUSBメモリに、EFI/Boot/というディレクトリを作ります。この中に、OpenCoreで配布されている一式に含まれるOpenShell.efiをコピーして、これをbootx64.efiという名前に改名します。OpenShell.efiは、OpenCoreの起動メニューから動かすために、通常はEFI/OC/Tolls/の中に入れているファイルです。その結果、USBメモリには、
EFI/Boot/bootx64.efi
のような位置と名前で、OpenShell.efiが入ります。このUSBメモリを挿したままコンピュータを起動し、BIOSメニューに入ると、Boot選択の画面に、以下のようにUSBメモリが現れるはずです。
ここでは、
UEFI: JetFlashTrabscend 4GB 8.07, Partition 1 (4.0GB)
という名前で見えています。 小さなサイズのUSB 2.0のUSBメモリを使いました。このボリュームを選択して起動すれば、UEFI shellが起動します。使い道のない古いUSBメモリですが、UEFI shellを入れておけばいざというときに役立ちます。
BIOSメニューから起動する
マザーボードのBIOSメニューに、UEFI shellを起動する機能が提供されていることがあります。マザーボードメーカによって、事情が異なるようです。最近の状況を調べてみました。
MSIマザーボードの場合
以前の記事ではMSIのマザーボードの例を書いていました。MSIのマザーボードでは、独自にUEFI shellのソフトウェアを用意しているようで、BIOSメニューから選択するとそのshellが起動しました。なので、CloverやOpenCoreで用意したshellとは違うバージョンのshellが起動しました。現行のMSIマザーボードが手元に無いので確認できませんが、MSIのZ590マザーボードのマニュアルを見る限りでは、Settings/Save & Exit/Boot Overrideのメニューに、UEFI: Built-in EFI Shellという選択肢が健在のようですので、
引き続き内蔵のshellが起動できるようです。
ASUSマザーボードの場合
Z390 ROG MAXIMUS XI HEROでは、Exitメニューの中に、Launch EFI Shell from USB drivesという項目があります。USBメモリーのルートにUEFI shellのプログラムを、Shell.efiという名前で入れておけば、ここから起動できます。これ以外の名前ではダメなようです。
ただし、BIOS設定でCMSをenabledにしてレガシー起動を可能にしておく必要があります。
Shell.efiを置く場所は、UEFIが見ることのできるボリュームのルートならどこでも良いようです。USBメモリがFAT32でフォーマットされているなら、そのルートで良いです。でもHFS+やAPFSはUEFIから見えないのでダメです。ESP (EFIシステムパーティション)でもokです。また、BIOSメニューにはUSBメモリから起動とありますが、それ以外のドライブでも起動できます。なので、OpenCoreを起動しているESPのルートに、OpenCoreのToolsフォルダからUEFI shellを次のようにコピーしておくと良いと思います。もちろんファインダーのドラッグ&ドロップでもokです。
% cp /Volumes/EFI/EFI/OC/Tools/OpenShell.efi /Volumes/EFI/Shell.efi
この作業をしておけば、ESPの内容をうっかり間違って設定してしまっても、UEFI shellを起動できます。
GIGABYTEマザーボードの場合
実を言うと最近はGIGABYTEマザーボードを使っていないので、良くわかりません。マザーボードメーカを、GIGABYTE –> MSI –> ASUS –> ASRockと遍歴してきたので、最近の事情に疎くて、UEFI shellがBIOSから起動できるかどうかわかりません。マニュアルを取り寄せて見た限りでは、BIOSメニューからUEFI shellを起動する機能に関しての記載が無いようです。もしかしたら起動できないのかもしれません。ご存知の方いらしたら情報よろしくです。
ASRockマザーボードの場合
ASRockの場合は、Exitメニューの中に、Launch EFI Shell from filesystem deviceという項目があります。これを選択すると、M.2, SATA, USBなどに接続されていてUEFIでアクセスできるファイルシステムのルートに置かれたshellプログラムを起動してくれます。ASUSの機能と全く同じです。なのでASRockでも、OpenCoreでは通常EFI/OC/Toolsに置かれるOpenShell.efiを、EFI直下にコピーして入れて置くと、このメニューからそれが起動します。
ASRockの場合は、シェルプログラムのファイル名はなんでも良いようで、例えばOpenShell.efiのままでも起動しました。OpenCore用に入れているOpenShall.efiを以下のコマンドのようにしてコピーしておくだけです。もちろんファインダーのドラッグ&ドロップでもokです。
% cp /Volumes/EFI/EFI/OC/Tools/OpenShell.efi /Volumes/EFI/.
とはいえ、ASUSに合わせてShell.efiにしておいた方が混乱しなくて良いかもです。
各社UEFI shell機能のまとめ
各社のBIOS画面からのUEFI shell起動機能をまとめると
- MSI: マザーボードに内蔵されているshellプログラムを起動する。
- ASUS: EFIがマウントできるボリュームのルートに置いたshellプログラムを起動。プログラム名はShell.efiであること。
- GIGABYTE: 不明。起動できないかもしれない。
- ASRock: ASUSと同じく、EFIがマウントできるボリュームのルートに置いたshellプログラムを起動。プログラム名は任意のようで、OpenShell.efiなどでも起動。
となりました。MSI > ASRock = ASUS > GIGABYTEの順番に、利便性が良いと思います。ASUSとASRockの場合は、起動ボリュームのEFIにShell.efiとして入れておくと、いざという時に役立ちます。MSIは、shellプログラムがマザーボードに内蔵されているのでもっと安心です。
まとめ
Hackintoshの設定を変更して起動しなくなる経験は誰にでもあると思います。そんな時に便利なUEFI shell機能は、
- OpenCoreやCloverの起動メニューから立ち上げる
- 起動ボリューム(USBメモリでも可)から立ち上げる
- BIOSメニューから立ち上げる
などの方法で起動可能です。UEFI shell起動の方法と使い方を知っておくと、いざという時に対処できるかと思います。