Japanese Stable CLIP を試してみた

Ubuntu をサーバーにして、WinPE を起動する方法

うまくいかなくていろいろ悩んだけど、結果的にはとても単純なことで失敗してたのでメモ。

最初は WinPE を ISO にして、syslinux (pxelinux) の memdisk から起動したり、grub for dos の map を使ったりしてたけど、起動中にフリーズしたり WinPE 起動中に画面表示が崩れたりしてどうにもならなかったので、別の方法を取ることに。


1. まず WIM ファイルを用意します。これは (多分) Linux 上ではできないので、Windows で実施します。この辺は別の機会に説明します。


2. 次に、Ubuntu に dnsmasq パッケージをインストールします。そして、/etc/dnsmasq.conf ファイルを編集します。

dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h
dhcp-boot=Boot/pxeboot.n12,,192.168.0.10
enable-tftp
tftp-root=/srv/tftpboot


こんな感じにします。dhcp-range は DHCP で配布する IP アドレス範囲、dhcp-boot 行の末尾は tftp サーバー (dnsmasq が稼動しているサーバー) の IP アドレスを指定します。
tftp-root は tftp で公開するディレクトリです。

さらに、/srv/tftpboot ディレクトリは Windows から共有フォルダとして参照できるようにします。samba の設定は適当にやってください。その際、/srv/tftpboot/Boot ディレクトリを作成しておきます。Boot の頭文字は大文字にするのが重要です。


3. BCD ファイルを作成します。これは Windows から実施します。その際、/srv/tftpboot を共有フォルダとしてマウントします (ここでは N: にマウントしたとします)。Microsoft のサイト に結構詳しく説明されてます。ただ、新しい Windows AIK だと、WIM のマウント/マウント解除を dism コマンドで実施しています。

スタートメニューから「Deploymentツールのコマンドプロンプト」(だと思う) を、”管理者として実行” します。開いたコマンドプロンプトで、以下のコマンドを実行していきます。
copype x86 C:\WinPE
dism /mount-wim /wimfile:"C:\WinPE\winpe.wim" /mountdir:"C:\WinPE\mount"
copy C:\WinPE\mount\Windows\Boot\PXE\* N:\Boot
dism /unmount-wim /mountdir:"C:\WinPE\mount" /discard
copy C:\WinPE\winpe.wim N:\Boot\


bcdedit コマンドを使用して、起動エントリを作成します。スタートメニューから「コマンドプロンプト (cmd.exe)」を ”管理者として実行” し、以下のコマンドを実行します。
bcdedit /createstore N:\BCD
bcdedit /store N:\BCD /create {ramdiskoptions} /d “Ramdisk options”
bcdedit /store N:\BCD /set {ramdiskoptions} ramdisksdidevice boot
bcdedit /store N:\BCD /set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi
bcdedit /store N:\BCD /create /d "WinPE Boot Image" /application osloader (このコマンドを実行すると GUID が表示されるので、それを以下のコマンドの guid1 と置き換える)
bcdedit /store N:\BCD /set {guid1} systemroot \Windows
bcdedit /store N:\BCD /set {guid1} detecthal Yes
bcdedit /store N:\BCD /set {guid1} winpe Yes
bcdedit /store N:\BCD /set {guid1} osdevice ramdisk=[boot]\Boot\winpe.wim,{ramdiskoptions}
bcdedit /store N:\BCD /set {guid1} device ramdisk=[boot]\Boot\winpe.wim,{ramdiskoptions}
bcdedit /store N:\BCD /create {bootmgr} /d “Windows BootManager”
bcdedit /store N:\BCD /set {bootmgr} timeout 30
bcdedit /store N:\BCD /displayorder {guid1}
copy N:\BCD N:\Boot\



こんな感じです。肝心なのは、Windows は (というか、NTFS や FAT では) ファイル名の大文字、小文字は同じものとしてみなされるけど、Linux では異なるファイル名として扱われること。最初はディレクトリを /srv/tftpboot/boot と小文字で作成していたのですが、起動時に起動ドライブの \Boot\BCD ファイルを探しに行くようで、そのファイルが見つからずにエラー (0xc00000e9) が発生してストップしてしまっていたのです。
あと、{ramdiskoption"s"} や ramdisk"s"didevice のように、オプション項目をよく見ないとコマンドがエラーになります。

まあ、ちょっと手間ではありますが、Windows Server を用意したり、Active Derectory を構築しなくても、dnsmasq パッケージのみを追加すれば済むのが便利・・・かな?

コメント