マルチブート USB ドライブ
マルチブート USB フラッシュドライブを使うことで単一のドライブから複数の ISO ファイルを起動することができます。ISO ファイルをデバイスにコピーすることで ISO を展開することなく直接起動することが可能です。複数の方法が存在しますが、全ての ISO イメージが使えるというわけではありません。
目次
- 1 GRUB とループバックデバイスを使う
- 1.1 準備
- 1.2 GRUB のインストール
- 1.3 GRUB の設定
- 1.4 ブートエントリ
- 1.4.1 Arch Linux
- 1.4.2 Alpine Linux
- 1.4.3 CentOS
- 1.4.4 Clonezilla Live
- 1.4.5 Debian
- 1.4.6 Elementary OS
- 1.4.7 Fedora
- 1.4.8 Gentoo
- 1.4.9 GParted Live
- 1.4.10 Kali Linux
- 1.4.11 Knoppix
- 1.4.12 Linux Mint
- 1.4.13 openSUSE
- 1.4.14 Parabola GNU/Linux-libre
- 1.4.15 Sabayon
- 1.4.16 Slackware Linux
- 1.4.17 SystemRescueCD
- 1.4.18 Slitaz
- 1.4.19 Slax
- 1.4.20 Spinrite
- 1.4.21 Tails
- 1.4.22 Ubuntu
- 1.4.23 Xubuntu (32ビット)
- 2 Windows のチェインロード
- 3 Syslinux と memdisk を使う
- 4 参照
GRUB とループバックデバイスを使う
利点:
- 必要なのは単一のパーティションのみ
- 全ての ISO ファイルを単一のディレクトリに保存できる
- ISO の追加や削除が簡単
欠点:
- 対応していない ISO イメージもある
- ISO ファイルのオリジナルのブートメニューは表示されない
- 動作するブートエントリを見つけるのが難しい
準備
USB ドライブに最低でも一つのパーティションを作成して GRUB が対応しているファイルシステムを作成してください。パーティショニングやファイルシステム#デバイスのフォーマットを参照。ドライブに保存する ISO ファイルの合計容量にあわせて容量を決めて、ブートローダーのための容量を残しておいて下さい。
GRUB のインストール
シンプルなインストール
USB ドライブ上のファイルシステムをマウント:
# mount /dev/sdXY /mnt
/boot
ディレクトリを作成:
# mkdir /mnt/boot
USB ドライブに grub をインストール:
# grub-install --target=i386-pc --recheck --boot-directory=/mnt/boot /dev/sdX
UEFI モードで ISO を起動したい場合、UEFI ターゲットで grub をインストールする必要があります:
# grub-install --target x86_64-efi --efi-directory /mnt --boot-directory=/mnt/boot --removable
UEFI を使う場合、パーティションは MBR パーティションテーブルの最初のパーティションにして FAT32 でフォーマットしてください。
UEFI GPT + BIOS GPT/MBR のハイブリッドブート
どこでも起動できるユニバーサル USB キーを作成したいときに有用な構成です。まず最初にデバイスに GPT パーティションテーブルを作成する必要があります。最低でも以下の3つのパーティションが必要です:
- BIOS ブートパーティション (タイプ EF02)。
- EFI システムパーティション (タイプ EF00 で FAT32 ファイルシステム)。
- データパーティション (GRUB によってサポートされているファイルシステムを使用)。
BIOS ブートパーティションの容量は 1 MB、EFI システムパーティションは最低でも 50 MB 必要です。データパーティションはドライブの残り容量全部使えます。
次にハイブリッド MBR パーティションテーブルを作成します。保護 MBR パーティションにブートフラグを設定するだけでは十分ではありません。
gdisk を使ってハイブリッド MBR パーティションテーブルを作成する例:
# gdisk /dev/sdX Command (? for help): r Recovery/transformation command (? for help): h Type from one to three GPT partition numbers, separated by spaces, to be added to the hybrid MBR, in sequence: 1 2 3 Place EFI GPT (0xEE) partition first in MBR (good for GRUB)? (Y/N): N Creating entry for GPT partition #1 (MBR partition #2) Enter an MBR hex code (default EF): Set the bootable flag? (Y/N): N Creating entry for GPT partition #2 (MBR partition #3) Enter an MBR hex code (default EF): Set the bootable flag? (Y/N): N Creating entry for GPT partition #3 (MBR partition #4) Enter an MBR hex code (default 83): Set the bootable flag? (Y/N): Y Recovery/transformation command (? for help): x Expert command (? for help): h Expert command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): Y
GRUB をインストールすることで EFI + GPT と BIOS + GPT/MBR の両方に対応させることができます。GRUB の設定 (--boot-directory) は同じ場所に保存してください。
まず、USB ドライブの EFI システムパーティションとデータパーティションをマウントします。そして EFI 用に GRUB をインストール:
# grub-install --target=x86_64-efi --efi-directory=/EFI_MOUNTPOINT --boot-directory=/DATA_MOUNTPOINT/boot --removable --recheck
それから BIOS 用にインストール:
# grub-install --target=i386-pc --boot-directory=/DATA_MOUNTPOINT/boot --recheck /dev/sdX
さらにフォールバックとして、データパーティションに GRUB をインストールすることもできます:
# grub-install --target=i386-pc --boot-directory=/DATA_MOUNTPOINT/boot --recheck /dev/sdX3
GRUB の設定
テンプレートを使う
ドライブに特定の ISO ファイルやフォルダが存在する場合にのみ、他のブートエントリをロードできるようにする grub.cfg
と事前に生成済みの GRUB 設定ファイルを提供する git プロジェクトがいくつか存在します。
- Multiboot USB: https://github.com/aguslr/multibootusb
- GLIM (GRUB2 Live ISO Multiboot): https://github.com/thias/glim
手動設定
マルチブート USB ドライブを作るときは grub.cfg
は自動で生成するよりも手動で編集した方が楽です。もしくは、/etc/grub.d/40_custom
や /mnt/boot/grub/custom.cfg
に変更を加えてから grub-mkconfig で /mnt/boot/grub/grub.cfg
を生成してください。
イメージファイルが存在する USB ドライブのパーティションを識別するのに /dev/sdxY
よりも永続的な名前を使うことが推奨されるので、利便性のため値を保持する変数を定義します。ISO イメージが grub と同一のパーティション上にある場合、起動時に UUID を読み取るように以下を使って下さい:
/mnt/boot/grub/grub.cfg
# path to the partition holding ISO images (using UUID) probe -u $root --set=rootuuid set imgdevpath="/dev/disk/by-uuid/$rootuuid"
または UUID を明示的に指定:
/mnt/boot/grub/grub.cfg
# path to the partition holding ISO images (using UUID) set imgdevpath="/dev/disk/by-uuid/UUID_value"
もしくは、UUID の代わりにデバイスのラベルを使います:
/mnt/boot/grub/grub.cfg
# path to the partition holding ISO images (using labels) set imgdevpath="/dev/disk/by-label/label_value"
必要な UUID やラベルは lsblk -f
で確認できます。USB デバイスに Arch ISO と同一のラベルは使わないで下さい。ブートプロセスが失敗します。
次のセクションに書かれている例を見て、各 ISO イメージのブートエントリをヘッダの下に追加することで設定は完了です。
ブートエントリ
ISO イメージは GRUB をインストールしたのと同じファイルシステムの boot/iso/
ディレクトリに保存します。それ以外のディレクトリに保存する場合、loopback
コマンドを使う時に ISO ファイルのパスの前にデバイスの識別子を付ける必要があります。例: loopback loop (hd1,2)$isofile
。このデバイス識別子は永続的ではないため、このセクションの例では使いません。
以下のように永続的なブロックデバイスの命名を使うことができます (UUID は適当な値に置き換えてください):
# define globally (i.e outside any menuentry) insmod search_fs_uuid search --no-floppy --set=isopart --fs-uuid d6de9100-1981-11e5-9fb9-74867a652f05 # your iso fs uuid here # later use inside each menuentry instead loopback loop ($isopart)$isofile
Arch Linux
月次リリース
archiso も見てください。
menuentry '[loopback]archlinux-2017.04.01-x86_64.iso' { set isofile='/boot/iso/archlinux-2017.04.01-x86_64.iso' loopback loop $isofile linux (loop)/arch/boot/x86_64/vmlinuz archisodevice=/dev/loop0 img_dev=$imgdevpath img_loop=$isofile earlymodules=loop initrd (loop)/arch/boot/x86_64/archiso.img }
archboot
archboot も見てください。
menuentry '[loopback]archlinux-2014.11-1-archboot' { set isofile='/boot/iso/archlinux-2014.11-1-archboot.iso' loopback loop $isofile linux (loop)/boot/vmlinuz_x86_64 iso_loop_dev=$imgdevpath iso_loop_path=$isofile initrd (loop)/boot/initramfs_x86_64.img }
Alpine Linux
menuentry '[loopback]alpine x86_64' { set isofile='/boot/iso/alpine-extended-3.6.0-x86_64.iso' loopback loop $isofile set root=loop linux /boot/vmlinuz-hardened modloop=/boot/modloop-grsec modules=loop,squashfs,sd-mod,usb-storage quiet initrd /boot/initramfs-hardened }
CentOS
標準インストールメディア
menuentry "[loopback]CentOS-7.0-1406-x86_64-DVD" { set isofile='/boot/iso/CentOS-7.0-1406-x86_64-DVD.iso' loopback loop $isofile linux (loop)/isolinux/vmlinuz noeject inst.stage2=hd:/dev/sdb2:/$isofile initrd (loop)/isolinux/initrd.img }
デスクトップライブメディア
menuentry '[loopback]CentOS-7.0-1406-x86_64-GnomeLive' { set isofile='/boot/iso/CentOS-7.0-1406-x86_64-GnomeLive.iso' loopback loop $isofile linux (loop)/isolinux/vmlinuz0 root=live:CDLABEL=CentOS-7-live-GNOME-x86_64 iso-scan/filename=$isofile rd.live.image initrd (loop)/isolinux/initrd0.img }
Clonezilla Live
menuentry "[loopback]clonezilla-live-20170220-yakkety-amd64" { set isofile="/boot/iso/clonezilla-live-20170220-yakkety-amd64.iso" loopback loop $isofile linux (loop)/live/vmlinuz boot=live union=overlay username=user config components quiet noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" keyboard-layouts= ocs_live_batch=\"no\" locales= vga=788 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile initrd (loop)/live/initrd.img }
Debian
menuentry '[loopback]debian-live-8.8.0-amd64-gnome-desktop' { set isofile='/boot/iso/debian-live-8.8.0-amd64-gnome-desktop.iso' loopback loop (hd1,2)$isofile linux (loop)/live/vmlinuz boot=live config fromiso=/dev/sdb2$isofile initrd (loop)/live/initrd.img }
Elementary OS
menuentry '[loopback]elementaryos-freya-amd64.20150411' { set isofile='/boot/iso/elementaryos-freya-amd64.20150411.iso' loopback loop $isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile locale=en_US.UTF-8 initrd (loop)/casper/initrd.lz }
Fedora
標準インストールメディア
menuentry '[loopback]Fedora-Workstation-netinst-x86_64-24-1.2' { set isofile='/boot/iso/Fedora-Workstation-netinst-x86_64-24-1.2.iso' loopback loop $isofile linux (loop)/isolinux/vmlinuz inst.stage2=hd:LABEL=Fedora-WS-dvd-x86_64-24 iso-scan/filename=$isofile quiet initrd (loop)/isolinux/initrd.img }
Workstation ライブメディア
menuentry '[loopback]Fedora-Workstation-Live-x86_64-24-1.2' { set isofile='/boot/iso/Fedora-Workstation-Live-x86_64-24-1.2.iso' loopback loop $isofile linux (loop)/isolinux/vmlinuz root=live:CDLABEL=Fedora-WS-Live-24-1-2 iso-scan/filename=$isofile rd.live.image quiet initrd (loop)/isolinux/initrd.img }
Gentoo
menuentry "[loopback]livedvd-amd64-multilib-20160514" { set isofile="/boot/iso/livedvd-amd64-multilib-20160514.iso" loopback loop $isofile linux (loop)/isolinux/gentoo root=/dev/ram0 init=/linuxrc aufs looptype=squashfs loop=/image.squashfs cdroot isoboot=$isofile vga=791 splash=silent,theme:default console=tty0 initrd (loop)/isolinux/gentoo.xz }
GParted Live
menuentry "[loopback]gparted-live-0.28.1-1-amd64" { set isofile="/boot/iso/gparted-live-0.28.1-1-amd64.iso" loopback loop $isofile linux (loop)/live/vmlinuz boot=live union=overlay username=user config components quiet noswap noeject toram=filesystem.squashfs ip= nosplash findiso=$isofile initrd (loop)/live/initrd.img }
Kali Linux
menuentry "[loopback]kali-linux-1.0.7-amd64" { set isofile='/boot/iso/kali-linux-1.0.7-amd64.iso' loopback loop $isofile linux (loop)/live/vmlinuz boot=live findiso=$isofile noconfig=sudo username=root hostname=kali initrd (loop)/live/initrd.img }
Knoppix
menuentry "[loopback]KNOPPIX_V7.4.2DVD-2014-09-28-EN" { set isofile="/boot/iso/KNOPPIX_V7.4.2DVD-2014-09-28-EN.iso" loopback loop $isofile linux (loop)/boot/isolinux/linux bootfrom=/dev/sda2$isofile acpi=off keyboard=us language-us lang=us initrd (loop)/boot/isolinux/minirt.gz }
Linux Mint
menuentry "Linux Mint 17.2 Cinnamon LTS RC (x64)" { set iso=/boot/iso/linuxmint-17.2-cinnamon-64bit.iso loopback loop $iso linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso noeject noprompt initrd (loop)/casper/initrd.lz }
openSUSE
標準インストールメディア
menuentry '[loopback]openSUSE-13.1-DVD-x86_64' { set isofile='/boot/iso/openSUSE-13.1-DVD-x86_64.iso' loopback loop $isofile linux (loop)/boot/x86_64/loader/linux install=hd:$isofile initrd (loop)/boot/x86_64/loader/initrd }
デスクトップライブメディア
menuentry '[loopback]openSUSE-13.1-KDE-Live-x86_64' { set isofile='/boot/iso/openSUSE-13.1-KDE-Live-x86_64.iso' loopback loop $isofile linux (loop)/boot/x86_64/loader/linux isofrom_device=$imgdevpath isofrom_system=$isofile LANG=en_US.UTF-8 initrd (loop)/boot/x86_64/loader/initrd }
Parabola GNU/Linux-libre
menuentry '[loopback]parabola-2015.07.01-dual.iso' { set isofile='/boot/iso/parabola-2015.07.01-dual.iso' loopback loop $isofile linux (loop)/parabola/boot/x86_64/vmlinuz parabolaisolabel=PARA_201507 img_dev=$imgdevpath img_loop=$isofile earlymodules=loop initrd (loop)/parabola/boot/x86_64/parabolaiso.img }
Sabayon
menuentry '[loopback]Sabayon_Linux_14.05_amd64_KDE' { set isofile='/boot/iso/Sabayon_Linux_14.05_amd64_KDE.iso' loopback loop $isofile linux (loop)/boot/sabayon root=/dev/ram0 aufs cdroot locale=en_US loop=/livecd.squashfs looptype=squashfs isoboot=$isofile initrd (loop)/boot/sabayon.igz }
Slackware Linux
menuentry '[loopback]slackware64-14.1-install-dvd' { set isofile='/boot/iso/slackware64-14.1-install-dvd.iso' loopback loop $isofile linux (loop)/kernels/huge.s/bzImage printk.time=0 initrd (loop)/isolinux/initrd.img }
SystemRescueCD
menuentry '[loopback]systemrescuecd-x86-4.5.2' { set isofile='/boot/iso/systemrescuecd-x86-4.5.2.iso' loopback loop $isofile linux (loop)/isolinux/rescue64 isoloop=$isofile initrd (loop)/isolinux/initram.igz }
Slitaz
まず、slitaz の iso をダウンロードしてから、どこかに展開してください (この例では /dev/sda3 の /live/slitaz-4.0)。
menuentry 'slitaz-4.0 core' { set dir='/live/slitaz-4.0' set root=(hd0,msdos3) set lang='pt_BR' set kmap='br-abnt2' linux ($root)/$dir/bzImage lang=$lang kmap=$kmap rw root=/dev/null vga=normal autologin initrd ($root)/$dir/rootfs4.gz ($root)/$dir/rootfs3.gz ($root)/$dir/rootfs2.gz ($root)/$dir/rootfs1.gz }
Slax
まず、Slax の zip (USB 用) をダウンロードして、どこかに展開してください (この例では /dev/sda3 の /live/slax)。
menuentry 'slax' { set dir=/live/slax set root=(hd0,msdos3) linux $dir/boot/vmlinuz from=$dir vga=normal load_ramdisk=1 prompt_ramdisk=0 printk.time=0 slax.flags=perch,xmode initrd $dir/boot/initrfs.img }
Spinrite
menuentry "Spinrite" { set gfxpayload=text set isofile="/boot/iso/spinrite.iso" set memdisk="/boot/iso/memdisk4.05" linux16 (hd1,gpt3)$memdisk iso initrd16 (hd1,gpt3)$isofile }
Tails
Tails の iso をダウンロードして整合性を確認してください。
menuentry "[loopback]tails-i386-1.5.iso" { set isofile='/boot/iso/tails-i386-1.5.iso' loopback loop $isofile linux (loop)/live/vmlinuz2 boot=live config findiso=${isofile} live-media=removable apparmor=1 security=apparmor nopersistent noprompt timezone=Etc/UTC block.events_dfl_poll_msecs=1000 noautologin module=Tails initrd (loop)/live/initrd2.img }
iso ファイルがリムーバルメディア上にない場合は live-media=removable
オプションを削除してください。
Ubuntu
menuentry '[loopback]ubuntu-14.04.1-desktop-amd64' { set isofile='/boot/iso/ubuntu-14.04.1-desktop-amd64.iso' loopback loop $isofile linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile locale=en_US.UTF-8 initrd (loop)/casper/initrd.lz }
Xubuntu (32ビット)
menuentry '[loopback]Xubuntu-16.04-desktop-i386' { set isofile='/boot/iso/xubuntu-16.04-desktop-i386.iso' loopback loop $isofile linux (loop)/casper/vmlinuz file=/cdrom/preseed/xubuntu.seed boot=casper iso-scan/filename=$isofile quiet splash --- initrd (loop)/casper/initrd.lz }
Windows のチェインロード
Windows のインストールディスクをループバックするのは難易度がとても高くなります。単一かつ統一されたパーティションが含まれた USB ドライブから様々なプラットフォームをインストールできるようにする解決方法は、ブータブルな Windows USB ドライブを使用して、Windows のブートローダーを GRUB で置き換えることです。
GRUB をインストールする前に、Windows のブートローダーの名前を変更するか移動してください。デフォルトの .efi 実行ファイルとして存在し、64ビット環境なら (USB)/efi/boot/bootx64.efi
にあります。そこに GRUB をインストールして、GRUB がデフォルトの実行ファイルとして使われるようにしてください。
名前を変えた Windows のブートローダーに GRUB からチェインロードして、上述の .iso ファイルをループバックするように GRUB を設定します。
menuentry '[chain]en_windows_8.1_professional_x64' { insmod chain chainloader /efi/boot/bootx64.efi.windows }
Syslinux と memdisk を使う
memdisk モジュールを使うことで、ISO イメージをメモリにロードして、ブートローダーをロードすることができます。イメージファイルをロードしてオペレーティングシステムを実行できるのに十分なメモリ容量が USB ドライブを起動するシステムに存在することを確認してください。
準備
USB ドライブを適切にパーティショニングして Syslinux によってサポートされている fat32 や ext4 などのファイルシステムでパーティションを作成してください。それから、Syslinux をパーティションにインストールします。Syslinux#インストール を参照。
memdisk モジュールのインストール
Syslinux のインストール時に memdisk モジュールはインストールされてないため、手動でインストールする必要があります。Syslinux をインストールしたパーティションを /mnt/
にマウントして memdisk モジュールを Syslinux がインストールされているディレクトリにコピーしてください:
# cp /usr/lib/syslinux/bios/memdisk /mnt/boot/syslinux/
設定
USB ドライブに ISO ファイルをコピーした後、Syslinux の設定ファイルを編集して ISO イメージのメニューエントリを作成してください。ベーシックなエントリは以下のようになります:
boot/syslinux/syslinux.cfg
LABEL some_label LINUX memdisk INITRD /path/to/image.iso APPEND iso
設定オプションについて詳しくは memdisk on Syslinux wiki を見て下さい。
32ビット環境の注意事項
128MiB 以上のイメージから32ビット環境を起動する場合、vmalloc の最大メモリ使用量を増やす必要があります。カーネルパラメータに vmalloc=valueM
を追加することで増やせます。value
は ISO イメージの容量も大きい値を MiB で指定してください [2]。
例えば Arch インストール ISO から32ビット環境を起動する場合、Boot Arch Linux (i686)
エントリの上で Tab
キーを押して末尾に vmalloc=768M
を追加してください。この設定をしないと起動時に以下のエラーが表示されます:
modprobe: ERROR: could not insert 'phram': Input/output error