开机进入 grub
修改引导区可能是一个高风险操作。最好运行命令时要仔细查看,计算机有重要数据时把重要的数据备份,或是提前备份好引导分区,还有硬盘分区表,或是做好整个硬盘的资料备份。数据备份很重要。
有时我们可有需要在多台电脑上安装ubuntu 20.04,但像使用ghost一样,可以使用分区还原功能,来快速安装很多软件。
这时可以备份分区到另外一台电脑上还原。
但各个电脑上因为可能硬盘号不同,会出现引导不了ubuntu的现象,如开机出现ubuntu的grub提示符。
这时我们可以手工修复,其实也不复杂。
用下面的 ls 命令,显示出有那些硬盘分区,hd代表硬盘,gpt0这种代表分区
|
|
(hd0,gpt0),(hd0,gpt1),(hd0,gpt2),(hd0,gpt3)
再一个个查看ls (hd0,gpt2)/,每个分区下面,有没有类似ubuntu的文件根目录的文件夹,如果有就是这个分区。
这里假设为(hd0,gpt2),那么ls (hd0,gpt2)/就会显示这个分区下面的文件目录信息,有类似ubuntu的文件夹信息
|
|
再设置变量,开启正常进入
grub>set root= # 这里指定根分区
grub>set prefix= # 这里指定GRUB的安装目录,如果boot在主分区中,就是主分区/boot/grub,如果boot单独分区,就是boot分区的/grub。
如果未更改 vmlinuz、initrd 位置,可以不设置 linux 或者 initrd
|
|
进入ubuntu 20.04后,在终端命令行下运行下面的命令修复grub
|
|
重启后,可以正常引导启动进入ubuntu的图形界面系统。
在双系统win10+ubuntu20.04上实际测试有效,但因为修改引导区可能是一个高风险操作,最好运行命令时要仔细查看,必要时把重要的数据备份,或是提前备份好引导分区,还有硬盘分区表,或是做好整个硬盘的资料备份。数据备份很重要。
这种方法的好处是可以快速安装ubuntu20.04在多个电脑上,特别是有很多复杂设置的运行环境下,可以更加高效安装,不用浪费时间一台台去安装复杂的配置。目前只是用于硬件构造差不多的(一样的主板)电脑上,估计如果是差异比较大的电脑上可能会出现驱动问题。
参考:
开机进入 grub rescue
很多时候,特别是在linux调整分区后,开机重启时会出现
error : unknow filesystem
grub rescue>
的字样,系统就是进不去。这表示你的grub2的配置文件坏了……
由于分区调整或分区UUID改变造成grub2不能正常启动,从而进入修复模式了(grub rescue),也称救援模式。
在救援模式下只有很少的命令可以用:set , ls , insmod , root , prefix
(1)set 查看环境变量,这里可以查看启动路径和分区。
(2)ls 查看设备
(3)insmod 加载模块
(4)root 指定用于启动系统的分区,在救援模式下设置grub启动分区
(5)prefix 设定grub启动路径
具体修复步骤如下:
1、查看分区:grub rescue> ls 回车
会出现如下字样:
(hd0) (hd0,msdos9) (hd0,msdos8) (hd0,msdos7) (hd0,msdos6) (hd0,msdos5) (hd0,msdos2) (hd0,msdos1)
注:上面是我的分区设备,每个人可能不一样,但原理都是一样的。
2、寻找ubuntu所在分区:
(就是寻找你的Linux系统是装在以上哪个分区里)
grub rescue> ls (hd0,msdos1)/
若出现unknown filesystem字样,则尝试下一个
……
若出现的是你的ubuntu主文件夹下的文件夹和文件的名字,那就是的要找的分区了。
3、修改启动分区:
(假如你找到的启动分区是hd0,msdos8)
|
|
之后你就会看到熟悉的启动菜单栏了
4、进入命令行启动ubuntu
进入系统启动选项界面后还是进不去,
因为你还没有真正的修改grub,这个要到ubuntu里修改
进入系统启动项界面后,按C进入命令行模式
grub >set root=hd0,msdos8
grub >set prefix=(hd0,msdos8)/boot/grub
grub >linux /vmlinuz-xxx-xxx root=/dev/sda8 //里边的xxxx可以按Tab键,如果有acpi问题,在最后加一句acpi=off grub >initrd /initrd.img-xxx-xxx grub >boot
这样就可以进入了
5、进入ubuntu修复grub
在终端里运行
|
|
6、重启,搞定!!
注:我当时只是修改了1~3步骤,然后在菜单栏就可以进入系统了,且一切正常。
可惜,在重启时,系统就只有一个光标在左上角不停的闪,咋也进不了系统。后来开机按F2,开机启动项改为硬盘启动就好了。
使用 live cd 挂载分区
制作启动 u盘,我这里是安装了 ventoy,然后把 linux live 包放入 u盘,dell电脑开机按 f12 选择启动设备
进入 linux 挂载分区,设置 chroot ,执行命令安装 grub 并生成 grub.cfg 配置文件
|
|
grub-install 时,如果引导文件已经存在,可以先删除或者加上 --removable 参数
|
|
参考:
[Linux from Scratch - EFI variables are not supported on this system](https://superuser.com/questions/1738694/linux-from-scratch-efi-variables-are-not-supported-on-this-system)
补充和解释
debian 中 EFI/debian/grub.cfg 中写明了 boot 分区的 uuid,这里的uuid决定了谁是第一启动项,如果同时有debian和lmde,因为不会在EFI里面同时有 debian 和 lmde,所以 lmde也会把efi文件放在debian里
debian /boot/grub/grub.cfg 中记录了机器上其他的系统,如果其他系统有更改,例如删除,重装等,可能需要 update-grub 来更新此文件
update-grub:更新分区信息,如果开启了 os-prober,会查找所有磁盘的系统信息并更新到 /boot/grub/grub.cfg文件。
grub-install:将 grub 安装到包含 /boot的分区,根据分区不同,可能是主分区,也可能是 boot分区里面,对于 UEFI 引导,grub-install 会将 GRUB 安装到 UEFI (ESP)分区的特定位置。通常是 /boot/efi/EFI 目录下创建 GRUB 相关的文件和目录,其中的 grubx64.efi 文件是 GRUB 的 UEFI 引导加载程序。
/boot/grub 目录: 同样,GRUB 的配置文件和一些必要的模块会被复制到 /boot/grub 目录中。
vmlinuz 和 initrd
- vmlinuz:
vmlinuz是 Linux 内核的压缩版本。内核是操作系统的核心部分,负责管理系统资源、调度任务、提供系统调用接口等。vmlinuz文件包含了压缩过的 Linux 内核,用于启动操作系统。
- initrd (initial ramdisk):
initrd是一个临时的根文件系统,其目的是在 Linux 内核引导过程中提供必要的初始化文件和驱动程序,以便能够挂载实际的根文件系统。initrd包含了一些必要的工具和模块,使系统能够在引导过程中加载并运行。一旦真正的根文件系统准备好,initrd就会被卸载。
修改引导
调整引导启动项,windows 可用软件 DiskGenius、EasyUEFI,linux 用 efibootmgr 命令,GRUB Customizer的图形界面工具
用efibootmgr管理UEFI启动项,添加丢失的启动项 - pipci - 博客园 (cnblogs.com)
grub 安装命令
grub-install
安装到 UEFI 引导的系统,–efi-directory 指定 efi 根路径,–bootloader-id 指定引导加载器的名称,这个也会是ESP分区中,/EFI 中相应目录名称,一般是发行版名称
|
|
grub-mkconfig
生成系统内核菜单条目并加入到 /boot/grub/grub.cfg
|
|
update-grub
update-grub 是 grub-mkconfig 的包装器,grub-mkconfig 是用于检测 /boot 中的内核的实用程序。因为使用挂载的 /boot(也许它也可以基于 /etc/fstab 挂载 /boot),并且您的 Linux 安装使用单独的 /boot 分区, grub-mkconfig 因此 grub-mkconfig 只会为您当前正在运行的 Linux 发行版生成配置。这就是为什么在 Debian 中,Mint 没有被检测到,反之亦然。
参考grub-mkconfig adding entry for other Linux system but ignoring its Grub config