Byt*_*der 9 dual-boot ubuntu arch-linux grub2 initramfs
我有一台机器用于双启动 Ubuntu(当前为 16.04)和 Windows 7,使用 Ubuntu 的 GRUB 作为引导加载程序。
现在我按照官方安装说明添加了 Arch Linux 作为第三个操作系统。我没有从 Arch 安装 GRUB,因为我想使用由 Ubuntu 控制的那个。这些说明包含一个命令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 的全新安装。
这是我的/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
Run Code Online (Sandbox Code Playgroud)
我尝试从 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
Run Code Online (Sandbox Code Playgroud)
我尝试从 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.
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这些是已安装的 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
Run Code Online (Sandbox Code Playgroud)
我还尝试重新生成 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
Run Code Online (Sandbox Code Playgroud)
从 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]
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
4.4.0 和 4.2.0 内核应该是 Ubuntu,Arch 应该有 4.5.0 内核。但是我如何找出名称中没有内核版本的文件属于什么?
$ 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
Run Code Online (Sandbox Code Playgroud)
我的Arch 根目录不包含任何文件或链接。
我最终解决了这个问题,方法是将 Arch 分区和它的引导文件放在我的 Ubuntu/boot目录中。Ubuntu 现在又好了,所有剩余的 GRUB 条目都可以正常工作了。
这是我所做的事情的清单:
删除 Arch 的initramfs文件:
sudo rm /boot/initramfs-linux*
Run Code Online (Sandbox Code Playgroud)删除 Arch 的vmlinuz文件:
sudo rm vmlinuz-linux
Run Code Online (Sandbox Code Playgroud)/dev/sda8使用 GParted格式化 Arch 分区 ( )
更新 GRUB 的配置:
sudo update-grub
Run Code Online (Sandbox Code Playgroud)重新启动并享受!
| 归档时间: |
|
| 查看次数: |
6058 次 |
| 最近记录: |