01 grub rescue修复–sata接口的硬盘(适用于sata固态和机械硬盘)
前几天买了块SSD回来,想把之前的win10+ubuntu16.04都迁移到SSD上。做法是下载分区助手,完成了win10系统C盘和软件盘D盘的迁移,但是ubuntu则是不能用分区助手迁移的,因为分区助手就没有linux版,所以ubuntu就必须重装到ssd上。重装的时候,采用了uefi方式安装,安装好后重启系统,发现无法进入bios,只出现grub rescue界面,在网上看了一些教程,说什么拔硬盘、给bios rom放电、装ubunt到u盘上然后从u盘进入ubuntu,吓了我一跳。当时确实有点慌了,因为我的观点是装系统可以随便玩,只要不去动bios就行,而这次竟然进不了bios所以有点头疼,以为得去维修店刷bios了。其实不然,出现grub rescue命令行,只要之前安装的ubuntu还在,就修复一下grub即可。方法如下:
ls #列出磁盘上的所有分区
ls (hd0,msdos12) #查看msdos12是否是ext文件系统,假设是则下面都用msdos12,如果不是则继续查看(hd0,msdosXX)XX是ls中列出的数字序号
ls (hd0,msdos12)/grub #我目前的硬盘上是hd0 12和hd0 5上有ubuntu
ls (hd0,msdos12)/boot/grub
set root=(hd0,msdos12) #这条命令可以没有
set prefix=(hd0,msdos12)/boot/grub #如果是第四行没有显示unknow file,如果是第三行显示unknow file则/boot/grub改成 /grub
insmod normal
normal #就可以进入那个熟悉的grub菜单界面了
#在进入ubuntu后需要执行以下两条命令
sudo update-grub
sudo grub-install /dev/sda #sda后不加数字
几点注意的地方:
1)ls (hd0,msdos12)/grub #ls后有一个空格,中间的逗号后边没有空格,右括号后也没有空格,如果是多加或少写了空格会出现 unknown command,即命令输错了,而不会是unknown file 和unknown file system
2)ls (hd0,msdos12)可以写成ls(hd0,12),即省略掉msdos这几个字符
3)可以先ls (hd0,12)看是否是ext文件系统,如果是再去检查/grub或者/boot/grub是否含有grub的引导文件 ,这样会比较节省时间
4) 在修复好grub后,也能正常进入bios了(有点奇怪)
02 grub rescue修复–nvme协议m.2接口的硬盘
方法和上面的是一样的,只是需要根据nvme硬盘的特点做一点修改
ls # 列出所有分区,因为我是nvme+gpt+efi模式,所以显示的是(hd0,gpt1)这种形式
ls (hd0,gpt2)/efi # 因为我的ubuntu引导分区efi在(hd0,gpt2),就是第一块硬盘的2分区,所以此处直接用它示范了
# 输出: ubuntu/ boot/
set root=(hd0,gpt2)
set prefix=(hd0,gpt2)/efi/ubuntu # 因为grub在efi/ubuntu目录下
insmod normal
normal
#在进入ubuntu后同样需要执行下面的命令
sudo update-grub
sudo grub-install /dev/nvme0n1 # 这里的设备号nvme0n1很关键,因为我的efi分区装在nvme0n1p2中的,所以此处是nvme0n1
需要注意的是:
(01) ls找efi分区时,只要efi下有ubuntu的,那就是它了,如果您记得是在那个硬盘哪个分区,就直接ls它确认下即可.
(02) 比较坑的一点是,我经过上面的操作后,重启系统又进入了grub rescue,后来发现是因为我有两块硬盘,但是bios中的默认启动顺序不是nvme0n1, 而是另一块硬盘,所以如果您也有这个问题的话,则需要设置bios的启动顺序
03 MBR、主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区解释
版本1
http://blog.51cto.com/matthewfjnd/2294325
版本2
https://www.cnblogs.com/wincai/p/5482301.html
04 Linux启动过程
https://www.ibm.com/developerworks/cn/linux/l-linuxboot/
05 uefi bios和legacy bios mbr和gpt
这两个都是bios,legacy是传统的bios,而uefi则是新出的bios标准
https://blog.csdn.net/a3192048/article/details/82975745
06 grub和lilo都可以用于linux的系统加载程序,在传统mbr模式下,它们是在执行mbr引导程序后加载到内存执行的,其作用是加载操作系统内核。现在linux用grub引导的居多。