[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 メーリングリストの案内