当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

我有一台曾经用过Ubuntu(当前为16.04)和Windows 7的dual-boot机器,并使用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的条目。

从Ubuntu运行sudo update-grub(“ 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菜单结构:

Ubuntu的高级选项:

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的/boot目录中添加Arch分区及其启动文件来解决该问题。现在,Ubuntu还是可以的,所有剩余的GRUB条目都可以再次使用。

以下是我的工作清单:

  • 删除Arch的initramfs文件:

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

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

  • 更新GRUB的配置:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/8571.html,未经允许,请勿转载。