我有一台配备 AMD64 CPU 但 UEFI 引导加载程序仅支持 i386 的设备。
我已经使用以下方式制作了一个自定义的 Ubuntu 19.04 ISO 安装程序立方体并使用 usb-creator-gtk (启动盘创建器) 将其刷新到 USB。
这会在 USB 上创建两个分区:
第一个分区格式为 ISO9660 并保存 ISO 内容,第二个分区是 FAT32 分区,仅包含 .EFI 启动文件。
第二个分区是平板电脑的启动分区。其内容来自 ISO 上 /boot/grub 中存储的 efi.img 文件。该文件最初仅包含 AMD64 EFI 文件。:
我已经创建了自己的替换 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
我已成功将文件夹和EFI
ISO 中的文件夹放入 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 文件中应该包含什么,请告诉我。