2022.05.14 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UEFI と BIOS の両方から iso イメージファイルを起動できる、grub2 メニューの USB メモリーの作り方 参考:[ https://wiki.archlinux.jp/index.php/マルチブート_USB_ドライブ ] grub で iso フィルを起動する場合、iso ファイル内の .efi をチェーンロードすることはできない。 iso をパーティションに展開すればチェーンロードできる。 iso を展開したパーティションから起動しても、OS に施した変更内容は保存されない。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以下の説明では、USB ドライブは、/dev/sdX としている。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ================================ まず、UEFI 用の boot 環境を構築する。 ================================ --------------------------------------------------------------- GPT 形式でパーティションテーブルを作成する。 ( UEFI から起動させるには必須) --------------------------------------------------------------- -------------------------------------------------------- < Gparted > →「デバイス」→「パーティションテーブルの作成」→「gpt」 -------------------------------------------------------- ---------------------------------------------------------------- < Gparted > EFI パーティションを作成する。 ( UEFI から起動させるには必須) ---------------------------------------------------------------- UEFI から起動するには、第一パーティション(gpt1)に、EFI パーティションが必要。 EFI パーティションのフォーマットは FAT16 か FAT32 が必須、容量は 50MB 以上必要。 EFI パーティションには boot フラグを付ける。 ----------------------- フォーマット: FAT32 サイズ: 100MB ラベル: ESP フラグ: boot ----------------------- ------------------------------------------------------------------------ < Gparted > メインのパーティションを作る。(メインの grub や iso ファイルを格納する) ------------------------------------------------------------------------ フォーマット:NTFS は、grub が起動できないのでNG。 FAT32 は、1ファイルのサイズが 4GB までという制約がある。 ext4 は Windows から直接アクセスできない。 今回は ext4 で作成する。 ------------------------------- フォーマット: ext4 サイズ: 残りの最大サイズ ラベル: gpt2 フラグ: なし ------------------------------- ----------------- < Gparted > 終了。 ----------------- ------------------------------------- ESP へ UEFI 用の grub をインストールする。 ------------------------------------- ネットの情報(https://wiki.archlinux.jp/index.php/マルチブート_USB_ドライブ)では、 sudo grub-install --debug --target=x86_64-efi --efi-directory=/media/user/ESP --boot-directory=/media/user/gpt2/boot --recheck --removable の様に boot フォルダを gpt2 へインストールすればよいという情報があるが、それでは grub メニューが出なかった。 なので、grub は ESP へ入れて、gpt2 にもそれをコピーし、ESP → gpt2 へチェーンロードする様にした。 以下、色々設定する。 UEFI 用 grub のインストール --------------------------------------------------------------------------------------------------------------------------------------- sudo mount /dev/sdX1 /media/user/ESP sudo grub-install --debug --target=x86_64-efi --efi-directory=/media/user/ESP --boot-directory=/media/user/ESP/boot --recheck --removable --------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------- チェインロードする grub を gpt2 へコピーする。 --------------------------------------- ---------------------------------------------------- sudo mount /dev/sdX2 /media/user/gpt2 sudo chown user:user /media/user/gpt2 rsync -av /media/user/ESP/ /media/user/gpt2/ ---------------------------------------------------- ------------------------------- iso ファイル格納用フォルダを作成する。 ------------------------------- iso ファイルの格納場所は grub と同じパーティションの boot/iso/ フォルダとします。 そうすることで、loopback コマンドで、iso ファイルのパスの前にデバイスの識別子を付ける必要がなくなり、 UUID を使い、永続的なブロックデバイスの命名をすることができます。 iso ファイルの格納場所を、/boot/iso 以外にした場合、loopback コマンドで、永続的でないデバイスの識別子を使用しなければならなくなります。 例: loopback loop (hd1,2)${isofile} ----------------------- cd /media/user/gpt2/boot mkdir iso ----------------------- /boot/iso フォルダへのアクセスを向上させるには、リンクを活用できます。 --------------------------- ln -s iso ../iso-images --------------------------- ---------------------------------------------- 設定に必要な為、作成したパーティションの UUID を調べる。 ---------------------------------------------- ------------------------------------------------------------------------------- sudo blkid /dev/sdX1: LABEL="ESP" UUID="41D5-9CD8" TYPE="vfat" /dev/sdX2: LABEL="gpt2" UUID="53fae839-6b5e-4e79-8318-e4bc452d3220" TYPE="ext4" ------------------------------------------------------------------------------- ------------------------------- 4ヶ所の、grub.cfg を編集/設定する。 ------------------------------- 1. ESP/EFI/BOOT/grub.cfg 2. ESP/boot/grub/grub.cfg 3. gpt2/EFI/BOOT/grub.cfg 4. gpt2/boot/grub/grub.cfg 1.-------------------------------------- leafpad /media/user/ESP/EFI/BOOT/grub.cfg ---------------------------------------- search.fs_uuid 41D5-9CD8 root hd1,gpt1 # ESPのUUID < grub-installが設定してくれているはず set prefix=($root)'/boot/grub' configfile $prefix/grub.cfg 2.---------------------------------------- leafpad /media/user/ESP/boot/grub/grub.cfg ------------------------------------------ set timeout=1 menuentry "USB/gpt2: GRUB" { search --fs-uuid 53fae839-6b5e-4e79-8318-e4bc452d3220 --set=root # gpt2のUUID chainloader /EFI/BOOT/grubx64.efi boot } menuentry "" { echo } # 空行 menuentry "exit grub" { exit } menuentry "reboot" { reboot } menuentry "halt" { halt } 3.---------------------------------- rm /media/user/gpt2/EFI/BOOT/grub.cfg ------------------------------------ 4.---------------------------------------- leafpad /media/user/gpt2/boot/grub/grub.cfg ------------------------------------------ ※ iso ファイルの格納フォルダは、/boot/iso/ が前提での設定 -------------------------------------------------- # path to the partition holding ISO images (using UUID) probe -u ${root} --set=rootuuid set imgdevpath="/dev/disk/by-uuid/${rootuuid}" # define globally (i.e outside any menuentry) insmod search_fs_uuid search --no-floppy --set=isopart --fs-uuid 53fae839-6b5e-4e79-8318-e4bc452d3220 # your iso fs uuid here # later use inside each menuentry instead loopback loop (${isopart})${isofile} menuentry "USB /gpt2/boot/iso/ linuxmint-20.3-mate-64bit.iso" { set isofile=/boot/iso/linuxmint-20.3-mate-64bit.iso loopback loop ${isofile} linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=${isofile} noeject noprompt initrd (loop)/casper/initrd.lz } menuentry "" { echo } menuentry "USB /gpt2/boot/iso/ KNOPPIX_V9.1DVD-2021-01-25-EN.iso" { set isofile="/boot/iso/KNOPPIX_V9.1DVD-2021-01-25-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 } menuentry "" { echo } menuentry "exit grub" { exit } menuentry "reboot" { reboot } menuentry "halt" { halt } ============================================ UEFI 起動設定完了 → UEFI で boot できるか確認する。 ============================================ ================================ BIOS で boot する為の環境を追加する。 ================================ ---------------------------------------------------------------- < gdisk > BIOS boot partition を追加する。 (これが、MBRの代わりになる) ---------------------------------------------------------------- Partition number は、他のパーティションとバッティングしない値(例:99)を設定する。 ------------------- sudo gdisk /dev/sdX ------------------- Command (? for help): n Partition number (2-128, default 2): 99 First sector (34-31116254, default = 206848) or {+-}size{KMGTP}: 34 Last sector (34-2047, default = 2047) or {+-}size{KMGTP}: 2047 Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): ef02 Changed type of partition to 'BIOS boot partition' 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 OK; writing new GUID partition table (GPT) to /dev/sdX. The operation has completed successfully. 作成したパーティションを確認する。 ---------------------- sudo gdisk -l /dev/sdX ---------------------- Number Start (sector) End (sector) Size Code Name 1 2048 206847 100.0 MiB EF00 2 206848 31115263 14.7 GiB 8300 99 34 2047 1007.0 KiB EF02 BIOS boot partition ---------------------------------------------------------------------------- < gdisk > MBR に BIOS 用のパーティション情報を登録する。 (登録できるのは3パーティション) ---------------------------------------------------------------------------- 登録できるのは gpt パーティションから選んだ任意の3パーティションで、順序は自由。 BIOS が使用する予定のパーティションを登録する。 BIOS が起動するパーティションに boot フラグを付ける。これは、gpt パーティションに付けたフラグとは無関係。 gdisk では、BIOS 用に設定した MBR をハイブリッド MBR と呼んでいる。 grub-install した後にこの操作を行っても起動に影響はない。 ------------------- sudo gdisk /dev/sdX ------------------- Command (? for help): r Recovery/transformation command (? for help): h WARNING! Hybrid MBRs are flaky and dangerous! If you decide not to use one, just hit the Enter key at the below prompt and your MBR partition table will be untouched. Type from one to three GPT partition numbers, separated by spaces, to be added to the hybrid MBR, in sequence: 1 2 99 Place EFI GPT (0xEE) partition first in MBR (good for GRUB)? (Y/N): n Creating entry for GPT partition #1 (MBR partition #1) Enter an MBR hex code (default EF): Set the bootable flag? (Y/N): n Creating entry for GPT partition #2 (MBR partition #2) Enter an MBR hex code (default 83): Set the bootable flag? (Y/N): y Creating entry for GPT partition #99 (MBR partition #3) Enter an MBR hex code (default EF): Set the bootable flag? (Y/N): n 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 OK; writing new GUID partition table (GPT) to /dev/sdX. 作成した、ハイブリッド MBR の状態を確認する。 ------------------- sudo gdisk /dev/sdX ------------------- Command (? for help): r Recovery/transformation command (? for help): o Disk size is 31116288 sectors (14.8 GiB) MBR disk identifier: 0x00000000 MBR partitions: Number Boot Start Sector End Sector Status Code 1 2048 206847 primary 0xEF 2 * 206848 31115263 primary 0x83 3 34 2047 primary 0xEF 4 1 33 primary 0xEE Recovery/transformation command (? for help): q -------------------------------------------------------- BIOS 起動用パーティションに、BIOS 起動用 grub をインストールする。 -------------------------------------------------------- ※ BIOS で boot する grub-install を実行するためには /usr/lib/grub/i386-pc/ が必要。   ない場合は、他の PC からコピーしても使える。 ----------------------------------------------------------------------------------------- sudo grub-install --debug --target=i386-pc --boot-directory=/media/user/gpt2/boot /dev/sdX ----------------------------------------------------------------------------------------- ---------------------------------------------- インストールされた i386-pc のアクセス権を変更しておく。 ---------------------------------------------- --------------------------------------------------- sudo chown user:user /media/user/gpt2/boot/i386-pc sudo chown user:user /media/user/gpt2/boot/i386-pc/* --------------------------------------------------- ======================================= 以上で、BIOS/UEFI 起動 USB メモリー作成完了。 =======================================