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


9

我有一台用于双引导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版本都使用正确的内核和正确的分区启动?

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

我可以清除所有与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

我试图从Ubuntu将GRUB重新安装到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的高级选项:
GRUB Arch的高级选项


我的/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

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


我在ubuntu,Windows和Arch Linux的三重启动中遇到了同样的问题。您需要根据需要手动修复grub,引导至arch linux,然后从那里重建grub,您可能需要安装os-prober。然后运行这些,sudo mkinitcpio -p linux然后sudo grub-mkconfig -o /boot/grub/grub.cfg最后运行sudo grub-install /dev/sda
爱德华·托瓦尔兹

当我在笔记本电脑上安装各种Linux发行版时(替换旧的Linux发行版时,保持Windows不变),我遇到了类似的问题,我要做的就是简单地从efi中删除旧版操作系统的相应文件夹并进行grub更新。但以我的情况而言:1.是UEFI系统2.我没有保留多个Linux OS。
注册用户

在启动时,您可以动态修改内核和initrd以启动到Ubuntu吗?如果您这样做了,那是什么错误呢?
2016年

您发布的屏幕包含错误消息:Root device mounted successfully, but /sbin/init does not exists。你调查了吗?难道init真的失踪了?如果是这样,那么您绝对应该安装它(如果存在的话),为什么找不到它?
MariusMatutiae '16

Answers:


5

我终于通过在Arch的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
    
  • 重新启动并享受!


我觉得第一个编码线应包含initramfs-linux...ranfs...
安华

1
@Anwar当然,感谢您的关注。我纠正了错字。
Byte Commander'Aug

1

手动修复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。此外,它在/in分区下查找它们,该分区确定了uuid=eee18451-b607-4875-8a88-c9cb6c6544c8可能承载或可能不承载预期的Ubuntu文件的位置。

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

sudo blkid

获取您的ubuntu根分区的uuid。

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

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

如果这不能立即解决,则可能需要进行其他更正。您可以通过“复制”经过测试且有效的条目之一来找到它们,我建议您使用最原始的条目(例如,不传递新贵或传递诸如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根目录的uuid来调整Arch条目的最后两行。

一个(几个)警告词:

通常,不建议Ubuntu用户grub.cfg用手弄乱。明确地复制它,并在编辑时要小心。准备好使系统无法启动的机会(但是您可以使用我的旧答案中概述的启动过程来重新启动它)。

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

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

OLD ANSWER(如果您打算长期转为Arch,建议您 这样做这是我会做的,而且几个月前已经做了。

转到arch wiki grub页面,并读取分区表的相关部分(您可能是UEFI,因此请阅读ESP等信息)。

手动启动到Arch

我建议您尝试这种高度形成性的体验。假设您的Arch Linux内核位于磁盘上的某个位置,请c在grub提示符下按并键入ls以查看设备和分区的列表,如下所示(hd0,msdos1),(hd1,gpt1),...。您可以让他们每个人查看内容。

您需要找出三件事:

  • 您的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

(一个g无法自动找到并给您带来内核恐慌;))

我在这里学到所有这些内容,我强烈建议您使用。如果可以管理,请跳至修复grub!除此以外...

从活动键启动Arch! 获得实时的Arch环境,chroot并以与第一次相同的方式将安装Wiki跟踪到Arch上。

固定g

从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进行所有这些工作是一种基本的学习经验。


1
感谢您的答复。首先,它是带有MBR分区磁盘的BIOS系统。其次,我想使用来自Ubuntu的grub软件包和配置,我不打算从Arch重新安装GRUB。我还怀疑这是否会带来任何变化...而且我可以通过“高级”选项中某处的GRUB条目引导到Ubuntu。问题在于GRUB似乎无法确定哪个内核或初始ramdisk或属于哪个系统,属于哪个分区。
字节指挥官

本质上,适用相同的步骤。grub-install和grub-mkconfig(这使您有了新的grub.cfg文件)是grub命令,它们在ubuntu下也可用。检查os-prober是否也可用或类似的东西(这允许mkconfig查找其他文件系统)。假设内核映像位于正确的位置,可以修复此问题,请重新阅读您的文章,我不确定是这种情况。检查/ boot分区,以确保所有内核和.img都存在。您可能已经用arch的initramfs覆盖了Linux initrd.img。进入ubuntu论坛或askubuntu。
3 Diag 2016年

如我所写,我已经运行grub-mkconfig毫无用处,但是当我回到家时,我将检查/ boot中的可用映像。并且有一些os-prober脚本。
字节指挥官

抱歉,错过了。然后,您可能已经用拱形内核覆盖了ubuntu内核和initrd。您可以通过从ubuntu后备内核运行升级/更新序列将它们弹出到位(我认为)
3 Diag'Aug

Ubuntu内核应该很好,因为我可以从“ Ubuntu的高级选项”菜单中启动所有内核。如果那里有什么问题,那可能只是默认内核的符号链接...今天晚上要检查一下。
字节指挥官

0

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

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

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


OP已运行update-grub。引导修复不太可能解决此特定问题。
terdon

grub和某些引导修复或更新过程假定/boot/grub/grub.cfg中的内容是正确的。但是进行更改,就像重新格式化分区一样,您将获得一个新的UUID,这将使您进入grub-rescue>要对此进行处理,只需执行以下操作:sudo update-grub。grub.cfg中的所有条目都是最新的。
BAD-Boop

是的,但是操作人员已经这样做了,但并没有帮助。我意识到问题很大,很容易错过,但是sudo grub-mkconfig -o /boot/grub/grub.cfg就在那里。update-grub是运行的一个非常简单的shell脚本grub-mkconfig -o /boot/grub/grub.cfg 。您可以通过看到此内容cat /usr/sbin/update-grub
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.