読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

UEFI インストールの Windows には、 MBR を書き込まないほうがよい

結論

UEFI 方式でインストールした Windows のディスクにマスターブートレコード(MBR) を書き込む*1と、高速スタートアップやハイブリッドスリープ、ハイバネーション(休止状態)の動作がおかしくなる可能性が大。 例えば GRUBMBR に書き込む*2とおかしくなります。

原因

  • Windows は、UEFI インストールの場合でも、有効な MBR があればMBRから起動しようとします
  • 初回起動(クリーンブート)では、メインボード(M/B)上のファームウェアは、EFI システムパーティション(ESP)内のブートイメージを起動するので支障は起こりません
  • 他方で、高速スタートアップやハイブリッドスリープによる電源断、ハイバネーションの場合には、M/B の ACPI 電源管理機能を利用して休止・復帰を行うため、ESP からのブートと異なる挙動をとることが少なくありません(その方が復帰が早い)
  • よって、休止からの復帰の場合だけ、有効な MBR を読み込んで復帰しようとしてしまい、MBRブートローダが始動。正常な復帰がなされなくなります
  • そこで例えば GRUB をインストールしていたら、 GRUB の画面が出てきてしまいます。GRUB の設定に GNU/Linux ディストリビューションの起動項目1つのみしかないと、問答無用で GNU/Linux が起動されるかもしれません

以下、訥々と話が長いです

MBR 方式って何?

OS を起動する際に、M/B の ファームウェアBIOS)は、OS を直接起動するわけではありません(そもそも、どこに OS があるかを検知不可能です)。 そこで、接続されているディスクの先頭に実行可能バイナリ(ブートローダ)を書き込んでおき、M/B はそのバイナリを探して実行します。

MBR ではなく UEFI (旧称・ EFI) にするメリット

  • MBR はディスクの先頭と決まっていますから、マルウェアの格好の目標です。
  • MBR は1つのディスクに一箇所しかないので、同じディスクに複数の OS をインストールする場合には、 MBR の取り合いが発生しやすいです(特に Windowsプロプライエタリなのでしょっちゅう奪おうとする)。UEFI では、専用のパーティションEFI システムパーティション)にブートイメージを保存しますので、複数のブートイメージの共存が可能です。UEFI 対応 M/B では、ブートイメージを選んで起動させます。

GPT 方式

従来は原則として、一つのディスク上には基本(プライマリ)パーティションと拡張パーティションをあわせて4つしかつくれませんでした。5つ以上のパーティションをつくりたいのなら、拡張パーティション内に論理パーティションをつくります。

従来は、 2 テラバイト(TiB)を超えるディスク領域を扱えませんでした。

Intel は、64 bitアーキテクチャ(IA64)をつくった際に、こうした制約にはとても困ったので(ハイスペックなマシン能力が活用しえない)、 EFI と GPT への移行を提唱しました。

MBR と GPT との関係

原則としては、 MBR・非GPTか、UEFI・GPTかの二者択一です。 Windows でもこの二者択一でしかインストール不可能で、WindowsMBR・非GPT か UEFI・GPTかのどちらかだと決め打ちしています

GPT のディスクでは、"Protective MBR" 方式が導入されます。ディスクを GPT 非対応の M/B に接続した際には、最初の4つまでのパーティションが有効なパーティションとして見えます。MBR にはブートローダを入れず、いわば、ダミーになります。

よって、UEFI・GPT方式で Windows を正常にインストールしている状況では、Protective MBR でしかありええず、 MBR にはブートローダが入っていません

しかし、GPT ディスクに 使える MBRを書き込むことは理論的には可能です。例えば、GPT ディスクの MBR 領域に GRUB をインストールすることは可能です。 GNU/Linux では、UEFIMBR の両方にブートローダが入っていても、 UEFI からブートしますので、差し支えありません。

Windows は、MBR に有効なブートローダが入っていると、そこからブートしようとします

さて、初回起動時(クリーンブート時)には、マシンの制御権は M/B のファームウェアに一身専属ですから、 ESP から正常にブートします。 しかし、休止状態からの復帰は、通常の電源オンではなくて、ACPI による電源管理により中断しています。まるでサスペンドの電源切れた版のような挙動をする(した方がよい)ため、クリーンブートと異なるスタートアップが起こります。 このとき、 Windows は、MBR を読み出すようです。(ただし、M/B によってはもしかすると、そうならないこともあるかもしれません。)

UEFI ではない 旧来の MBR オンリーで Windows でマルチブートだったら?

  • どの OS も MBRブートローダから起動させるしかありません。つまり、どの OS も MBR 方式でインストールするはずです。だから、ブートローダの設定でマルチブートにしますよね?
  • そこで例えば GRUB をインストールしていたら、もしも復帰時に GRUB の画面が出てきたら、 Windows を選んでブートすればよいでしょう

この旧来の MBR 方式のマルチブート環境の場合は、ことあるごとに WindowsMBR を書き換えようとするので、また別の支障があります。Windows Update などで MBR を書き換えるようなパッチの適用がされると、MBR が上書きされて GRUB 消えます

だから従前は、そもそも Windows をインストールしたディスクに他の OS をインストールしないのが最善策でした。

しかし、このブートレコード取り合い問題は、 UEFIに移行すれば解消します。

結局、どうすればいいの?

すべての OS を UEFI・GPT 方式でインストールしてください。 ESP にそれぞれのブートローダをインストールして、M/B のファームウェアの設定で起動対象を選びましょう。

ハイブリッド MBR は、ディスクを UEFI 非対応マシンにつなぎ替える可能性があるときには便利ですが、 GNU/Linux しかインストールしていないようなディスクの場合のみにとどめるべきです。 Windows にハイブリッド MBR を使うには、かなりの戦略が必要です。

http://www.rodsbooks.com/gdisk/hybrid.html の “OSes' Reactions to Hybrid MBRs” の Windows の項目にも、Windows のデフォルトの起動が MBR であることが書いてあります。ハイブリッド MBR ではかなり厄介なのがわかります。

もしも Windows のディスクの MBRGRUB を書き込んでしまったら?

Protective MBR を再度書き込み直します。 おそらく、 GPT fdisk を用いれば可能です。

“x extra functionality (experts only)” → “n create a new protective MBR

参考: http://www.rodsbooks.com/gdisk/walkthrough.html

*1:ハイブリッド MBR

*2:例えば grub-install –target=i386-pc する