GRUB 混淆了 Ubuntu 和 Arch Linux 安装的内核/initramfs

GRUB 混淆了 Ubuntu 和 Arch Linux 安装的内核/initramfs

我有一台机器,用于双引导 Ubuntu(当前为 16.04)和 Windows 7,并使用 Ubuntu 的 GRUB 作为引导加载程序。

现在我只是按照官方安装说明添加了 Arch Linux 作为第三个操作系统。我没有从 Arch 安装 GRUB,因为我想使用 Ubuntu 控制的 GRUB。这些说明包含一个命令mkinitcpio -p linux,该命令可能生成一些我按照描述运行的引导文件。

现在,当我尝试通过默认条目从 GRUB 启动 Ubuntu 时,我收到了这个令人不快的错误(抱歉屏幕照片):

错误信息

正如输出所示uname -a,它正在尝试启动 Arch 内核,但/dev/sda6它是 Ubuntu 根分区。

我必须导航到Advanced options for Ubuntu并选择其中一个Ubuntu, with Linux 4.4.0-*条目才能加载 Ubuntu,但我找不到可以正确加载 Arch 的条目。

sudo update-grub从 Ubuntu运行(update-grub是一个用于运行grub-mkconfig -o /boot/grub/grub.cfg生成 grub2 配置文件的存根。”)不会改变任何东西。到目前为止,该grub-customizer工具在解决此问题方面也毫无用处。

是什么导致 GRUB 出现这种混乱?如何修复它,以便每个 Linux 版本都能使用正确的内核并从正确的分区启动?

看起来我愚蠢地安装了 Arch,并安装了 Ubuntu 的 /boot,所以它可能将其启动文件放在那里。

我可以删除所有与 Arch 相关的内容,以便再次恢复 Ubuntu 的引导加载程序,并稍后重新安装 Arch。


更新(感谢 @terdon 在 Ask Ubuntu 聊天中的支持):

这是我的/boot/grub/grub.cfg

所有 Linux 条目似乎都指向我的 /dev/sda6 分区,这是 Ubuntu 的根目录:

$ grep ' linux /' /boot/grub/grub.cfg
    linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.4.0-21-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro init=/sbin/upstart
        linux /vmlinuz-4.2.0-35-generic root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro recovery nomodeset

我尝试从 Ubuntu 更新 GRUB 配置:

$ sudo grub-mkconfig -o /boot/grub/grub.cfg 
Generating grub configuration file ...
dpkg: warning: version 'linux' has bad syntax: version number does not start with a digit
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found linux image: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
Found linux image: /boot/vmlinuz-4.2.0-35-generic
Found initrd image: /boot/initrd.img-4.2.0-35-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
Found Arch on /dev/sda8
done

我尝试将 GRUB 从 Ubuntu 重新安装到 MBR:

$ sudo grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

$ sudo grub-install --recheck /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

顺便说一句,这些是已安装的 Ubuntu 内核软件包,我确实尝试了dpkg-reconfigure所有这些软件包,但对问题没有任何影响:

$ dpkg -l linux-image* | grep ^ii
ii  linux-image-4.2.0-35-generic       4.2.0-35.40  amd64        Linux kernel image for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-4.4.0-21-generic       4.4.0-21.37  amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-4.2.0-35-generic 4.2.0-35.40  amd64        Linux kernel extra modules for version 4.2.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-21-generic 4.4.0-21.37  amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP

我还尝试重新生成 Ubuntu initramfs:

$ sudo update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-4.4.0-21-generic
update-initramfs: Generating /boot/initrd.img-4.2.0-35-generic

我的分区布局:

从Ubuntu系统检查。标签应该自我解释。

$ lsblk -f /dev/sda
NAME    FSTYPE LABEL       UUID                                 MOUNTPOINT
sda                                                             
├─sda1  ntfs   win7-boot   90DCF3A5DCF3842E                     /win/boot
├─sda2  ntfs   windows7    482C7A572C7A3FCC                     /win/c
├─sda3  ext4   grub-boot   6dbb8633-dadd-4b5e-8d85-b0895fde9dfb /boot
├─sda5  ext4   images      81dc42c4-a161-4ccd-b704-6e5c09298943 /images
├─sda6  ext4   ubuntu-1604 eee18451-b607-4875-8a88-c9cb6c6544c8 /
├─sda7  ext4   ubuntu-home 485b3ef1-7216-4053-b25c-f656d529e8e6 /home
├─sda8  ext4   arch-root   8d281a0c-969c-44cf-ba6a-1d3c7b4be7ec 
├─sda9  ext4   arch-home   32522902-a53d-44c8-90f2-6bbf14c40f1f 
└─sda10 swap   linux-swap  8b05bd9b-bc42-46f6-8c18-50711a3c48b9 [SWAP]

我的 GRUB 菜单结构:

GRUB 主页

Ubuntu 的高级选项:
Ubuntu 的 GRUB 高级选项

Arch 的高级选项:
Arch 的 GRUB 高级选项


我的/boot目录:

$ ls -la /boot
total 118480
drwxr-xr-x  4 root root     4096 Apr 24 20:50 .
drwxr-xr-x 28 root root     4096 Apr 24 19:44 ..
-rw-r--r--  1 root root  1313029 Mär 16 01:45 abi-4.2.0-35-generic
-rw-r--r--  1 root root  1239577 Apr 19 00:21 abi-4.4.0-21-generic
-rw-r--r--  1 root root   184888 Mär 16 01:45 config-4.2.0-35-generic
-rw-r--r--  1 root root   189412 Apr 19 00:21 config-4.4.0-21-generic
drwxr-xr-x  6 root root     4096 Apr 26 19:58 grub
-rw-r--r--  1 root root 18598360 Apr 24 20:59 initramfs-linux-fallback.img
-rw-r--r--  1 root root  3516429 Apr 24 20:59 initramfs-linux.img
-rw-r--r--  1 root root 33642388 Apr 24 18:31 initrd.img-4.2.0-35-generic
-rw-r--r--  1 root root 36143341 Apr 24 19:51 initrd.img-4.4.0-21-generic
drwx------  2 root root    16384 Okt 28 17:43 lost+found
-rw-r--r--  1 root root   182704 Jan 28 13:44 memtest86+.bin
-rw-r--r--  1 root root   184380 Jan 28 13:44 memtest86+.elf
-rw-r--r--  1 root root   184840 Jan 28 13:44 memtest86+_multiboot.bin
-rw-------  1 root root  3745312 Mär 16 01:45 System.map-4.2.0-35-generic
-rw-------  1 root root  3853719 Apr 19 00:21 System.map-4.4.0-21-generic
-rw-------  1 root root  6829104 Mär 16 01:45 vmlinuz-4.2.0-35-generic
-rw-------  1 root root  7013968 Apr 19 00:21 vmlinuz-4.4.0-21-generic
-rw-r--r--  1 root root  4435552 Apr 14 19:20 vmlinuz-linux

4.4.0 和 4.2.0 内核应该是 Ubuntu,Arch 应该有 4.5.0 内核。但是我如何找出哪个文件的名称中没有内核版本属于哪个?


我的Ubuntu根目录(不包括目录):

$ ls -la / | grep ^[^d]
total 124
lrwxrwxrwx   1 root      root         32 Apr 24 19:44 initrd.img -> boot/initrd.img-4.4.0-21-generic
lrwxrwxrwx   1 root      root         32 Apr  5 17:45 initrd.img.old -> boot/initrd.img-4.2.0-35-generic
lrwxrwxrwx   1 root      root         29 Apr 24 19:44 vmlinuz -> boot/vmlinuz-4.4.0-21-generic
lrwxrwxrwx   1 root      root         29 Apr  5 17:45 vmlinuz.old -> boot/vmlinuz-4.2.0-35-generic

我的拱形根目录不包含任何文件或链接。

答案1

我最终通过从轨道上删除 Ubuntu/boot目录中的 Arch 分区及其启动文件来解决这个问题。 Ubuntu 现在又恢复正常了,所有剩余的 GRUB 条目都恢复正常了。

这是我所做的事情的列表:

  • 删除 Arch 的initramfs文件:

    sudo rm /boot/initramfs-linux*
    
  • 删除 Arch 的vmlinuz文件:

    sudo rm vmlinuz-linux
    
  • /dev/sda8使用 GParted格式化 Arch 分区 ( )

  • 更新 GRUB 的配置:

    sudo update-grub
    
  • 重新启动并享受!

答案2

手动修复 grub.cfg(不推荐)

看着你的grub.cfg

Ubuntu 条目已损坏(以及以下一些条目)

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-eee18451-b607-4875-8a88-c9cb6c6544c8' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos3'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos3 --hint-efi=hd0,msdos3 --hint-baremetal=ahci0,msdos3  6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    else
      search --no-floppy --fs-uuid --set=root 6dbb8633-dadd-4b5e-8d85-b0895fde9dfb
    fi
    linux   /vmlinuz-linux root=UUID=eee18451-b607-4875-8a88-c9cb6c6544c8 ro  
    initrd  /initramfs-linux.img
}

最后两行是 grub 发出的用于加载内核和 initrd 的命令,并且当前正在寻找 ARCH 内核和 initiramfs。此外,它/还会在分区中查找它们,uuid=eee18451-b607-4875-8a88-c9cb6c6544c8该分区可能会也可能不会托管预期的 Ubuntu 文件。

您可以通过以下方式解决此问题:

sudo blkid

获取 ubuntu 根分区的 uuid。

然后将最后两行替换为最新内核和 initrd 映像的 simlink(因为这是 ubuntu 期望的方式)

linux   /vmlinuz root=UUID=<correct-uuid-ubuntu-partition> ro  
initrd  /initrd.img

如果这不能立即解决问题,则可能需要进行其他一些更正。您可以通过“复制”经过测试和工作的条目之一来找到它们,我建议您使用最普通的条目(例如,没有upstart或其他内核参数,例如传递的nomodeset)。

这应该是一个很好的候选者:

menuentry 'Ubuntu, with Linux 4.4.0-21-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-21-generic-advanced-eee18451-b607-4875-8a88-c9cb6c6544c8'

Arch 条目也同样被破坏,因为它可能会在 Ubuntu 根分区下查找 Arch initramfs 和内核。它们的默认位置位于 /boot 下。通过更正位置并检查根分区 uuid 是否包含 Arch 根来调整 Arch 条目的最后两行。

一(几个)警告词:

一般来说,不建议 Ubuntu 用户手动操作grub.cfg。一定要复制一份并小心编辑。做好准备,以防您的系统无法启动(但您可以使用我旧答案中概述的启动过程来恢复它)。

另外,虽然这一次可能会解决您的问题,但下次您必须重新填充 grub 菜单时,它可能会再次困扰您。由于某种原因,ubuntu 下 grub 的操作系统探测会因 /boot 下存在 Arch 内核而感到困惑。我猜想诸如启动修复之类的实用程序应该能够正确地使您的所有发行版都可启动,但如果我没记错的话,它对您不起作用。

一种永久修复可能包括将 arch 内核和映像安装在与默认 /boot 不同的目录中。这很繁琐,您应该查阅 Arch wiki 的 grub 条目以了解如何正确执行此操作。

旧答案(如果您打算长期切换到 Arch,则推荐) 这就是我要做的,并且不知怎的,几个月前就已经完成了。

前往arch 维基 grub 页面并读出分区表的相关部分(您可能是 UEFI,因此请阅读 ESP 等)。

手动启动到 Arch

这是一次非常有影响力的经历,我建议尝试一下。假设您的 Arch Linux 内核位于磁盘上的某个位置,请c在 grub 提示符下按并输入 ls 以查看设备和分区列表,如下所示(hd0,msdos1),(hd1,gpt1),...。您可以 ls 分别查看内容。

你需要弄清楚三件事:

  • /你的 Arch根分区在哪里
  • 你的 Arch 内核在哪里vmlinuz
  • 你的拱门在哪里intiramfs-linux.img

一旦拥有这三个,您将在 grub> 中运行三个命令,提示类似于此的内容。

grub> set root=(hd0,1)
grub> linux /vmlinuz root=/dev/sda1
grub> initrd /intiramfs-linux.img
grub> boot

请注意,grub 可以查找,例如

grub> find /sbin/init

(grub 无法自动找到并导致内核恐慌;))

这一切我都已经学会了这里,我强烈推荐的一个来源。如果你能做到,请跳到修复 grub!否则...

从实时密钥启动 Arch! 获取实时 Arch 环境并按照chroot与第一次相同的方式将安装 wiki 安装到 Arch 上。

修复 grub

从 Arch 内部,安装相关的 grub 软件包,特别os-prober是允许grub-install检测您的其他系统。仔细遵循那里的安装指南,您应该能够(至少)从 grub 菜单启动 arch 和 ubuntu。安装命令最终看起来像这样。

** 警告 ** 不要运行这些命令,它们只是示例,您需要找出适合您系统的命令

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
# grub-mkconfig -o /boot/grub/grub.cfg

** 如果一切都失败了 **

不幸的是,这是因为它得到的信息数量有限,而且 SE 并不是真正解决此类问题的论坛,因此我的“通用”答案指的是有用的资源。

如果您无法弄清楚,也许可以访问 Arch 论坛,并且只要您已尽力并事先阅读了文档,您可能会找到帮助。

通过 Arch 完成这一切对我来说是一次基本的学习经历。

答案3

我的解决方案更简单。我使用终端并执行以下操作:

sudo rm /boot/grub/grub.cfg
sudo update-grub

如果您还有其他问题,只需使用boot-repair,它是免费下载的,小到足以刻录到 CD 磁盘。

相关内容