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上面的原始命令(它的别名)。
未注释的行/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)
| 归档时间: |
|
| 查看次数: |
5253 次 |
| 最近记录: |