grub2-install
update 2018-10-30
Fedora環境でgrub2をインストールする
- grub2をインストールする(UEFI/GPT環境)
- grub2をインストールする(Legacy BIOS/MBR環境)
- UEFI および Legacy BIOS でブート可能なUSBメモリを作成する(マルチブートUSB)
- Fedora Xfce-Live.isoをブートする
- Win10.isoをブートする
grub2をインストールする(UEFI/GPT環境)
1.
gdisk でusbメモリにGPTパーティション作成
ここでは usbメモリは /dev/sdb であるものとしている。
単一のパーティション 8GBを作成するものとする。
(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を作成するものとする。
(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を次のように作成する。
/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起動時に 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