我们正在构建一个基于 Debian 的产品。为了简化在工厂中构建这些的过程,我正在尝试构建一个用于安装主操作系统的实时磁盘。我们有一款旧产品使用此过程,但基于 Debian 7。我使用的是 Debian 11。我的 Debian 11 恢复过程和映像基于 Debian 7。两者都使用live-build
. Debian 11 系统从主线存储库以及我的存储库中提取操作系统,bullseye
以获取承载我们位的一个软件包。这是一个多步骤的过程,我们运行live-build
构建操作系统的操作系统,将其压缩到一个squashfs中,然后使用一个脚本围绕它构建一个实时操作系统,该脚本执行诸如对驱动进行分区、将squashfs文件解压到适当的分区等操作。严重不起作用,请应用 GRUB。
构建的一部分执行以下操作:
install -d /boot/seed
grub-mkimage -Ox86_64-efi -o /boot/seed/BOOTX64.EFI -p '(hd0,1)/EFI/BOOT/grub' \
part_gpt part_msdos fat
grub-mkimage -Oi386-pc -o /boot/seed/mbr-core.img -p '(hd0,msdos1)/biosgrub' \
part_msdos fat biosdisk
grub-mkimage -Oi386-pc -o /boot/seed/gpt-core.img -p '(hd0,gpt1)/biosgrub' \
part_gpt fat biosdisk
cp -a /usr/lib/grub/i386-pc/boot.img /boot/seed/boot.img
cp -a /usr/lib/grub/i386-pc/modinfo.sh /boot/seed/modinfo.sh
grub-editenv /boot/seed/grubenv create
这些文件最终会出现在实时操作系统中,并在尝试安装 GRUB 之前被复制到 ESP 分区。这些文件和所有各种 GRUB 模块都会在安装脚本的中途复制。
稍后在脚本中,我们调用grub-install
.
grub-install \
--directory /mnt/biosgrub \
--boot-image boot.img \
--core-image core_img \
/dev/sda
这里的问题是,较新的版本grub-install
不再支持core-image
,并且boot-image
像 Debian 7 的版本一样进行切换,因此会立即失败。我取出了boot-image
和core-image
开关,现在失败了:
grub-install: error: failed to get canonical path of `overlay'.
是的,确实有一个左反引号和一个右单引号overlay
。
我尝试删除 GRUB 步骤,让它解开所有内容,然后启动到运行 Manjaro 的图形实时磁盘(已经放置)以尝试获取有关 GRUB 情况的更多信息。在那里运行grub-install
也会以同样的方式失败。
从谷歌搜索中,我了解到这是因为grub-install
认为目标设备正在使用overlayfs并且无法弄清楚要使用哪个实际设备,但我不太确定从这里去哪里,也不确定要问什么问题。我很乐意提供更多详细信息,尽管由于专有软件原因必须对某些内容进行编辑。
如果重要的话,在系统外手动安装创建的操作系统分区表明一切都在正确的位置,我们的代码就位,并且如果有引导加载程序,可能会运行良好。
ETA:我在这里取得了一些进展,将未压缩的操作系统安装到实时磁盘中的一个目录中,安装/proc
, /sys
, 和/dev
到该目录中,将我的 EFI 分区安装到其中,然后chroot
ing 到其中。然后运行grub-install /dev/sda
但是启动时grub仍然丢失。
答案1
收到关于这个问题的大量流量的通知后,我想我应该发布我们最终通过使用debos
构建的图像和闪光器图像解决了这个问题,而不是尝试使用我在问题中描述的过程。