GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。
GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
grub是多重引导加载程序。通俗点说,它就是用来一个可以让你选择运行什么操作系统的程序。在你开机的时候,它是第一个运行的程序。它决定着,将计算机的控制权给哪个系统内核。然后系统内核将进一步初始化、处理操作系统的其他部分。
出现grub的原因,是因为GNU GRUB
找不到引导文件,引导系统内核了。所以,要想解决这个问题,需要让GNU GRUB
找到相关的引导文件,进行正确的引导。
处理方法1:
1.查找内核所在的分区
输入root (hd0, 在这里按tab键,出现下面的分区,我们只需要type为83的分区,所以我们输入root (hd0,0)
2.指定启动内核所在位置
输入kernel / 按tab后发现有很多文件夹,我们知道内核放在boot文件夹下,所以输入kernel /boot/vm 此处按tab自动补全就行,root=/dev/sda1的意思是指定根分区设备文件的位置,然后回车确认。
3.指定临时镜像文件所在位置
输入initrd / 按tab后发现有很多文件夹,我们知道临时镜像放在boot文件夹下,所以输如initrd /boot/initra 此处按tab自动补全就行,然后回车确认。
最后输入boot按照我们设定的内核文件和临时镜像文件启动系统,如:grub>boot
参考资料:https://www.linuxprobe.com/boot-grub.html
处理方法2:
1. 首先利用ls命令,找到Ubuntu安装在哪个磁盘分区;
- 比如输入ls后我的机器列出的磁盘分区信息如下:
(hd0),(hd1),(hd1,gpt3),(hd1,gpt2),(hd1,gpt1)
- 查找包含grub.cfg文件的分区
假定通过 ls (hd1,gpt2)/boot/grub 发现了grub.cfg文件,则表明Linux安装在这个分区
2. 找到Linux的/boot分区,以及/根分区所在的磁盘位置
输入 cat (hd0,gpt2)/etc/fstab
会输出类似下面的信息
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during installation
UUID=dd6e0539-1369-4938-8af5-378f02cf05cf / ext4 errors=remount-ro 0 1
3. 指定Linux内核,及/所在分区
grub> linux /boot/vmlinuz-4.8.0-36-generic ro text root=/dev/sda2
4. initrd命令指定initrd文件
grub> initrd /boot/initrd.img-4.8.0-36-generic
5. boot引导系统,结束
grub> boot
参考资料:https://www.cnblogs.com/ValyrianSteel/p/12693287.html
处理方法3:
1.首先,在grub>
指令处,输入ls
指令。这个指令能让你看到当前路径下的文件和文件夹。使用这个指令,你可以类似这样的输出,(hd0)
、(hd0, msdos1)
类似的。这些是磁盘的分区,我们需要在这些分区内找到能够正确引导系统的文件配置。
2.使用指令ls (hd0)/
来一个个测试,看输出有没有vmlinuz
或者linux
,initrd.img
,root
这样的字样。比如第一步出现(hd0)
, (hd0, msdos1)
,在这一步的时候,你需要使用ls (hd0)/
和ls (hd0, msdos1)/
来一个个去试,直至出现上文提示的那些字样,那个分区就是引导文件所在的地方。如果ls (hd0, msdos1)/
出现unknown filestystem
,你可以尝试使用ls /(hd0, msdos1)/
,以此类推ls (hd0, msdos1)/
可以简写为ls (hd0, 1)/
3.找到引导文件所在位置,比如在(hd0,5)
。输出以下指令
set root=(hd0,5)
set prefix=(hd0,5)/boot/grub
insmod normal
normal
这一步来设置引导文件的位置。
4. 如果还是不行,尝试以下指令
linux (hd0,5)/vmlinuz root=/dev/sda5
initrd (hd0,5)/initrd.img
boot
这里是让引导程序去引导。至此,应该可以正常开机了。