Hublog随手记录一些东西

修复 Grub 引导

开机进入 grub

修改引导区可能是一个高风险操作。最好运行命令时要仔细查看,计算机有重要数据时把重要的数据备份,或是提前备份好引导分区,还有硬盘分区表,或是做好整个硬盘的资料备份。数据备份很重要。

有时我们可有需要在多台电脑上安装ubuntu 20.04,但像使用ghost一样,可以使用分区还原功能,来快速安装很多软件。

这时可以备份分区到另外一台电脑上还原。

但各个电脑上因为可能硬盘号不同,会出现引导不了ubuntu的现象,如开机出现ubuntu的grub提示符。

这时我们可以手工修复,其实也不复杂。

用下面的 ls 命令,显示出有那些硬盘分区,hd代表硬盘,gpt0这种代表分区

1
grub>ls

(hd0,gpt0),(hd0,gpt1),(hd0,gpt2),(hd0,gpt3)

再一个个查看ls (hd0,gpt2)/,每个分区下面,有没有类似ubuntu的文件根目录的文件夹,如果有就是这个分区。

这里假设为(hd0,gpt2),那么ls (hd0,gpt2)/就会显示这个分区下面的文件目录信息,有类似ubuntu的文件夹信息

1
grub>ls (hd0,gpt2)/

再设置变量,开启正常进入

grub>set root= # 这里指定根分区

grub>set prefix= # 这里指定GRUB的安装目录,如果boot在主分区中,就是主分区/boot/grub,如果boot单独分区,就是boot分区的/grub。

如果未更改 vmlinuz、initrd 位置,可以不设置 linux 或者 initrd

1
2
3
4
5
6
grub>set root=(hd0,gpt2)
grub>set prefix=(hd0,gpt2)/boot/grub
grub>linux /vmlinuz root=/dev/sdaA  #vmlinuz必须使用TAB补全(可能有后缀),注意A的值,sda或sdb需要看自己的实际情况
grub>initrd /initrd.img-xxx #TAB补全,多内核情况下版本需统一
grub>insmod normal
grub>normal

进入ubuntu 20.04后,在终端命令行下运行下面的命令修复grub

1
2
sudo update-grub
sudo grub-install /dev/sda	# 将 sda 换成你的包含 /boot 的分区

重启后,可以正常引导启动进入ubuntu的图形界面系统。

在双系统win10+ubuntu20.04上实际测试有效,但因为修改引导区可能是一个高风险操作,最好运行命令时要仔细查看,必要时把重要的数据备份,或是提前备份好引导分区,还有硬盘分区表,或是做好整个硬盘的资料备份。数据备份很重要。

这种方法的好处是可以快速安装ubuntu20.04在多个电脑上,特别是有很多复杂设置的运行环境下,可以更加高效安装,不用浪费时间一台台去安装复杂的配置。目前只是用于硬件构造差不多的(一样的主板)电脑上,估计如果是差异比较大的电脑上可能会出现驱动问题。

参考:

手工修复ubuntu 20.04的grub引导

Ubuntu开机进入GRUB手动引导

开机进入 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)

1
2
3
4
5
6
grub rescue>root=(hd0,msdos8)
grub rescue>prefix=/boot/grub             //grub路径设置
grub rescue>set root=(hd0,msdos8)
grub rescue>set prefix=(hd0,msdos8)/boot/grub
grub rescue>insmod normal               //启动normal启动
grub rescue>normal

​ 之后你就会看到熟悉的启动菜单栏了

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

在终端里运行

1
2
sudo update-grub
sudo grub-install /dev/sda

6、重启,搞定!!

注:我当时只是修改了1~3步骤,然后在菜单栏就可以进入系统了,且一切正常。

​ 可惜,在重启时,系统就只有一个光标在左上角不停的闪,咋也进不了系统。后来开机按F2,开机启动项改为硬盘启动就好了。

来源:怎样修复grub开机引导(grub rescue)

使用 live cd 挂载分区

制作启动 u盘,我这里是安装了 ventoy,然后把 linux live 包放入 u盘,dell电脑开机按 f12 选择启动设备

进入 linux 挂载分区,设置 chroot ,执行命令安装 grub 并生成 grub.cfg 配置文件

1
2
3
4
5
6
sudo mount Ubuntu系统分区 /mnt
sudo mount EFI分区 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install boot分区所在
update-grub

grub-install 时,如果引导文件已经存在,可以先删除或者加上 --removable 参数

1
grub-install --target=x86_64-efi --efi-directory=/boot --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)

Ubuntu20.04 引导修复

补充和解释

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

  1. vmlinuz:
    • vmlinuz 是 Linux 内核的压缩版本。内核是操作系统的核心部分,负责管理系统资源、调度任务、提供系统调用接口等。vmlinuz 文件包含了压缩过的 Linux 内核,用于启动操作系统。
  2. initrd (initial ramdisk):
    • initrd 是一个临时的根文件系统,其目的是在 Linux 内核引导过程中提供必要的初始化文件和驱动程序,以便能够挂载实际的根文件系统。initrd 包含了一些必要的工具和模块,使系统能够在引导过程中加载并运行。一旦真正的根文件系统准备好,initrd 就会被卸载。

如何手动安装(并配置)GRUB?

了解 UEFI与Legacy、硬盘分区MBR和GPT

修改引导

调整引导启动项,windows 可用软件 DiskGenius、EasyUEFI,linux 用 efibootmgr 命令,GRUB Customizer的图形界面工具

用efibootmgr管理UEFI启动项,添加丢失的启动项 - pipci - 博客园 (cnblogs.com)

grub 安装命令

grub-install

安装到 UEFI 引导的系统,–efi-directory 指定 efi 根路径,–bootloader-id 指定引导加载器的名称,这个也会是ESP分区中,/EFI 中相应目录名称,一般是发行版名称

1
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch

grub-mkconfig

生成系统内核菜单条目并加入到 /boot/grub/grub.cfg

1
grub-mkconfig -o /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

0%