使用自定义 ISO 创建 UEFI 可启动 live-USB

使用自定义 ISO 创建 UEFI 可启动 live-USB

我有一台配备 AMD64 CPU 但 UEFI 引导加载程序仅支持 i386 的设备。

我已经使用以下方式制作了一个自定义的 Ubuntu 19.04 ISO 安装程序立方体并使用 usb-creator-gtk (启动盘创建器) 将其刷新到 USB。

这会在 USB 上创建两个分区:

USB 分区

第一个分区格式为 ISO9660 并保存 ISO 内容,第二个分区是 FAT32 分区,仅包含 .EFI 启动文件。

第二个分区是平板电脑的启动分区。其内容来自 ISO 上 /boot/grub 中存储的 efi.img 文件。该文件最初仅包含 AMD64 EFI 文件。:

AMD64 启动文件

我已经创建了自己的替换 img.efi 文件,并使用以下命令输入了 bootia32.efi 文件:

dd if=/dev/zero of=efi.img bs=1M count=5
mkfs.fat efi.img
sudo mount -o loop,rw efi.img /media/efi
sudo cp -r <files> /media/efi

这成功制作了一个可启动的 USB,然而它不会加载安装程序 Grub,它只加载 Grub 命令行。

我之前曾使用此bootia32.efi文件成功加载 grub,如果我手动将 USB 格式化为 FAT32,复制 ISO 文件并将自定义 EFI 文件放入 /EFI/BOOT 中,那么设备就会像我预期的那样启动到 Grub。

但我想制作一个可以正常刷新并正常启动的 ISO。

我的问题是,像 usb-creator-gtk 那样创建一个单独的分区来保存启动 EFI 文件有什么意义?如何让该分区加载安装程序的 Grub 配置而不是仅加载 Grub 命令行?

谢谢

答案1

感谢@oldfred 解释说,分离分区是为了克服 FAT32 的 4GB 文件大小限制。

boot我已成功将文件夹和EFIISO 中的文件夹放入 FAT32(efi.img)分区来创建可启动 ISO 。

我已经修改了 grub.cfg,以便从与其所在分区不同的分区启动。

在我看来这似乎不对,因为原始 efi.img 文件只有三个文件:

BOOTx64.EFI
grubx64.efi
mmx64.efi

但它有效,所以我很高兴。

我的 efi.img 文件的具体结构如下:

.
├── boot
│   └── grub
│       ├── font.pf2
│       ├── grub.cfg
│       ├── loopback.cfg
│       └── x86_64-efi
│           ├── acpi.mod
│           ├── adler32.mod
│           ├── ahci.mod
│           ├── all_video.mod
│           ├── aout.mod
│           ├── appleldr.mod
│           ├── archelp.mod
│           ├── ata.mod
│           ├── at_keyboard.mod
│           ├── backtrace.mod
│           ├── bfs.mod
│           ├── bitmap.mod
│           ├── bitmap_scale.mod
│           ├── blocklist.mod
│           ├── boot.mod
│           ├── bsd.mod
│           ├── bswap_test.mod
│           ├── btrfs.mod
│           ├── bufio.mod
│           ├── cat.mod
│           ├── cbfs.mod
│           ├── cbls.mod
│           ├── cbmemc.mod
│           ├── cbtable.mod
│           ├── cbtime.mod
│           ├── chain.mod
│           ├── cmdline_cat_test.mod
│           ├── cmp.mod
│           ├── cmp_test.mod
│           ├── command.lst
│           ├── cpio_be.mod
│           ├── cpio.mod
│           ├── cpuid.mod
│           ├── crc64.mod
│           ├── cryptodisk.mod
│           ├── crypto.lst
│           ├── crypto.mod
│           ├── cs5536.mod
│           ├── ctz_test.mod
│           ├── datehook.mod
│           ├── date.mod
│           ├── datetime.mod
│           ├── diskfilter.mod
│           ├── disk.mod
│           ├── div.mod
│           ├── div_test.mod
│           ├── dm_nv.mod
│           ├── echo.mod
│           ├── efifwsetup.mod
│           ├── efi_gop.mod
│           ├── efinet.mod
│           ├── efi_uga.mod
│           ├── ehci.mod
│           ├── elf.mod
│           ├── eval.mod
│           ├── exfat.mod
│           ├── exfctest.mod
│           ├── ext2.mod
│           ├── fat.mod
│           ├── file.mod
│           ├── fixvideo.mod
│           ├── font.mod
│           ├── fs.lst
│           ├── gcry_arcfour.mod
│           ├── gcry_blowfish.mod
│           ├── gcry_camellia.mod
│           ├── gcry_cast5.mod
│           ├── gcry_crc.mod
│           ├── gcry_des.mod
│           ├── gcry_dsa.mod
│           ├── gcry_idea.mod
│           ├── gcry_md4.mod
│           ├── gcry_md5.mod
│           ├── gcry_rfc2268.mod
│           ├── gcry_rijndael.mod
│           ├── gcry_rmd160.mod
│           ├── gcry_rsa.mod
│           ├── gcry_seed.mod
│           ├── gcry_serpent.mod
│           ├── gcry_sha1.mod
│           ├── gcry_sha256.mod
│           ├── gcry_sha512.mod
│           ├── gcry_tiger.mod
│           ├── gcry_twofish.mod
│           ├── gcry_whirlpool.mod
│           ├── geli.mod
│           ├── gettext.mod
│           ├── gfxmenu.mod
│           ├── gfxterm_background.mod
│           ├── gfxterm_menu.mod
│           ├── gfxterm.mod
│           ├── gptsync.mod
│           ├── grub.cfg
│           ├── gzio.mod
│           ├── halt.mod
│           ├── hashsum.mod
│           ├── hdparm.mod
│           ├── help.mod
│           ├── hexdump.mod
│           ├── hfs.mod
│           ├── hfspluscomp.mod
│           ├── hfsplus.mod
│           ├── http.mod
│           ├── iorw.mod
│           ├── jfs.mod
│           ├── jpeg.mod
│           ├── keylayouts.mod
│           ├── keystatus.mod
│           ├── ldm.mod
│           ├── legacycfg.mod
│           ├── legacy_password_test.mod
│           ├── linux16.mod
│           ├── linuxefi.mod
│           ├── linux.mod
│           ├── loadbios.mod
│           ├── loadenv.mod
│           ├── loopback.mod
│           ├── lsacpi.mod
│           ├── lsefimmap.mod
│           ├── lsefi.mod
│           ├── lsefisystab.mod
│           ├── lsmmap.mod
│           ├── ls.mod
│           ├── lspci.mod
│           ├── lssal.mod
│           ├── luks.mod
│           ├── lvm.mod
│           ├── lzopio.mod
│           ├── macbless.mod
│           ├── macho.mod
│           ├── mdraid09_be.mod
│           ├── mdraid09.mod
│           ├── mdraid1x.mod
│           ├── memrw.mod
│           ├── minicmd.mod
│           ├── minix2_be.mod
│           ├── minix2.mod
│           ├── minix3_be.mod
│           ├── minix3.mod
│           ├── minix_be.mod
│           ├── mmap.mod
│           ├── moddep.lst
│           ├── morse.mod
│           ├── mpi.mod
│           ├── msdospart.mod
│           ├── mul_test.mod
│           ├── multiboot2.mod
│           ├── multiboot.mod
│           ├── nativedisk.mod
│           ├── net.mod
│           ├── newc.mod
│           ├── ntfscomp.mod
│           ├── ntfs.mod
│           ├── odc.mod
│           ├── offsetio.mod
│           ├── ohci.mod
│           ├── part_acorn.mod
│           ├── part_amiga.mod
│           ├── part_apple.mod
│           ├── part_bsd.mod
│           ├── part_dfly.mod
│           ├── part_dvh.mod
│           ├── part_gpt.mod
│           ├── partmap.lst
│           ├── part_msdos.mod
│           ├── part_plan.mod
│           ├── part_sun.mod
│           ├── part_sunpc.mod
│           ├── parttool.lst
│           ├── parttool.mod
│           ├── password.mod
│           ├── password_pbkdf2.mod
│           ├── pata.mod
│           ├── pbkdf2.mod
│           ├── pbkdf2_test.mod
│           ├── pcidump.mod
│           ├── play.mod
│           ├── png.mod
│           ├── priority_queue.mod
│           ├── probe.mod
│           ├── procfs.mod
│           ├── progress.mod
│           ├── raid5rec.mod
│           ├── raid6rec.mod
│           ├── random.mod
│           ├── read.mod
│           ├── reboot.mod
│           ├── regexp.mod
│           ├── reiserfs.mod
│           ├── relocator.mod
│           ├── romfs.mod
│           ├── scsi.mod
│           ├── serial.mod
│           ├── setjmp.mod
│           ├── setjmp_test.mod
│           ├── setpci.mod
│           ├── shift_test.mod
│           ├── signature_test.mod
│           ├── sleep.mod
│           ├── sleep_test.mod
│           ├── spkmodem.mod
│           ├── squash4.mod
│           ├── syslinuxcfg.mod
│           ├── terminal.lst
│           ├── terminal.mod
│           ├── terminfo.mod
│           ├── test_blockarg.mod
│           ├── testload.mod
│           ├── test.mod
│           ├── testspeed.mod
│           ├── tftp.mod
│           ├── tga.mod
│           ├── time.mod
│           ├── trig.mod
│           ├── tr.mod
│           ├── true.mod
│           ├── udf.mod
│           ├── ufs1_be.mod
│           ├── ufs1.mod
│           ├── ufs2.mod
│           ├── uhci.mod
│           ├── usb_keyboard.mod
│           ├── usb.mod
│           ├── usbms.mod
│           ├── usbserial_common.mod
│           ├── usbserial_ftdi.mod
│           ├── usbserial_pl2303.mod
│           ├── usbserial_usbdebug.mod
│           ├── usbtest.mod
│           ├── verify.mod
│           ├── video_bochs.mod
│           ├── video_cirrus.mod
│           ├── video_colors.mod
│           ├── video_fb.mod
│           ├── videoinfo.mod
│           ├── video.lst
│           ├── video.mod
│           ├── videotest_checksum.mod
│           ├── videotest.mod
│           ├── xfs.mod
│           ├── xnu.mod
│           ├── xnu_uuid.mod
│           ├── xnu_uuid_test.mod
│           ├── xzio.mod
│           └── zfscrypt.mod
└── efi
    └── boot
        ├── bootia32.efi
        ├── BOOTx64.EFI
        ├── grubx64.efi
        └── mmx64.efi

其中一些可能不是必需的,但我并不担心它占用的额外 10MB 空间。

这是我的 img.efi 文件中的 grub.cfg,请注意set root=(hd0)

if loadfont /boot/grub/font.pf2 ; then
    set gfxmode=auto
    insmod efi_gop
    insmod efi_uga
    insmod gfxterm
    terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

set timeout=5
menuentry "Install Ubuntu Server" {
    set root=(hd0)
    set gfxpayload=keep
    linux   /casper/vmlinuz  boot=casper only-ubiquity quiet splash ---
    initrd  /casper/initrd
}
menuentry "Run from internal disk" {
    linux    (hd1,gpt2)/boot/vmlinuz root=/dev/mmcblk1p2 intel_idle.max_cstate=0 quiet splash $vt_handoff
    initrd   (hd1,gpt2)/boot/initrd
}

如果有人可以进一步阐明 efi.img 文件中应该包含什么,请告诉我。

相关内容