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

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

我有两个硬盘,分别有两个相应的 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.

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

initrd /boot/intel-ucode.img

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

initrd /boot/intel-ucode.img /boot/initramfs-linux.img

现在我可以从 Ubuntu 的 grub 启动 Arch。看来 Ubuntu 默认没有附加此必需选项。我怎样才能让 Ubuntu 自动创建正确的条目?

编辑

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

编辑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=""

答案1

其实,解决这个问题需要修改两个文件。我已经在我的 Lubuntu 16.04.1 和 Manjaro Linux 上测试过了。

在 Ubuntu 中:

1)文件/usr/lib/linux-boot-probes/已安装/40grub2 有一个函数 parse_grub_menu 不处理所有 initrd 参数。您需要修改'案例“$1”在...initrd)':

a) 删除作业

initrd="$(echo "$2" ...)"

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

shift 1
initrd="$(echo "$@" | sed 's/(.*)//')"

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

for LINUX in ${LINUXPROBED}; do
...
    LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

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

答案2

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

后:

LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

添加:

if [ "${OS}" = "Arch Linux" ] ; then
  LINITRD="/boot/intel-ucode.img ${LINITRD}"
fi

答案3

编辑grub.cfg文件并运行后,它起作用了:

sudo update-grub
sudo grub.mkconfig

相关内容