如何在 Ubuntu 的 grub 中使用 initramfs 启动到 Arch Linux?

Spa*_*awk 5 boot grub2 dual-boot

我有两个硬盘,有两个对应的Grub。一个来自 Arch Linux,另一个来自 Ubuntu。使用 Arch 的 grub,我可以启动到任一发行版。但是,使用 Ubuntu 的 grub,我可以同时看到 Arch 和 Ubuntu,但无法启动到 Arch。我收到错误:

Kernel offset
End kernel panic. Not syncing: VFS.
Unable to mount root fs on unknown-block.
Run Code Online (Sandbox Code Playgroud)

我比较了grub.cfg两种发行版。在 Ubuntu 的 grub 中,我可以看到 Arch 的条目,其中包含以下行。

initrd /boot/intel-ucode.img
Run Code Online (Sandbox Code Playgroud)

我将其更改为遵循 Arch 的grub.cfg

initrd /boot/intel-ucode.img /boot/initramfs-linux.img
Run Code Online (Sandbox Code Playgroud)

现在我可以从 Ubuntu 的 grub 启动到 Arch。Ubuntu 似乎默认情况下没有附加此必需选项。如何让Ubuntu自动创建正确的条目?

编辑

我正在用 更新 Arch 的 grub grub-mkconfig -o /boot/grub/grub.cfg。在 Ubuntu 中,我尝试了update-grub上面的原始命令(它的别名)。

编辑2

未注释的行/etc/default/grub

GRUB_DEFAULT="saved"
GRUB_SAVEDEFAULT="true"
GRUB_HIDDEN_TIMEOUT_QUIET="true"
GRUB_TIMEOUT="3"
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""
Run Code Online (Sandbox Code Playgroud)

小智 2

实际上,需要修改两个文件来解决这个问题。我已经在 Lubuntu 16.04.1 和 Manjaro Linux 上对此进行了测试。

在Ubuntu中:

1)文件/usr/lib/linux-boot-probes/mounted/40grub2 有一个函数parse_grub_menu,它不处理所有initrd参数。您需要修改 ' case "$1" in ... initrd) ':

a) 删除分配

initrd="$(echo "$2" ...)"
Run Code Online (Sandbox Code Playgroud)

b) 添加两行代替删除的一行:

shift 1
initrd="$(echo "$@" | sed 's/(.*)//')"
Run Code Online (Sandbox Code Playgroud)

2) for 循环中的文件/etc/grub.d/30_os-prober 修复 LINITRD 的分配:

for LINUX in ${LINUXPROBED}; do
...
    LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"
Run Code Online (Sandbox Code Playgroud)

第一个修复考虑了 Manjaro 的所有可用 initrd 信息。第二个修复通过将一些“^”字符更改为空格来清理生成的 initrd 行。


小智 2

我正在运行 Manjaro 和 Arch,但讽刺的是,Manjaro 会犯与 Ubuntu 类似的错误。因此,也许 30_os_prober 中的以下补丁仍然可以帮助某人。

后:

LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"
Run Code Online (Sandbox Code Playgroud)

添加:

if [ "${OS}" = "Arch Linux" ] ; then
  LINITRD="/boot/intel-ucode.img ${LINITRD}"
fi
Run Code Online (Sandbox Code Playgroud)