我正在使用 debootstrap 创建一个基于 Xenial 的自定义发行版,然后可以从主机将其写入辅助可启动驱动器。(目标是英特尔 NUC。)当我将驱动器放入目标 PC 并打开电源时,EFI 识别可启动驱动器但无法启动它(它立即返回到 EFI 启动菜单。)
所以我不认为我实际上已经启动了 grub。我猜这是 grub 安装/配置问题。
我的脚本的相关部分:
local DISK=$1 # e.g. /dev/sdc
local EFI_PARTITION=${DISK}1
local ROOT_PARTITION=${DISK}2
local ROOT_MOUNT=$(mktemp -d)
# create partitions and format
parted -s --align=minimal $DISK \
mklabel gpt \
mkpart ESP fat32 0% 513MiB \
mkpart primary ext4 513MiB 100% \
set 1 boot on
partprobe $DISK
sleep 1
mkfs.fat -F32 $EFI_PARTITION
mkfs.ext4 $ROOT_PARTITION
# copy rootfs
mount $ROOT_PARTITION $ROOT_MOUNT
rsync -a $CHROOT_DIR/ $ROOT_MOUNT
# enter chroot and install grub
for dir in /dev /proc /sys /run; do
mount --bind $dir $ROOT_MOUNT/$dir
done
mkdir $ROOT_MOUNT/boot/efi
mount $EFI_PARTITION $ROOT_MOUNT/boot/efi
chroot $ROOT_MOUNT <<EOF
/usr/sbin/grub-install --bootloader-id=ubuntu ${DISK}
/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
EOF
# generate fstab and additional customizations
# sync, unmount eject
我做在生成的 grub.cfg 中查看正确的分区 UUID。
这是我的分区详细信息:
$ sudo parted /dev/sdb print
Model: ASMT 2115 (scsi)
Disk /dev/sdb: 64.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 538MB 538MB fat32 ESP boot, esp
2 538MB 64.0GB 63.5GB ext4 primary
在我将其添加shim-singed
到我的 debootsrap 包含之后,我看到的内容如下/boot/efi
:
$ sudo tree efi
efi
└── EFI
└── ubuntu
├── grub.cfg
├── grubx64.efi
├── MokManager.efi
└── shimx64.efi
重命名EFI/ubuntu
为EFI/BOOT
和shimx64.efi
后bootx64.efi
,我可以从驱动器启动!但是我得到了 grub 提示符... 猜想现在我得考虑 grub 配置问题了。
我一直使用这些文档作为我的主要来源:
要清楚的是,我正尝试将 Linux 内核/rootfs/bootloader 安装到连接到主持人机器。然后,该可启动驱动器被放入目标机器并启动。这不是双启动场景。
efibootmgr
我需要对目标做些什么吗?
答案1
我怀疑问题出在引导加载程序命名上。在 EFI 下,计算机可以通过多种方式启动:
- 从硬盘-- 在正常的操作系统安装中,引导加载程序驻留在硬盘的EFI 系统分区 (ESP),这是一个具有特定类型代码的 FAT32 分区(C12A7328-F81F-11D2-BA4B-00A0C93EC93B;中的 EF00
gdisk
;中的“启动标志”和“esp 标志”设置parted
、GParted 或相关工具)。引导加载程序可以命名为任何名称,但通常放置在EFI
以操作系统或引导加载程序命名的子目录中。对于 Ubuntu,它是EFI/ubuntu/shimx64.efi
,尽管这实际上是一个在 调用 GRUB 的填充程序EFI/ubuntu/grubx64.efi
,并且可以将 GRUB 设置为在禁用安全启动时直接启动。计算机知道要启动哪个程序,因为该信息存储在 NVRAM 中。 - 从可移动磁盘-- 在可移动磁盘上,包括操作系统安装程序或任何您想要从一台计算机移动到另一台计算机的东西(如您的情况),规则类似于硬盘安装;但是,由于不能依赖 NVRAM 来保存引导加载程序信息,因此引导加载程序使用标准化文件名存储,该文件名适用
EFI/BOOT/bootx64.efi
于 x86-64/AMD64/X64 计算机。这通常称为后备文件名。您可以把 Shim 放在这个文件名中,并保留 GRUB 的名称grubx64.efi
,但在EFI/BOOT
目录中。 - 其他方式-- 还有其他启动方法,例如从网络启动或以 BIOS/CSM/传统模式启动。这些与您的问题无关。
Ubuntu 安装程序旨在安装到硬盘上。如果要安装到可移动磁盘,则必须在安装后移动/重命名引导加载程序文件,或者手动安装 GRUB(或另一个引导加载程序)。您可以通过重命名为EFI/ubuntu
然后EFI/BOOT
在shimx64.efi
目录中重命名bootx64.efi
为 来执行此操作,或者通过复制文件来实现类似的效果。或者,您可以完全安装另一个引导加载程序,尽管这可能是一个更繁琐的提议,并且可能会造成复杂性,特别是如果您想在启用了安全启动的计算机上进行引导。