最近为了能稳定连接服务器而不用在Windows和Linux之间切换来切换去买了台式专门装Linux。Ubuntu用久了便寻思着换个发行版玩一玩(生命在于折腾嘛:-D),研究半天看上了LinuxMint和Manjaro,反复琢磨也分不出个高低。刚好有两块硬盘就直接两个都装了Dual boot。
因为在主硬盘里安装的LinuxMint所以就用它的grub来引导两个系统。然而这时候却出现了问题。当我从grub的menu中选择了manjaro之后,屏幕上出现了一堆输出并停止工作。输出的最后一行是:
Kernel panic - not syncing: VFS: unable to mount root fs on unknown-block(0,0)
Google了一下,发现这还是一个known issue,主要原因是Manjaro(Arch)的grub中有一些比较特殊的配置,因此很难从别的发行版中boot Manjaro而不产生错误。比较直接的解决方案是使用Manjaro的引导来boot。Manjaro的grub在更新搜索后可以正常boot LinuxMint。如果你想使用这种方案,请搜索改变硬盘引导顺序的相关方法。如果你没法或者不想改变硬盘引导顺序,只想使用LinuxMint的grub来boot两个系统(像我一样),那么本文就是来解决这个问题的。
本文的解决方案主要参考了这个和这个帖子。里面提出了许多解决方案,本人基本上都试了一遍,并最终成功修复。本文给出的最终方案是其中几种方案的结合,也许有些操作是多余的,本人并没有测试过拿掉其中一步对系统的影响。本人也不是系统专家,写本文的主要目的是避免自己忘记怎样修复这个问题的,并且给其他跟我一样遇到这个问题的新手一个帮助,也欢迎大家来一同讨论。
解决方案:
- 首先在LinuxMint中执行
或sudo update-grub
以确保grub探测到了Manjaro系统。一般来说这一步并不能解决本文所描述的问题,只是确保grub中存在Manjaro系统的条目。grub-mkconfig -o /boot/grub/grub.cfg
- 修改
HOOKS
value:
在Manjaro系统中,打开/etc/mkinitcpio.conf
,检查其中的HOOKS
,如果你的是
那么将它改为:HOOKS="plymouth"
(这个问题不一定会存在,本人的系统中HOOKS="base udev autodetect modconf block resume filesystems keyboard keymap fsck usr shutdown"
HOOKS
的值就多于"plymouth",但是没有修改的那么多,个人认为本人系统中的配置不是导致无法boot的原因。当然如果你的系统中的确存在这个问题,那么很可能也是导致无法boot的原因之一,那就按照上面说的修改。)
然后执行:sudo mkinitcpio -P
- 在LinuxMint中,打开
/etc/default/grub
,检查其中GRUB_CMDLINE_LINUX_DEFAULT
的值,如果值中不包含splash
,比如只有quiet
,添加splash
使其成为:GRUB_CMDLINE_LINUX_DEFAULT=“quite splash"
- 在LinuxMint和Manjaro中,找到grub menu中Manjaro条目的配置文件。这里有两种方法:
- 打开
/boot/grub/grub.cfg
,并找到对应于Manjaro的部分。在本人的系统中,这部分由
开始,紧跟一行为### BEGIN /etc/grub.d/47_custom_proxy ###
在一些配置内容后以menuentry "Manjaro Linux (17.0) ..."
结束。### END /etc/grub.d/47_custom_proxy ###
- 使用
Grub Customizer
(推荐新手在LinuxMint下使用该方法),在List configuration中找到Manjaro对应的条目,点击右键-->edit(编辑),弹出的对话框内Boot sequence下就是1中相同的配置信息。
- 打开
- 在LinuxMint的Manjaro条目的配置文件中,有一行为:
而在Manjaro的Manjaro条目的配置文件中,该行则为:initrd /boot/intel-ucode.img
其中,initrd /boot/intel-ucode.img /boot/initramfs-4.9-x86_64.img
initramfs-4.9-x86_64.img
会根据具体系统和核心的版本不同而有所变化。本人写作本文时安装的是64位Manjaro 17.0的kernel 4.9版。将LinuxMint中的initrd
行修改为与Manjaro中对应行一致。随后执行sudo grub-update
更新grub,重启电脑检查grub修复情况。
本人就是在这一步之后成功修复了Manjaro系统的boot。
基本上,上述的完整方案能够覆盖导致无法boot Manjaro系统的几种主要原因。如果你仍旧无法解决该问题,或者在实现上述方案时有所疑惑,也欢迎留言来讨论。最后,也希望Manjaro团队或其他发行版能够早点解决这个问题。
By the way,Manjaro是真的好用,ArchWiki也算是文档中的楷模了。希望CUDA和CuDNN能早点官方支持啊。