解决双硬盘下一个windows两个linux操作系统的grub引导问题
问题表现:联想扬天老台式机,机械硬盘安装有windows10和UbuntuStudio,后加装一块SSD后在其上安装了Manjaro,安装的时候并未关闭机械硬盘,重启后Manjaro的grub主引导菜单正常显示,可以启动三个系统,点ubuntu可进入ubuntu的grub引导菜单,俄罗斯套娃的表现是预料之中的,开始用了几天倒也正常,后来可能是两个linux更新时因update-grub带来一个问题
问题表现:联想扬天老台式机,机械硬盘安装有windows10和UbuntuStudio,后加装一块SSD后在其上安装了Manjaro,安装的时候并未关闭机械硬盘,重启后Manjaro的grub主引导菜单正常显示,可以启动三个系统,点ubuntu可进入ubuntu的grub引导菜单,俄罗斯套娃的表现是预料之中的,开始用了几天倒也正常,后来可能是两个linux更新时因update-grub带来一个问题,Manjaro的grub引导菜单出不来,按F12也只显示机械硬盘SATA2上的ubuntu和windows,导致无法启动Manjaro。虽然UbuntuStudio的grub启动菜单上显示有Manjaro引导项但无法启动,屏幕显示LENOVO标识但始终没反应。两个硬盘都是GPT格式,在SSD上安装Manjaro时并未预先分区是整盘安装的,没有预留ESP分区,有16M的MSR分区。本想干掉ubuntu的grub并以Manjaro的grub作为主引导菜单,在Manjaro下无论是sudo grub-install /dev/sda还是sudo grub-install /dev/sdb都未能在SATA1即SSD硬盘上成功搞定grub引导(grub一直都存在于/boot/grub下,只是因为从一个磁盘上使用 UEFI 模式启动,磁盘上必须要先有一个 EFI 分区,而且这个分区已被标志为boot才具备引导功能),都是首次可以出现Manjaro的grub启动菜单,但只要进入任一系统后再重启Manjaro引导菜单又消失了。
单硬盘安装双系统或多系统不是难事,只要先安装windows再安装linux的话grub自动搞定多系统启动菜单问题,除非重装windows或者分区发生调整,一般不会带来问题。但多硬盘多linux系统确实要复杂些,可能与主板也有关系。系统无法引导问题都能修复,只要硬盘没坏、数据未被毁,我曾数十次地碰到过此类问题都能逢凶化吉,此时也未曾着急。
我的解决思路:
1.无引导菜单启动Manjaro。LliveCD可以解决,但复杂些,启动进入后需要挂载硬盘文件系统再chroot。好在UbuntuStudio的grub可用,点c进入grub命令行模式,执行四条命令即可启动。set root=(hd0,gpt3);set prefix=(hd0,gpt3)/boot/grub;insmod normal;normal,分别回车即可。hd0,gpt3因机而异,比如我的Manjaro的ext4分区一开始是gpt2,后来增加ESP分区后变为gpt3,可用ls查询其所在分区。
2.解决两个grub启动引导器相互干扰的问题。我希望至少各管各的,一个硬盘装一个,既互不相干,也相互调用。用分区软件无损调整SSD,压缩ext4分区,为ESP和MSR分区调出400多M的空间。将其新建为ESP和MSR两个分区,至少ESP是必须的,一般300M, 大一点无妨,是安装grub的EFI引导文件需要占用的。格式化为fat32格式前或后,须设置boot(还有个选项是 bios-grub)标
志,我是在Manjaro的KDE分区管理器右键点击sda1即ESP分区选择属性打钩选择的,不标识可能无法正确安装grub,此前多次安装再查看该分区一点空间都没有被占用,也有可能与之前未挂载ESP分区有关,也未可知。分区并标识后,执行sudo mount /dev/sda1 /boot/efi(即将ESP分区挂载到/boot/efi下,/boot/efi本是空的,挂载后可向ESP分区写文件);再执行sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Manjaro(安装grub的EFI引导文件到ESP分区下,使该硬盘具备UEFI引导grub功能。可能需要提前安装efibootmgr)。再sudo update-grub。
操作完成后重启电脑,原来SATA1依赖STAT2硬盘引导的问题得以解决,启动时按F12可以发现SATA1具备了grub引导功能,标识是Manjaro,点击后进入Manjaro的grub引导菜单。问题得以解决,对grub、GPT、EFI等知识点有了一些认识,但还是不甚了解,需要再学习。现在两个硬盘各有各的grub引导管理器,在BIOS里关闭任何一块硬盘都不影响硬盘本有的系统的正常运行,两块硬盘都不关闭也可相互引导,只是一直存在的ubuntu的grub无法引导manjaro的问题仍未解决,检查了分区uuid没发现异常,再琢磨。
收获:区分BIOS 系统、UEFI系统和磁盘分区表对象及概念上的不同。BIOS无法识别GPT分区,BIOS下GPT磁盘不能用于启动操作系统,在操作系统提供支持的情况下可用于数据存储。UEFI可同时识别MBR分区和GPT分区,UEFI下MBR磁盘和GPT磁盘都可用于启动操作系统和数据存储,不过微软限制UEFI下使用Windows安装程序安装操作系统是只能将系统安装在GPT磁盘中(ESP和MSR分区就是Windows系统安装时自动创建的,我们往往没注意,而本文中我在一个新磁盘上安装的是linux系统,虽然磁盘分区表是GPT,但由于另一块磁盘已有ESP分区,grub就自动选择有ESP分区的磁盘作为启动磁盘。我上面的操作是基于UEFI系统+GPT分区表,在操作中因混淆概念走了一些弯路,将BIOS的一些过时的操作用在UEFI系统上,比如sudo grub-install /dev/sda就是基于BIOS的,一度因张冠李戴耽误了太多时间。使用UEFI安装时,一定要让安装介质以UEFI模式启动,否则 efibootmgr 将无法添加 GRUB UEFI 启动项,而且要从一个磁盘上使用 UEFI 模式启动,磁盘上必须要先有一个 EFI 分区,在其上安装grub必须先挂载EFI 分区也就ESP分区才能写入 GRUB EFI 应用(引导文件)并在固件启动管理器中创建一个条目(也就是我们看到的引导菜单项目)。BIOS下启动操作系统之前,必须从硬盘上指定扇区读取系统启动代码(包含在主引导记录即MBR中),然后从活动分区中引导启动操作系统,而在UEFI下,这些都不需要,不再需要主引导记录,不再需要活动分区,只要有ESP分区并在其中写入引导文件即可,其他的事交给UEFI系统来做。UEFI 会启动 EFI 应用程序。例如引导加载程序、引导管理器和 UEFI Shell 等等。这些应用程序通常以文件形式存储在 EFI 系统分区中,厂商可以将其特定文件存储在 EFI 系统分区中的 /EFI/vendor_name 文件夹下,应用程序可以通过在 NVRAM 中添加引导项或从 UEFI shell 中启动。如果要用多系统,某块硬盘未安装过windows且今后可能安装windows,比如先装linux后装windows,在安装其他操作系统前最好先用分区软件建立ESP和MSR分区特别是前者,这将为此后安装windows留有空间。同时,还是注意grub版本的不同以及针对不同分区表磁盘的处理方式的不同,可参照以下引用。
GUID Partition Table (GPT)是一种更灵活的分区方式。它正在逐步取代Master Boot Record (MBR)系统。GPT相对于诞生于MS-DOS时代的MBR而言,有许多优点。新版的fdisk(MBR)和gdisk(GPT)使得使用GPT或者MBR在可靠性和性能最大化上都非常容易。
在做出选择前,需要考虑如下内容:
如果使用 GRUB legacy 作为bootloader,必须使用MBR。
如果使用传统的BIOS,并且双启动中包含 Windows (无论是32位版还是64位版),必须使用MBR。
如果使用 UEFI 而不是BIOS,并且双启动中包含 Windows 64位版,必须使用GPT。
非常老的机器需要使用 MBR,因为 BIOS 可能不支持 GPT.
如果不属于上述任何一种情况,可以随意选择使用 GPT 还是 MBR。由于 GPT 更先进,建议选择 GPT。
建议在使用 UEFI 的情况下选择 GPT,因为有些 UEFI firmware 不支持从 MBR 启动。
注意: 为了使 GRUB 从一台有 GPT 分区的基于 BIOS 的系统上启动,需要创建一个 BIOS 启动分区, 这个分区和 /boot 没关系,仅仅是 GRUB 使用,不要建立文件系统和挂载。
更多推荐
所有评论(0)