木っ端拾いの材木流し

Cannot see the wood for the trees.

wimbootを用いたisoファイルからのWindowsブート

大元の問題は、Windows回復環境(WinRE)がUSB HDD等のリムーバブルでないハードディスクから起動したとみなされた場合に、システムイメージから空のハードディスクへの復元に失敗するという点である。


・WinRE(Windows)は、デバイスがリムーバブルかどうかを判別している。
Set colDrives = objWMIService.ExecQuery _
("Select * From Win32_LogicalDisk Where DriveType = 2")
で2を返すものがリムーバブルディスクとなる。
diskpartのlist volumeで確認できる。partitionが固定ディスク、removableがリムーバブル。
余談だが、回復ドライブやWindowsインストールメディアを作る時にもリムーバブルなドライブしか選べないが、これはホットプラグSATAやUSB接続されていればUSBメモリでもHDDでもリムーバブルと判別される。


・システムイメージからの回復は、接続されているボリューム上にWinREがあるかどうかによって、成功するかどうかが変わる。
WinREをリムーバブルでないハードディスクから起動した場合、接続されているボリューム(WinREの起動デバイス、復元元デバイス、復元先デバイスを含む)にWinREが1つしかないと、復元に失敗する。WinREの起動デバイスに加えて
復元先に既にWinREがある場合は成功する。
ただし、WinREを光学ドライブから起動すると、復元先デバイスにWinREがあってもなくても成功するため、WinREの数だけで判別しているのではないと思われる。


以上から、WinREを使ってシステムイメージから空のドライブに復元する場合、以下のいずれでWinREを起動することが必要になる。
光学ドライブから起動する
・リムーバブルなデバイスから起動する
・その他、ハードディスクと判別されない方法で起動する


物理PCの場合、USBメモリは通常はリムーバブルデバイスとして認識されるので、Windowsで作成した回復ドライブで復元できる。


VirtualBoxの場合、仮想ディスクは基本的にリムーバブルでないハードディスクと認識されるため、回復ドライブでシステムイメージから空のディスクに復元ができない。

対処としては以下の方法がある。
Windowsインストーラーもしくはシステム修復ディスクのisoファイルを作成し、仮想光学ドライブにマウントして起動する
Windowsインストーラーもしくはシステム修復ディスクのisoファイルのrawデータを書き込んだ仮想ディスクを作成し、仮想ディスクから起動する。VirtualBoxUEFIファームウェアはisoのrawデータが書き込まれた仮想ディスクを仮想光学ドライブとして起動ファイルを探す。(OS起動後は仮想ディスクとして認識される)


問題となるのは、物理PCでかつ回復ドライブがリムーバブルディスクとして認識されない場合。

これは過去に遭遇した人がいた。

デジタルドルフィンズ サポセンブログ:他の復元方法を選択してください - livedoor Blog(ブログ)
https://digitaldolphins.livedoor.blog/archives/1946708.html


MBR環境では、上記のサイトに倣ってmemdiskを使うことで回避できた。


memdiskはsyslinuxプロジェクトのコンポーネントのひとつで、syslinux,GRUB2などのブートローダから呼び出せるプログラムである。
https://wiki.syslinux.org/wiki/index.php?title=MEMDISK
ファイルで保存したイメージファイル(フロッピー、ハードディスク、ISOファイル等のrawデータが保存されたファイル)をメモリに展開し、BIOSからこれらのデバイスへのアクセスしているようにエミュレートする。

参考にしたサイトではmkisofsで復元用WIM(WinRE)を含むisoファイルを作成し、syslinux+memdiskでisoファイルからブートすることで、光学ドライブから起動したと見せかけている。


自分はこれを参考に、仮想ハードディスクにBIOS起動するGRUB2をインストールし、memdiskとシステム修復ディスクのisoファイルをコピーしたうえで、GRUB2のシェルから以下のコマンドでisoファイルを起動した。

set root=(memdiskとisoファイルを配置したパーティション)
linux16 memdiskのフルパス raw iso
initrd16 isoファイルのフルパス
boot


UEFI環境の場合、memdiskはBIOSのディスク呼び出しをエミュレートするものなので使えない。

ここでようやくwimbootが登場する。
wimbootは以下のようにハードディスクに展開されたWindows起動ファイル(BIOS環境ならbootmgr)を指定して起動させられるローダーである。
https://superuser.com/questions/1519927/windows-linux-bootdisk-iso
Windows起動ファイルをロードする方法はsyslinuxやgrub2にも存在するが、wimbootはsyslinuxやgrub2から読み込む際にwimbootの引数としてWindows起動ファイル関連の情報を記載できるため、わかりやすい。


最初は展開したWindows起動ファイルからの起動しかできないと思っていたが、以下によるとISOファイルから直接、かつUEFI環境でもWindows起動できるらしい。


INSTALL WINDOWS DIRECTLY FROM AN ISO FILE USING WIMBOOT (MBR\UEFI + GRUB2\GRUB4DOS)
https://rmprepusb.com/tutorials/145-install-windows-directly-from-an-iso-file-using-ipxe-wimboot-mbruefi-grub2grub4dos/


今後、こちらを調べてみる。