grub2-install
update 2018-10-30


Fedora環境でgrub2をインストールする


grub2をインストールする(UEFI/GPT環境)

1.
gdisk でusbメモリにGPTパーティション作成
ここでは usbメモリは /dev/sdb であるものとしている。
単一のパーティション 8GBを作成するものとする。
usb-1.jpg
(1) lsblk -f  (デバイス確認)
※ディスクの先頭と、末尾に記録された2つのpartition tableを消去するには
sgdisk -Z /dev/sdX を行なう。( Zはzap(destroy) , sdX は sda ,  sdb のようなデバイス名)
(2) gdisk /dev/sdb (gdisk を実行)
(3) o コマンドを入力(新しくGUID partition table(GPT)を作成する。存在していたpartirionは全て削除される)
(4) p (
partition table を確認)
(5) n (新規にパーティション作成)
First sector は Enter(defaultを採用)
Last sector は Enterを押せば残り全領域指定となる。(領域を指定する場合は +8G のように入力する)
Hex code は 0700(Microsoft basic data)  LコマンドでHex code一覧を照会できる
(6) p (内容を確認する)
(7) w (設定を保存して終了する)

2.
mkfs でusbメモリをfat32でフォーマット
umount /dev/sdb1 (/dev/sdb1 をmountしている場合は umountしておく)
mkfs.vfat -F 32 -n MYUSB /dev/sdb1 (fat32でフォーマットする。-n はラベル名指定)
少々待てばフォーマットが終了する。

Gpartedでパーティションを確認できる。
windowsの「ディスクの管理」やエクスプローラでも開くことができる。

3.
usbメモリにgrub2(UEFI/GPT)をインストール
/mnt/usb フォルダを作成して パーティション/dev/sdx1を/mnt/usbにマウントする
mkdir /mnt/usb (フォルダを作成)
mount /dev/sdb1 /mnt/usb  (パーティションを マウント)

bootフォルダにgrub2をインストール
grub2-install --target=x86_64-efi --efi-directory /mnt/usb --boot-directory=/mnt/usb/boot --removable
下記のエラーが発生した場合は
grub2-install: エラー: /usr/lib/grub/x86_64-efi/modinfo.sh doesn't exist.
dnf install grub2-efi-x64-modules.noarch
を実行してgrub2-install を行なえばいい。
 
この段階で /boot/grub2フォルダが作成されている

4.
/boot/grub2フォルダ内に grub2設定ファイル grub.cfg を作成する

set timeout=none
set default=0

menuentry "System Halt" {
    halt
}

menuentry "System Reboot" {
    reboot
}

5.
作業用フォルダのアンマウント ,削除
umount /mnt/usb
rmdir /mnt/usb

6.
作成したusbメモリを起動してgrub2が動作することを確認。
確認にはVirtualboxでUSBブートを行なうと便利である。
QEMUでは起動出来なかった。(QEMUはデフォルトのままではUEFIに対応していない)

7.
grub.cfg に起動したいOSのmenuentryを追加すれば、grub2ブートローダで起動出来ることになる。


※GRUB2のloopbackコマンドは loopback loop (hd0,1)$isofile のように使用する。
loop という名前のデバイスを (hd0,1)$isofile ファイル内のファイルシステムイメージの内容に対応させる、という意味である。
(hd0,1)$isofile とは (hd0,1)にある $isofile という意味である。
(loop)/casper/vmlinuz とは loop という名前のデバイスにある /casper/vmlinuz フォルダという意味である。

例:ubuntu
/boot/iso/フォルダにisoファイルを置いている。
menuentry "Ubuntu-Live" {
        set isofile="/boot/iso/ubuntu-18.04-desktop-amd64.iso"
        loopback loop (hd0,1)$isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
        initrd (loop)/casper/initrd.lz
}

例:SystemRescueCD
/boot/iso/フォルダにisoファイルを置いている。
menuentry "SystemRescueCD" {
        set isofile="/boot/iso/systemrescuecd-x86-5.3.1.iso"
        loopback loop (hd0,1)$isofile
        linux (loop)/isolinux/rescue64 setkmap=jp isoloop=$isofile
        initrd (loop)/isolinux/initram.igz
}



grub2をインストールする(Legacy BIOS/MBR環境)

1.
fdisk でusbメモリにMBRパーティション作成
ここでは usbメモリは /dev/sdb であるものとしている。
単一のパーティション 8GBを作成するものとする。
usb-2.jpg
(1) lsblk -f (デバイス確認)
※MBRのpartition table を初期化(zero クリア)するには
dd if=/dev/zero  of=/dev/sdX  bs=512  count=1  (sdX は sda ,  sdb のようなデバイス名)
(2) fdisk /dev/sdb (fdisk を実行)
(3) o を入力 (新しいDOSパーティションテーブルを作成)
(4) d を入力(現在のパーティションを削除する。「パーティションは何も設定されていません」と表示されれば全て削除されている)
(5) n を入力(パーティションを新規作成)
パーティション番号は 1 を入力
最初のセクタ(First sector) は Enterを押す(defaultを採用)
最終セクタ(Last sector) は +8G と入力
「署名を削除しますか」 は y を入力
(6) p (内容を確認する)
(7) t (パーティションのタイプを変更する)
L でコード一覧表示
b と入力(W95 FAT32 を指定)
(8) a と入力(パーティションをactiveに設定)
(9) p (内容を確認する)
(10) w (設定を保存して終了する)

処理結果は、fdisk -l  でパーティション情報を確認できる。

2.
mkfs でusbメモリをfat32でフォーマット
umount /dev/sdb1 (/dev/sdb1 をmountしている場合は umountしておく)
mkfs.vfat -F 32 -n MYUSB /dev/sdb1 (fat32でフォーマットする。-n はラベル名指定)
少々待てばフォーマットが終了する。

Gpartedでパーティションを確認できる。
windowsの「ディスクの管理」やエクスプローラでも開くことができる。

3.
usbメモリにgrub2(BIOS/MBR)をインストール
/mnt/usb フォルダを作成して パーティション/dev/sdb1を/mnt/usbにマウントする
mkdir /mnt/usb (フォルダを作成)
mount /dev/sdb1 /mnt/usb  (パーティションを マウント)

bootフォルダにgrub2をインストール
grub2-install --target=i386-pc --boot-directory=/mnt/usb/boot /dev/sdb

この段階で /boot/grub2フォルダが作成されている

4.
grub2設定ファイル grub.cfg を作成

set timeout=none
set default=0

menuentry "System Halt" {
    halt
}

menuentry "System Reboot" {
    reboot
}

5.
作業用フォルダのアンマウント ,削除
umount /mnt/usb
rmdir /mnt/usb

6.
作成したusbメモリを起動してgrub2が動作することを確認
起動の確認はVirtualboxでUSBブートを行なうと便利である。
QEMUでも起動出来た。(ただし、ストレスを感じるほど処理速度が遅い)

7.
grub.cfg に起動したいOSのmenuentryを追加すれば、grub2ブートローダで起動出来ることになる。


※GRUB2のloopbackコマンドは loopback loop (hd0,1)$isofile のように使用する。
loop という名前のデバイスを (hd0,1)$isofile ファイル内のファイルシステムイメージの内容に対応させる、という意味である。
(hd0,1)$isofile とは (hd0,1)にある $isofile という意味である。
(loop)/casper/vmlinuz とは loop という名前のデバイスにある /casper/vmlinuz フォルダという意味である。

例:ubuntu
/boot/iso/フォルダにisoファイルを置いている。
menuentry "Ubuntu-Live" {
        set isofile="/boot/iso/ubuntu-18.04-desktop-amd64.iso"
        loopback loop (hd0,1)$isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
        initrd (loop)/casper/initrd.lz
}

例:SystemRescueCD
/boot/iso/フォルダにisoファイルを置いている。
menuentry "SystemRescueCD" {
        set isofile="/boot/iso/systemrescuecd-x86-5.3.1.iso"
        loopback loop (hd0,1)$isofile
        linux (loop)/isolinux/rescue64 setkmap=jp isoloop=$isofile
        initrd (loop)/isolinux/initram.igz
}

例:puppy
/boot/puppy/ フォルダを作成してフォルダ内にisoイメージを展開した内容を全てコピー。
さらに /boot/フォルダに puppy_precise_5.7.1JP.sfs を移動しておく。(/boot/puppy/ フォルダ内に置いたままでは正常に動作しない)
デバイスはラベル名を指定している例である。
#
menuentry "Puppy" {
linux /boot/puppy/vmlinuz
initrd /boot/puppy/initrd.gz
}



grub2で USBデバイスを指定する場合は UUID またはラベル(デバイス名)を使う必要が生じる。
set root=(hdX,gptY)のような指定ではUSBメモリを他のPCに接続すると正しいデバイスを指さないことになるからである。

UUID および ラベルの確認は
lsblk -f

UUID またはラベルは/boot/grub2/grub.cfg の先頭部分に記述する。
UUID またはラベルを指定した場合は set root=(hdX,gptY)の指定は不要である。
grub.cfgは以下のようになる。

UUIDを指定する場合は次のように /dev/disk/by-uuid で指定する
set imgdevpath="/dev/disk/by-uuid/8FDE-F945"

ラベルを指定する場合は次のように /dev/disk/by-label で指定する
set imgdevpath="/dev/disk/by-label/MYUSB"



UEFI および Legacy BIOS でブート可能なUSBメモリを作成する(マルチブートUSB)

※この作業はLinuxで行なう。(windowsではファイルシステムが異なるので扱えない)

1 USBデバイスを挿入して内容を確認する
lsblk -f (NAME , FSTYPE , LABEL , UUID , MOUNTPOINT を確認できる)

2
gdiskを使用してUSBにGPTテーブルを作成する。(MBR labelがあれば削除する)
※Gpartedでも作成できるがgdiskのほうが速い。

partitionを次のように作成する。
usb-3.jpg
/dev/sdb1 にはtype EF02(bios boot partition) 100MiBを作成
※GPTディスクでBIOSベースのシステムを使うにはBIOS boot partitionが必要である。
/dev/sdb2 にはtype EF00 200MiBを作成
/dev/sdb3 にはtype 8300 残り全領域

gdisk /dev/sdb (gdisk を起動)

o コマンドを入力(
新しくGUID partition table(GPT)を作成する。存在していたpartirionは全て削除される)
p (
partition table を確認)
n (partition を新規作成)
    partition number は 1 を入力
    First sector は Enter を入力(default)
    Last sector は +100M と入力
    Hex code は L コマンドで照会して ef02 を入力(BIOS boot partition)
n (partition 追加)
    partition number は 2 を入力
    First sector は Enter を入力(default)
    Last sector は +200M と入力        
    Hex code は L コマンドで照会して ef00 を入力(EFI System)
n (partition 追加)
    partition number は 3 を入力
    First sector は Enter を入力(default)
    Last sector は Enter と入力すれば残り全領域となる        
    Hex code は は Enter と入力すれば 8300 が採用される(Linux filesystem)
p (partition table を確認)
w (処理結果を保存して終了)
Do you want to proceed? には Y を入力

lsblk -f でpartitionが作成されていることを確認。
MOUNTPOINTを見て /dev/sdb1,/dev/sdb2,/dev/sdb3はマウントされていないことを確認

3 ESP(EFI Syatem Partition)を fat32 でフォーマットする
※ /dev/sdb1はフォーマットしない。
mkfs.vfat -F 32 /dev/sdb2

4 Linuxパーティションをラベル「USB01」を付けてext4 でフォーマットする(ラベル名は任意)
mkfs.ext4 -L "USB01" /dev/sdb3

lsblk -f でpartitionが作成されていることを確認。

5 ESPにbootフォルダを作成する
mount /dev/sdb2 /mnt
mkdir -p /mnt/boot

6 USBメモリに grub-efi をインストールする
grub2-install --target=x86_64-efi  --efi-directory /mnt --boot-directory /mnt/boot --removable
※この時点で /dev/sdb2に /boot/grub2 フォルダが作成されている。

7 /dev/sdb3のUUIDを確認する。(/mnt/EFI/BOOTにgrub.cfgを作成する際に使用するためである)
blkid /dev/sdb3 (lsblk -f でも確認できる)

8 ESPをアンマウントして/dev/sdb3パーティションをマウントしてbootフォルダを作成する
umount /mnt
mount /dev/sdb3 /mnt
mkdir -p /mnt/boot

9 grub legacy をインストールする(--target=i386-pc)
grub2-install --no-floppy --target=i386-pc  --boot-directory /mnt/boot /dev/sdb
※この時点で /dev/sdb3 に /boot/grub2 フォルダが作成されている。

10 grub.cfgファイルは EFI用とLegacy BIOS用を別々に作成する必要がある。
/mnt/boot/grub2 フォルダにgrub.cfgを作成する
leafpad でgrub.cfg作成して/mnt/boot/grub2フォルダに保存。
いったん/dev/sdb3をアンマウント
umount /mnt

/dev/sdb2 の/boot/grub2フォルダにもgrub.cfgを作成しておく必要がある
mount /dev/sdb2 /mnt
grub.cfgを作成して/boot/grub2フォルダに保存
umount /mnt

※この時点でUEFI および Legacy BIOS とも grub2がbootできた。

11 パーティション(/dev/sdb3)のtopレベルにisoファイルをコピーする。
コピー後にはパーティション(/dev/sdb3)をアンマウントする。

12 grub.cfg作成については下記サイト参照(英語版と日本語版の内容は同じである)
Multiboot USB drive」
https://wiki.archlinux.org/index.php?title=Multiboot_USB_drive&oldid=479923
「マルチブート USB ドライブ」
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



Fedora-Xfce-Live.isoをブートする
2022-12-30 update

BIOS/MBR環境の例。
※「標準パーティション」構成のBIOS/MBR環境ではブート出来た。(デフォルトの「BTRFS」構成ではGrubが対応しないようだ)

/dev/sda2 の /opt/ ディレクトリに置いた
fedora Xfce-Live.isoファイル をGrub2でブートした例である。

menuentry "loopback Fedora-Xfce-Live-x86_64-35-1.2.iso" {
  set isofile="/opt/Fedora-Xfce-Live-x86_64-35-1.2.iso"
  loopback loop (hd0,2)$isofile
  linux (loop)/isolinux/vmlinuz root=live:CDLABEL=Fedora-Xfce-Live-35-1-2 rd.live.image verbose iso-scan/filename=$isofile
  initrd (loop)/isolinux/initrd.img
}

menuentry はGRUB2メニューに表示する任意の名前。
set isofile は ISOファイルのPATHを指定する。
loopback は ISOファイルをマウントする指定である。(hd0,2)のisofileを loop という名前でマウントしている。
linux は kernel の指定である。
initrd は initial ramdisk の場所を指定する。

isoのパーティションの確認
df --output=source /opt/Fedora-Xfce-Live-x86_64-35-1.2.iso

CDLABELの確認
blkid /opt/Fedora-Xfce-Live-x86_64-35-1.2.iso

grub2-mkconfig -o /boot/grub2/grub.cfgを行なうとerror! Check your device.map. が発生するが、
このエラーは無視してもかまわない。
grub.cfgは作成されている。

/boot/grub2/device.map を見ると
(hd0)      /dev/sda となっている。

UEFI/GPT環境ではブート失敗
※「標準パーティション」構成のBIOS/MBR環境でもブート失敗。(デフォルトでの「BTRFS」構成でも失敗)
UEFI/GPT環境では下記を試したが、erro out of memory となって起動できない。(原因は解明していない)
menuentry "loopback Fedora-Xfce-Live-x86_64-35-1.2.iso" {
  set isofile="/opt/Fedora-Xfce-Live-x86_64-35-1.2.iso"
  loopback loop (hd0,gpt3)$isofile   ※UEFI/GPTではESPパーティション(hd0,gpt1)があるので、/opt ディレクトリは(hd0,gpt3) になる。
  linuxefi (loop)/isolinux/vmlinuz root=live:CDLABEL=Fedora-Xfce-Live-35-1-2 rd.live.image verbose iso-scan/filename=$isofile
  initrdefi (loop)/isolinux/initrd.img
}


Gpartedはブート出来た。(
「標準パーティション」構成のUEFI/GPT環境でブート出来た)
menuentry "GParted Live ISO" {
  set GPartedISOFile="/opt/gparted-live-1.3.1-1-amd64.iso"
  loopback loop (hd0,gpt3)$GPartedISOFile
   ※UEFI/GPTではESPパーティション(hd0,gpt1)があるので、/opt ディレクトリは(hd0,gpt3) になる。
  linuxefi (loop)/live/vmlinuz boot=live components config findiso=$GPartedISOFile ip=frommedia toram=filesystem.squashfs union=overlay username=user
  initrdefi (loop)/live/initrd.img
}



Win10.isoをブートする
「標準パーティション」構成のUEFI/GPT環境でブート出来た。
Win10.isoを下図のように別ドライブのvfatパーティションに展開した環境でWin10インストーラを起動できた。
※Win10.isoを展開するパーティションは vfat なので ファイル(install.wim)が4GBを超える場合は、install.esd に圧縮しておく。
grub-win10.jpg
ただし、grub起動時に bootx64.efi が見つからないとのアラームが表示されるが、無視していると起動が始まった。
処理速度が遅く、実用にならない、という印象である。

menuentry "Windows-10-Installer.iso" {
  insmod part_gpt
  insmod vfat
  insmod chain
  set root=(hd1,gpt2)
  chainloader /efi/boot/bootx64.efi
}


end of list