[FreeBSD-users-jp 95970] Dual boot on dynabookN51(その4 -- UEFIファームウェア)

丸山直昌 maruyama @ ism.ac.jp
2016年 9月 20日 (火) 02:25:56 UTC


統計数理研究所の丸山です。

Toshiba dynabookN51 上での Windows8.1 と PC-BSDの dual boot。
随分と時間が空いてしまいましたが、最後のトピックを書きます。

PC-BSD10.3を動かすことに一応は成功したものの、どうもこのUEFIファームウェ
アは変、というかUEFIの規格から外れているように思います。
https://ubuntuforums.org/showthread.php?t=2147295 には次の記述があります。

Systems that only boot Windows from UEFI.
Per UEFI standard you should be able to boot any entry in UEFI boot
menu. But some vendors have modified UEFI code to only boot the
Windows efi file.

dynabookN51がまさにこれに該当するように思います。FreeBSDとは直接関係な
い話題で申し訳ありませんが、この記事では私がそう確信するに至った証拠と
いいますか、実験をいくつか紹介したいと思います。

使ったマシンの状況ですが、高速スタートアップを無効、システムの保護も無
効としてあり(例えば http://d.hatena.ne.jp/msll/20150527/1432708323 参
照)、ada0 にはbios-boot, efi, Windows用領域3つとPC-BSD10.3のインストー
ラーが作ったfreebsd-zfs とfreebsd-swapがあります(他の記載は省略)。
partitionの番号が順序通りではありませんが、それは partiton 4の領域を縮
小してPC-BSDをインストールしたからです。

  1  bios-boot  (1.0M)
  2  efi  (100M)
  3  ms-reserved  (128M)
  4  ms-basic-data  (78G)
  7  freebsd-zfs  (100G)
  8  freebsd-swap  (2.0G)
  5  ms-basic-data  (50G)

PC-BSD10.3のインストーラーは efiパーティションに \BOOT\BOOTX64.EFI を
作り、また bios-boot パーティションには gnu-grubを書き込んでいます。

色々な試行錯誤の末、現在のEFIブート構成データ(Windowsのコマンドプロン
プト[管理者]で bcdedit /enum all としたときの出力)はこの記事の末尾のよ
うになっています。

この状態で dynabookN51 の電源を入れますと

1. 「Windowsブートマネージャー」と題するラインモードのメニューが現れ、
    Windows 8.1
    Windows Recovery
  の二つアイテムが現れる。ここで Windows 8.1 を選択すればWindows8.1が
  立ち上がるが、ESCキーを押すと
2. 画面が一度消えて、その後一瞬同じ「Windowsブートマネージャー」が表示さ
  れるがすぐに消えて
3. 「 >> Start PXE over IPv6. 」と表示されて、十数秒でタイムアウト
4. 「 >> Start PXE over IPv4. 」と表示されて、十数秒でタイムアウト
5. 何故かもう一度「 >> Start PXE over IPv4. 」と表示されて、十数秒でタイ
  ムアウト
6. gnu-grubのメニュー画面が表示され、PC-BSDが起動できる

という経過をたどります。ネットワークの UTPケーブルを抜いた状態で電源を入
れると 3,4,5 は飛ばして 6に入ります。

この状態でいくつかの実験をします。(それぞれの実験終了後には一旦この状
態に戻してから次の実験を行いました。)

実験0. 電源投入時に F12 を数回押すと、 Boot Menu という画面が現れます。
メニューアイテムは
  USB
  HDD/SDD
  LAN
  <Enter Setup>
  <HDD Recovery>
の5個で、2番目の HDD/SDD を選ぶと1-6と似た経過を取りますが、2の後もう一度
1となり、その後

>> Start PXE over IPv6
PXE-E21: Remote boot canceled.

と一瞬表示された後、4,5,6となります。

実験1. Windowsのコマンドプロンプト(管理者用)で
	bcdedit /set {bootmgr} displaybootmenu no
とすると、bcdedit /enum all の出力における {bootmgr}のエントリの最後の
部分は

timeout                 0
displaybootmenu         No

となり、この状態では電源投入後メニューは表示されずに、ただちにWindows8.1
が起動されます。

実験2.
	bcdedit /set {bootmgr} timeout 3
として、bcdedit /enum all の出力における{bootmgr}のエントリの最後の部
分を

timeout                 3
displaybootmenu         Yes

としておきます。この場合は電源投入後にラインモードのメニューが表示され
て、そのまま3秒経過するとWindows8.1が起動しますが、その前にESCを押せ
ば、2〜6の経過をたどります。

実験3. 
	bcdedit /deletevalue {bootmgr} displaybootmenu
とすると bcdedit /enum all の出力における{bootmgr} のエントリで
displaybootmenu で始まる行が表示されなくなります。これを使って最後の部
分を

timeout                 0

としておくと、電源投入後メニューは表示されずに、ただちにWindows8.1が起
動されます。(この状態が工場出荷値であったように思います。)

実験4.
	bcdedit /deletevalue {bootmgr} displaybootmenu
	bcdedit /set {bootmgr} timeout 3

として bcdedit /enum all の出力における {bootmgr} のエントリの
displaybootmenu という行表示を消し、最後の部分を

timeout                 3

としておきます。この状態では電源投入後、画面には

Windows 8.1
Windows Recovery
Windows Recovery Environment

の3つの青い四角形のアイコンが現れ、3秒のカウントダウンが始まります。
そのまま3秒経過するか、Windows8.1を選べば通常通りWindows8.1が起動され
ます。ここでESCを押すなどの操作を色々試してみても gnu grub のメニュー
に辿り着くことはできませんでした。

実験5.
	bcdedit /set {bootmgr} displayorder {e97bf818-4850-11e5-beab-ca77328079f8} /addlast

とすると、電源投入後に1の画面で、Windows 8.1 と Windows Recovery の二
つメニューアイテムに加えてGnuGrub というアイテムが現れますが、これを選
んでも、0xc000007b のエラーコードを表示してそれ以上進めません。

実験6.
	bcdedit /set {bootmgr} displayorder {e97bf818-4850-11e5-beab-ca77328079f8} /addlast
	bcdedit /deletevalue {bootmgr} displaybootmenu
	bcdedit /set {bootmgr} timeout 3

とすると、電源投入後、実験4のときの3つの四角形アイコンに加えてGnuGrub
いう四角形のアイコンが現れますが、このアイコンを選んでも実験5と同じ結
果になります。

このエラーコード 0xc000007b をグーグル検索してみると、多くの人が同じエ
ラーコードに遭遇していることがわかりますが、私の状況にぴったり当てはま
る記事は多くはありません。今は見つけられないのですが、その中に
「bootmgrから起動できるのはWindows系のアプリだけであって他のOSを起動す
ることは無理」というものがありました。これが私の状況に一番良くあてはま
るのだと思います。実際

http://d.hatena.ne.jp/msll/20150527/1432708323
http://qiita.com/takawata19/items/3d1fb96cfde4f1626e3c

などを見ても FreeBSD のブートローダーに対応するエントリは {fwbootmgr}
の displayorder に追加しているのであって、 {bootmgr}の displayorderで
はありません。しかし私の状況では {fwbootmgr} の displayorder には
{e97bf818-4850-11e5-beab-ca77328079f8} つまりdescription GnuGrub
のエントリを入れてあるのに実験0でGnuGrubというアイテムが現れないのは
何故でしょう?奇々怪々です。

実験5,6 はもう一つ重要なことを意味していると思います。それは電源投入時
に現れる1の画面が fwbootmgr のメニュー画面ではなく、 bootmgr のメニュー
画面だ、という点です。

{fwbootmgr} のメニュー画面を表示、あるいは変えるにはどうしたら良いか?
この点を理解すために更に次のような実験をしてみます。

実験7.
	bcdedit /set {fwbootmgr} displayorder  {dc984317-4850-11e5-beab-ca77328079f8} /remove
	bcdedit /set {fwbootmgr} displayorder  {dc984318-4850-11e5-beab-ca77328079f8} /remove
とすると、{fwbootmgr} の displayorder のところは

identifier              {fwbootmgr}
displayorder            {bootmgr}
                        {e97bf818-4850-11e5-beab-ca77328079f8}

となります。この状態で電源を入れると1〜6には全く何の変化も見られません。
これは驚きというべきだと思いますが、それどころか、もう一度Windowsを起
動して見てみると、

displayorder            {dc984317-4850-11e5-beab-ca77328079f8}
                        {dc984318-4850-11e5-beab-ca77328079f8}

と勝手に書き直されています。

実験8.
	bcdedit /set {fwbootmgr} displayorder {e97bf818-4850-11e5-beab-ca77328079f8} /remove
	bcdedit /delete {e97bf818-4850-11e5-beab-ca77328079f8}
として gnu grubのエントリをブート構成情報から完全に消し去って電源を入れると、
1〜6が全く同じように進行します。

実験9.
	bcdedit /set {fwbootmgr} displaybootmenu yes
とすると、
	この操作を正しく終了しました。

と表示されて、一見正常に終了しますが、 bcdedit /enum all の出力には何
の変化も見られず、電源投入時の挙動1〜6にも全く変化がありません。

要するに {fwbootmgr} をどういじろうとも、何も変化は起こらないというこ
とのようです。

以上の実験から、dynabookN51 は「Windows以外には使わせない」というメー
カーの方針のもとでUEFIファームウェアが規格とは違った作りになっていて、
唯一の抜け道が 1 の画面でESCを押すことである、と私は結論した次第です。
なお、 System BIOS Version は 1.00 となっています。

以上です。

================================================================
以上の実験の前提としたEFIブート構成データ(Windowsのコマンドプロンプト
[管理者]で bcdedit /enum all としたときの出力)

ファームウェアのブート マネージャー
--------------------------------
identifier              {fwbootmgr}
displayorder            {bootmgr}
                        {dc984317-4850-11e5-beab-ca77328079f8}
                        {dc984318-4850-11e5-beab-ca77328079f8}
                        {e97bf818-4850-11e5-beab-ca77328079f8}
timeout                 0

Windows ブート マネージャー
--------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  ja-JP
inherit                 {globalsettings}
bootdebug               Yes
default                 {current}
resumeobject            {dc984315-4850-11e5-beab-ca77328079f8}
displayorder            {current}
                        {e97bf812-4850-11e5-beab-ca77328079f8}
                        {e97bf811-4850-11e5-beab-ca77328079f8}
toolsdisplayorder       {memdiag}
timeout                 0
displaybootmenu         yes

Windows ブート マネージャー
--------------------------------
identifier              {e97bf818-4850-11e5-beab-ca77328079f8}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\BOOT\BOOTX64.EFI
description             GnuGrub
locale                  ja-JP
displaybootmenu         Yes

ファームウェア アプリケーション (101fffff
--------------------------------
identifier              {10d18537-533f-11e5-8268-806e6f6e6963}
description             UEFI: IP6 Realtek PCIe FE Family Controller

ファームウェア アプリケーション (101fffff
--------------------------------
identifier              {10d18538-533f-11e5-8268-806e6f6e6963}
description             UEFI: IP4 Realtek PCIe FE Family Controller

ファームウェア アプリケーション (101fffff
--------------------------------
identifier              {dc984317-4850-11e5-beab-ca77328079f8}
description             EFI Network

ファームウェア アプリケーション (101fffff
--------------------------------
identifier              {dc984318-4850-11e5-beab-ca77328079f8}
description             EFI USB Device

Windows ブート ローダー
--------------------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows 8.1
locale                  ja-JP
inherit                 {bootloadersettings}
recoverysequence        {e97bf811-4850-11e5-beab-ca77328079f8}
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {dc984315-4850-11e5-beab-ca77328079f8}
nx                      OptIn
bootmenupolicy          Standard
detecthal               Yes

Windows ブート ローダー
--------------------------------
identifier              {e97bf811-4850-11e5-beab-ca77328079f8}
device                  ramdisk=[unknown]\Recovery\WindowsRE\Winre.wim,{e97bf812-4850-11e5-beab-ca77328079f8}
path                    \windows\system32\winload.efi
description             Windows Recovery Environment
locale                  ja-jp
inherit                 {bootloadersettings}
displaymessage          Recovery
displaymessageoverride  Recovery
osdevice                ramdisk=[unknown]\Recovery\WindowsRE\Winre.wim,{e97bf812-4850-11e5-beab-ca77328079f8}
systemroot              \windows
nx                      OptIn
bootmenupolicy          Standard
winpe                   Yes

休止状態からの再開
--------------------------------
identifier              {dc984315-4850-11e5-beab-ca77328079f8}
device                  partition=C:
path                    \Windows\system32\winresume.efi
description             Windows Resume Application
locale                  ja-JP
inherit                 {resumeloadersettings}
recoverysequence        {e97bf811-4850-11e5-beab-ca77328079f8}
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
filedevice              partition=C:
filepath                \hiberfil.sys
bootmenupolicy          Standard
debugoptionenabled      No

Windows メモリ テスター
--------------------------------
identifier              {memdiag}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\memtest.efi
description             Windows Memory Diagnostic
locale                  ja-JP
inherit                 {globalsettings}
badmemoryaccess         Yes

EMS 設定
--------------------------------
identifier              {emssettings}
bootems                 No

デバッガー設定
--------------------------------
identifier              {dbgsettings}
debugtype               Serial
debugport               1
baudrate                115200

RAM 不良
--------------------------------
identifier              {badmemory}

グローバル設定
--------------------------------
identifier              {globalsettings}
inherit                 {dbgsettings}
                        {emssettings}
                        {badmemory}

ブート ローダー設定
--------------------------------
identifier              {bootloadersettings}
inherit                 {globalsettings}
                        {hypervisorsettings}

ハイパーバイザー設定
-------------------
identifier              {hypervisorsettings}
hypervisordebugtype     Serial
hypervisordebugport     1
hypervisorbaudrate      115200

再開ローダー設定
--------------------------------
identifier              {resumeloadersettings}
inherit                 {globalsettings}

デバイス オプション
--------------------------------
identifier              {e97bf812-4850-11e5-beab-ca77328079f8}
description             Windows Recovery
ramdisksdidevice        unknown
ramdisksdipath          \Recovery\WindowsRE\boot.sdi

--------
丸山直昌@統計数理研究所


freebsd-users-jp メーリングリストの案内