Create Live Usb Disk for Uefi

主題

完整腳本範例

緣起

以前我會下面幾種方式來「Boot ISO」

  1. 透過「dd」
  2. 透過「Ventoy」
  3. 透過既有的系統,撰寫「GRUB Menu Entry」 來「Boot ISO」

一直以來想要去嘗試第四種方式,來「Boot ISO」

  1. 將「GRUB」單獨安裝在「USB DISK」,撰寫「GRUB Menu Entry」,來「Boot ISO」

不過以前只有概念,不知道如何下手。

這幾天剛好看到兩篇文章,「文章一」,「文章二」,

結合之前學會的概念,實際動手去實驗,

終於了解到如何製作,

以下就是紀錄相關的操作步驟。

有兩種版本,本篇是「UEFI版」,另一篇是「BIOS版」。

操作環境

我撰寫此篇的內容,是在「Debian 12 Bookworm」完成的。

GRUB 的版本是「2.06」

執行

sudo grub-install --version

顯示

grub-install (GRUB) 2.06-13+deb12u1

操作背景

我操作的機器是「筆電」,有在筆電內建的硬碟安裝「Linux」,

並且完全沒有「Windows」系統。

內建硬碟的「Device ID」是「/dev/sda」。

而我最近都是安裝不同的「Linux」系統,到外接的「USB Disk」。

然後使用外接的「USB Disk」來開機。

我是使用傳統的「BIOS模式」來開機,並不是使用「UEFI模式」來開機。

開機的「USB Disk」的「Device ID」是「/dev/sdb」。

而此篇所要產生的「live USB Disk」的「Device ID」則是「/dev/sdc」。

硬碟分割規格

Type Device ID File System Flags 用途
Disk /dev/sdc      
Part /dev/sdc1 fat32 esp 用來當作「EFI」開機的「分割區」, ISO檔案也會放在這個「分割區」

為了講解時的單純化,所以我們只有簡單地將整個「Disk」分割出「一個分割區」,用來當作「EFI」開機的「分割區」。

硬碟分割操作

執行下面指令,先將「/dev/sdc*」的一些「signature」清除。

sudo wipefs -a /dev/sdc*

執行下面指令,來「分割硬碟」。


sudo parted --script -- "/dev/sdc" \
	mktable gpt \
	mkpart primary '0%' '100%' \
	set 1 esp on \
	print

顯示

Model: Kingston DataTraveler 3.0 (scsi)
Disk /dev/sdc: 124GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name     Flags
 1      1049kB  124GB  124GB               primary  boot, esp

執行下面指令,來將「/dev/sdc1」格式化成「fat32」。

sudo mkfs.fat -F 32 -n LIVEUEFI "/dev/sdc1"

執行下面指令,觀看「/dev/sdc」的分割資訊。

sudo parted /dev/sdc print

顯示

Model: Kingston DataTraveler 3.0 (scsi)
Disk /dev/sdc: 124GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name     Flags
 1      1049kB  124GB  124GB  fat32        primary  boot, esp

或是執行下面指令,觀看「/dev/sdc」的分割資訊。包含「Free Space」也會顯示出來。

sudo parted /dev/sdc print free

顯示

Model: Kingston DataTraveler 3.0 (scsi)
Disk /dev/sdc: 124GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  124GB   124GB   fat32        primary  boot, esp
        124GB   124GB   1032kB  Free Space

若要「重新讀取裝置的 Partition Table」,可以執行下面指令

sudo partprobe /dev/sdc

若是要觀看「/dev/sdc1」的一些「Lable」或「UUID」,可以執行下面指令

sudo blkid /dev/sdc1

若是要觀看「/dev/sdc*」的一些「Lable」或「UUID」,可以執行下面指令

sudo blkid /dev/sdc*

掛載分割區

執行下面指令,產生「mnt」這個「資料夾」。

mkdir -p ./mnt

執行下面指令,將「/dev/sdc1」掛載到「mnt」。

sudo mount /dev/sdc1 ./mnt

卸載的參考指令

假設「mnt」這個資料夾有掛載分割區,執行下面指令,卸載「mnt」這個資料夾所掛載分割區。

sudo umount ./mnt

假設「/dev/sdc1」有被掛載,執行下面指令,卸載「/dev/sdc1」。

sudo umount /dev/sdc1

或是執行下面指令,確保「/dev/sdc*」都被卸載。

sudo umount /dev/sdc*

產生「/EFI/BOOT/bootx64.efi」

sudo mkdir -p mnt/EFI/BOOT mnt/EFI/grub

執行

tree mnt

顯示

mnt/
└── EFI
    ├── BOOT
    └── grub

4 directories, 0 files

執行下面指令,將「/usr/lib/grub/x86_64-efi」這個資料夾內的所有檔案,複製到「mnt/EFI/grub/x86_64-efi」這個資料夾。

sudo cp /usr/lib/grub/x86_64-efi/. mnt/EFI/grub/x86_64-efi -rf

若是沒有「/usr/lib/grub/x86_64-efi」這個資料夾,請先執行下面指令安裝「grub-efi-amd64-bin」。

sudo apt-get install grub-efi-amd64-bin
  • Debian Package / grub-efi-amd64-bin / File list

執行下面指令,產生「mnt/EFI/BOOT/bootx64.efi」這個檔案


sudo grub-mkimage \
	--format="x86_64-efi" \
	--output="mnt/EFI/BOOT/bootx64.efi" \
	--directory="mnt/EFI/grub/x86_64-efi" \
	--prefix="/EFI/grub" \
		fat \
		iso9660 \
		part_gpt \
		part_msdos \
		normal \
		boot \
		linux \
		linux16 \
		configfile \
		loopback \
		chain \
		efifwsetup \
		efi_gop \
		efi_uga \
		ls \
		search \
		search_label \
		search_fs_uuid \
		search_fs_file \
		gfxterm \
		gfxterm_background \
		gfxterm_menu \
		test \
		all_video \
		loadenv \
		exfat \
		ext2 \
		ntfs \
		btrfs \
		hfsplus \
		udf \
		cat

執行

file mnt/EFI/BOOT/bootx64.efi

顯示

mnt/EFI/BOOT/bootx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows, 4 sections

grub-install

接下來我們要手動補足「grub」開機時,我們有可能會用到的檔案。

sudo cp /boot/grub/fonts/. mnt/EFI/grub/fonts -rf

sudo cp /boot/grub/locale/. mnt/EFI/grub/locale -rf

產生「/EFI/grub/grub.cfg」

產生「/EFI/grub/grub.cfg」這個關鍵的設定檔,內容類似如下


set pager=1




##
## ## Load Module
##

insmod all_video
insmod video_bochs
insmod video_cirrus
insmod font
insmod gfxterm
insmod gfxmenu
insmod gettext
insmod jpeg
insmod png




##
## ## Locale
##

loadfont ($root)/EFI/grub/fonts/unicode.pf2
set locale_dir=($root)/EFI/grub/locale
set lang=zh_TW




##
## Resolution
##

set gfxmode=auto
terminal_output gfxterm




##
## ## Theme
##

background_image ($root)/EFI/grub/themes/grub-theme-obs-remix/background.jpg
set theme=($root)/EFI/grub/themes/grub-theme-obs-remix/theme.txt
export theme




##
## ## Countdown
##

set timeout=5




##
## ## Color
##

set color_normal=white/black
set color_highlight=white/cyan




##
## ## Grub Menu Entry
##

menuentry "Debian 12 ISO / Xfce" --class Debian {
	set iso_file="/iso/debian-live-12.5.0-amd64-xfce.iso"
	search --set=iso_partition --no-floppy --file $iso_file
	probe --set=iso_partition_uuid --fs-uuid $iso_partition
	set img_dev="/dev/disk/by-uuid/$iso_partition_uuid"
	loopback loop ($iso_partition)$iso_file
	set boot_option=""
	#set boot_option="components splash quiet"
	#set boot_option="components locales=zh_TW.UTF-8 quiet splash"
	linux (loop)/live/vmlinuz boot=live buuid=$iso_partition_uuid findiso=$iso_file $boot_option
	initrd (loop)/live/initrd.img
}


menuentry "Fedora 40 ISO / Kde Plasma" {
	set iso_file=/iso/Fedora-KDE-Live-x86_64-40_Beta-1.10.iso
	loopback loop $iso_file
	linux (loop)/images/pxeboot/vmlinuz iso-scan/filename=$iso_file root=live:CDLABEL=Fedora-KDE-Live-40-1-14 rd.live.image rhgb $boot_option
	initrd (loop)/images/pxeboot/initrd.img
}

grub-theme

set theme=($root)/EFI/grub/themes/grub-theme-obs-remix/theme.txt

上面的設定,我是採用「grub-theme-obs-remix」。

所以執行下面的指令,下載下來,並且解壓縮,放置到「mnt/EFI/grub/themes/grub-theme-obs-remix」這個路徑。


mkdir -p "./tmp"


wget -c "https://github.com/samwhelp/grub-theme-obs-remix/archive/refs/heads/main.tar.gz" -O "./tmp/grub-theme-obs-remix-main.tar.gz"

tar xf "./tmp/grub-theme-obs-remix-main.tar.gz" -C "./tmp"


sudo mkdir -p "mnt/EFI/grub/themes"

sudo cp -rf "tmp/grub-theme-obs-remix-main/." "mnt/EFI/grub/themes/grub-theme-obs-remix"

下載ISO檔

相關議題

參考文章