ひよこになりたい

Programming Server Network Security and so on

SyslinuxでUSBメモリからWindowsインストールメディアを起動する

大学のメディアを使うときにちょっと詰まったのでメモ
コピペでできるように書いておきます
USBメモリ/インストールメディアに限定した話ではないけど、よく使うのがUSBメモリなのでとりあえずタイトルはこれで。

Arch Linuxで作ります。Ubuntuとか他のLinuxでも同じ感じでできるはず

必要なもの:

環境設定(Arch)

$ sudo pacman -S syslinux
$ sudo pacman -S dosfstools  # mkfs.vfat用
$ sudo pacman -S parted  # fdiskでもOK

USBのフォーマットとパーティショニング

まずUSBメモリを特定する。適当に以下のコマンドを駆使して目星をつける。

$ sudo fdisk -l
$ lsblk
$ dmesg  # USBを挿してすぐに見てみる 

今回は/dev/sdkがUSBでした。

次にフォーマットとパーティショニング。partedを使う。
USBの中身は完全に消去されるので注意

$ sudo parted /dev/sdk
(parted) p
(parted) mklabel msdos
(parted) mkpart primary fat32 0% 100%
(parted) set 1 boot on
(parted) p
(parted) quit

ブートフラグを立てておく。

作成した/dev/sdk1をfat32でフォーマット 

$ sudo mkfs.vfat /dev/sdk1

インストールメディアの書き込み

USBメディアとisoメディアをマウントしてisoのファイルをUSBにコピー。

$ sudo mkdir /mnt/{iso,usb}
$ sudo mount -o loop ~/path_to_iso/Win_Installer.iso /mnt/iso
$ sudo mount -o rw /dev/sdk1 /mnt/usb
$ sudo cp -r /mnt/iso/* /mnt/usb/

おそらく/mnt/usb/boot/ができているはず...

Syslinuxをいれる 

Syslinuxの本体のコピーとインストール

$ sudo mkdir /mnt/usb/boot/syslinux
$ sudo cp -r /usr/lib/syslinux/bios/*.c32 /mnt/usb/boot/syslinux/
$ sudo extlinux --install /mnt/usb/boot/syslinux

これだけでは起動できないのでmbrを書き込む

$ sudo dd if=/usr/lib/syslinux/bios/mbr.bin of=/dev/sdk bs=440 count=1 conv=notrunc

設定ファイル(syslinux.cfg)がないので作成する 

$ cd /mnt/usb/boot/syslinux/
$ sudo vim syslinux.cfg
--------- vim ---------
PROMPT 1
TIMEOUT 30
DEFAULT menu.c32

LABEL BOOTMGR
        MENU LABEL ^Windows-installer
        COM32 /boot/syslinux/chain.c32
        APPEND fs ntldr=/bootmgr
-----------------------

Windowsは/bootmgrを呼び出す必要があるみたいなので、chain.c32のオプションのntdlrで指定する。
bootmgrはWindows Vista以降で使われるブートローダー。
chain.c32はチェインロードを可能にするモジュール。syslinuxからbootmgrへとチェインロードする。
fsはパーティションを検出してくれる(らしい。よくわからないけど、消すとbootmgrを読み込んだあとエラーで落ちた)
ntldrはWindowsブートローダーをロードするchain.c32のオプション。

Comboot/chain.c32 - Syslinux Wiki

あとかたづけ

$ cd
$ sudo umount /mnt/usb
$ sudo umount /mnt/iso

これで終了 qemu-KVMでは無事インストーラーが起動しました。 boot:が表示されて3秒後に起動するけど、起動しない場合はmenuと打ってみるといいかも?