マルチブート USB ドライブ

提供: ArchWiki
2017年9月21日 (木) 09:14時点におけるKusakata.bot (トーク | 投稿記録)による版 (文字列「www.archlinuxjp.org」を「www.archlinux.jp」に置換)
ナビゲーションに移動 検索に移動

関連記事

マルチブート USB フラッシュドライブを使うことで単一のドライブから複数の ISO ファイルを起動することができます。ISO ファイルをデバイスにコピーすることで ISO を展開することなく直接起動することが可能です。複数の方法が存在しますが、全ての ISO イメージが使えるというわけではありません。

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つのパーティションが必要です:

  1. BIOS ブートパーティション (タイプ EF02)。
  2. EFI システムパーティション (タイプ EF00 で FAT32 ファイルシステム)。
  3. データパーティション (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 プロジェクトがいくつか存在します。

手動設定

マルチブート 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
ヒント: カーネルパラメータのリストは https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.rsthttps://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt を見て下さい (完全ではありません)。

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
}
ノート: archiso v23 (月次リリース 2015.10.01) 現在、GRUB とループバックデバイスを使う場合 archisodevice=/dev/loop0 パラメータは不要です。
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

ヒント: 32ビット環境を起動したい場合、x86_64x86 に置き換えてください。
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

ヒント: 2014.01.05 から [1], Arch Linux の月次リリースには clonezilla が含まれています。
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

ヒント: 32ビット環境を起動したい場合、x86_64i686 に置き換えて下さい。
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
}
ヒント: 新しいリリースを使う場合、parabolaisolabel= の後ろのラベル文字列は編集する必要があります。

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

参照