マルチブートUSBの作り方（Windows10対応）

# 概要
USBメモリへ複数のOSインストールISOファイルを配置し，ブートローダをインストールすることで，マルチブートなUSBメモリを作成する．
手順として，まずWindows10のインストーラを作成したのち，そこへGRUBをインストールする．GRUBから各種LinuxOSのインストーラISOファイルを読み込ませたり，Windowsのインストーラへチェインロードすることで，マルチブートを実現する．

# 必要なもの
* Windows10 マシン
* Arch Linux マシン（他のディストリビューションでも可能）
* USBメモリ（16GB以上推奨）

# 手順
## Windowsでの作業
インストーラーにしたいUSBメモリをあらかじめWindowsマシンに挿入しておく．
最低8GB必要な上，他のLinuxディストリビューションのISOを配置するので，なるべく大容量のものを選択する．

[Microsoftのメディア作成ツール](https://www.microsoft.com/ja-jp/software-download/windows10%E3%80%80)をダウンロードする．
上記ページより「MediaCreationToolXXXX.exe」をダウンロードして起動する．「XXXX」のところにはインストールするバージョンが入る．

起動したツールの説明に従い，USBメモリにOSインストーラを作成する．
インストーラが作成できた旨が表示されれば成功．一先ずWindowsでの作業は終わり．

> インストーラはFAT32で作成されるため，大容量のUSBメモリを利用しても32GBのパーティションに区切られる．Windowsのディスク管理から残った領域を別パーティションとして利用することもできる．

## Linuxでの作業
作成したインストーラUSBメモリをLinuxマシンへ挿入する．また必要なLinux ISOファイルを用意しておくこと．

以下，Arch Linuxを前提に進める．他のディストリビューションではソフトウェア名称やオプション等が異なる場合がある．本稿で説明するGRUBのバージョンはGRUB2である．

まずGRUBをインストールする．

```shell
sudo pacman -S grub
```

USBメモリをマウントする．アクセス可能になったら，`/mnt/usb/efi/boot/bootx64.efi`をリネームし，`bootx64.efi.windows`とする．

```shell
mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb

mv /mnt/usb/efi/boot/bootx64.efi /mnt/usb/efi/boot/bootx64.efi.windows
```

USBメモリにGRUBをインストールする．

```shell
grub-install --target x86_64-efi --efi-directory /mnt/usb --boot-directory=/mnt/usb/boot --removable
```

次にGRUBの設定ファイルを作成する．パーティションのUUIDを記述する必要があるため，先に調べておく．XXXX-XXXXのようなハイフン区切りの8桁の文字列を取得する．

```shell
lsblk -f | grep /mnt/usb
```

コンフィグファイルの書き方は[Arch Wiki](https://wiki.archlinux.jp/index.php/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%96%E3%83%BC%E3%83%88_USB_%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96)を参考にする．Ubuntu18.04に関してはWikiのUbuntuの情報が古いため以下を参照したほうがよい．Arch Linux，CentOS7，Ubuntu 18.04 Serverの該当するバージョンのISOファイルを用意するか，ISOファイルのバージョンに合わせて該当箇所を修正する．ISOファイルは`/mnt/usb/boot/iso`ディレクトリを作成し，そこにファイルを配置する．Windows10は最初にインストールしたものをチェインロードして起動する．作成したコンフィグファイルは`/mnt/usb/boot/grub/grub.cfg`として保存する．`grub.cfg`の2行目のUUIDは先程取得したものを指定する．

```shell
mkdir /mnt/usb/boot/iso
vim /mnt/usb/boot/grub/grub.cfg
```

```grub.cfg
# path to the partition holding ISO images (using UUID)
set imgdevpath='/dev/disk/by-uuid/XXXX-XXXX'

insmod all_video

menuentry '[loopback]archlinux-2020.03.01-x86_64' {
	set isofile='/boot/iso/archlinux-2020.03.01-x86_64.iso'
	loopback loop $isofile
	linux (loop)/arch/boot/x86_64/vmlinuz archisodevice=/dev/loop0 img_dev=$imgdevpath img_loop=$isofile
	initrd (loop)/arch/boot/x86_64/archiso.img
}

menuentry "[loopback]CentOS-7-x86_64-Minimal-1908" {
	set isofile='/boot/iso/CentOS-7-x86_64-Minimal-1908.iso'
	loopback loop $isofile
	linux (loop)/isolinux/vmlinuz noeject inst.stage2=hd:/dev/sdb1:/$isofile
	initrd (loop)/isolinux/initrd.img
}

menuentry '[loopback]ubuntu-18.04.4-live-server-amd64' {
	set isofile='/boot/iso/ubuntu-18.04.4-live-server-amd64.iso'
	loopback loop $isofile
	linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile locale=en_US.UTF-8
	initrd (loop)/casper/initrd
}

menuentry '[chain]Win10_1909_Japanese_x64' {
  insmod chain
  chainloader /efi/boot/bootx64.efi.windows
}
```

各種ファイルの配置をしたら作業は終了．
OSインストールしたいマシンに挿入し，起動時にBIOSのブートメニューからUSBのパーティション1を選択する．GRUBのメニューが表示されれば成功．

## 参考文献
* [マルチブート USB ドライブ - ArchWiki - Arch Linux](https://wiki.archlinux.jp/index.php/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%96%E3%83%BC%E3%83%88_USB_%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96)
* [Windows 10 のダウンロード - Microsoft](https://www.microsoft.com/ja-jp/software-download/windows10%E3%80%80)
* [メディア作成ツールでWindows 10のUSBメモリのインストーラーを作成する方法](https://www.archlinux.site/2018/05/windows-10usb.html)