Linux grub 恢复,error: symbol ‘grub_is_lockdown‘ not found.

上周六Debian Buster升级后,周一回来,开机提示如下

error: symbol 'grub_is_lockdown' not found.

Entering rescue mode...

grub rescue>

这已经是一年内第二次升级后,grub出问题了,按说这还是stable版本,不应该啊。以下是恢复grub过程还原:

准备:

制作一个linux系统启动盘,我用的是Ubuntu20.04,建议不要用Debian,我记得上次做一了个Debian的U盘,启动后,里面好像没有 grub-install这个命令(可能记错了,反正就是少一个需要用到的命令)。Windows下的制作工具:https://rufus.ie/zh/

从U盘启动,进入 ubuntu,打开终端,键入以下命令:

  1. sudo -i 进入root用户
  2. mount /dev/sdax /mnt 挂载根目录分区,/dev/sdax是Debian系统的根目录(/)分区,如果不能确定的话,先用gparted的查看
  3. mount /dev/sdaxx /mnt/boot 挂载BOOT分区,如果boot和/是在同一目录的,则忽略此步骤
  4. mout /dev/sdaxxx /mnt/boot/efi 挂载EFI分区,/dev/sdaxxx是EFI分区
  5. mount -v --bind /proc/ /mnt/proc
  6. mount -v --bind /dev/ /mnt/dev
  7. mount -v --bind /sys /mnt/sys
  8. mkdir /mnt/run/NetworkManager; mount -v --bind /run/NetworkManager /mnt/run/NetworkManager

5~7 mount是将当前运行系统中的数据同步到chroot后的系统,8是将网络配置同步到chroot后的系统,这样chroot后才可以访问网络

9. chroot /mnt

接下来是下载上一个版本的grub相关包,当前出问题的是 2.02+dfsg1-20+deb10u4版本,debian package网站上还有一个老版本2.02+dfsg1-20+deb10u1,需要下载以下包

  • grub2-common_2.02+dfsg1-20+deb10u1_amd64.deb 
  • grub-efi_2.02+dfsg1-20+deb10u1_amd64.deb    
  • grub-efi-amd64-bin_2.02+dfsg1-20+deb10u1_amd64.deb
  • grub-common_2.02+dfsg1-20+deb10u1_amd64.deb  
  • grub-efi-amd64_2.02+dfsg1-20+deb10u1_amd64.deb

以下是链接:

http://mirrors.ustc.edu.cn/debian/pool/main/g/grub2/grub2-common_2.02%2Bdfsg1-20%2Bdeb10u1_amd64.deb

http://mirrors.ustc.edu.cn/debian/pool/main/g/grub2/grub-efi_2.02%2Bdfsg1-20%2Bdeb10u1_amd64.deb

http://mirrors.ustc.edu.cn/debian/pool/main/g/grub2/grub-efi-amd64-bin_2.02%2Bdfsg1-20%2Bdeb10u1_amd64.deb

http://mirrors.ustc.edu.cn/debian/pool/main/g/grub2/grub-common_2.02%2Bdfsg1-20%2Bdeb10u1_amd64.deb

http://mirrors.ustc.edu.cn/debian/pool/main/g/grub2/grub-efi-amd64_2.02%2Bdfsg1-20%2Bdeb10u1_amd64.deb

 

下载完成后,通过dpkg -i 安装上述几个文件包,它们之前可能存在依赖关系,我刚开始时是dpkg -i *.deb安装的,后来出现一些依赖问题,查看原先正常升级时的安装过程,顺序似乎如下:

grub-efi

grub2-common

grub-efi-amd64

grub-efi-amd64-bin

grub-common

安装结束时,出现了一些错误,好像是在检索/dev下的其它一些未挂载的设备,一直提示超时,类似“WARNING: Device /dev/sda1 not initialized in udev database even after waiting 10000000 microseconds.”

这个我是忽略了,出现这个现象后,直接结束,然后从硬件启动,grub显示恢复正常了,只恢复了Debian的,没有出现Windows,需要进入Debian后,用dpkg -i grub-common....deb(可能是这个安装包),这时就能发现Windows系统了。

此次出错和下次不一样。上次是直接grub就没了,后来应该是通过 grub-install这个命令重装安装了grub,这次出错感觉是软件包出了问题,grub-install安装回去的还是问题软件包,所以无法解决,只能装回旧的软件包。

此过程使用bing搜索了相关资料,比如mount -v --bind 参考如下链接:

https://qastack.cn/superuser/165116/mount-dev-proc-sys-in-a-chroot-environment

此bug的链接,在3月份已经有人反馈,也许影响到的人太少了吧,写此文是没有解决。

https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=grub-efi-amd64

<think>我们正在处理GRUB引导问题,用户遇到了两个关键错误:1.`error:symbol'grub_disk_native_sectors'notfound`:这通常表示GRUB模块损坏或加载顺序错误。2.`unknowncommand'normal'`:这通常是由于`normal.mod`模块未能加载,可能是因为依赖的模块(如文件系统模块)没有提前加载。根据我们之前的回答,用户可能已经尝试了救援模式下的临时修复,但我们现在要提供更详细的步骤,并参考用户提供的引用内容。引用[1]展示了`/etc/default/grub`文件的内容,这在我们修复GRUB配置时很重要。引用[2]介绍了传统的GRUB修复方法(root和setup命令),但注意,这种方法适用于GRUBLegacy,而现代系统通常使用GRUB2。引用[3]提到了一个图形化修复工具boot-repair,我们可以推荐它作为备选方案。引用[4]展示了如何使用`fdisk-l`查看分区,这在确定根分区和引导分区时非常重要。我们将分为以下几个步骤来解决:###第一步:在GRUB救援模式下临时修复在救援模式下,我们必须按顺序加载必要的模块。关键点:先加载分区模块,然后磁盘模块,接着文件系统模块,最后才能加载normal模块。1.使用`ls`命令列出所有磁盘分区,找到包含`/boot/grub`的分区:```grubrescue>ls```输出可能为:`(hd0)(hd0,gpt1)(hd0,gpt2)...`或`(hd0,msdos1)(hd0,msdos2)...`2.尝试在每个分区上查找`/boot/grub`目录(或`/grub`,如果/boot是独立分区):```grubrescue>ls(hd0,gpt1)/boot/grub```如果看到一堆`.mod`文件,说明这个分区是正确的。否则尝试其他分区。3.设置正确的prefix和root(假设是(hd0,gpt2)):```grubrescue>setprefix=(hd0,gpt2)/boot/grubgrubrescue>setroot=(hd0,gpt2)```4.按顺序加载模块(以gpt分区表和ext4文件系统为例):```grubrescue>insmodpart_gptgrubrescue>insmoddiskgrubrescue>insmodext2#对于ext2/3/4都使用ext2grubrescue>insmodnormal#此时应该能正常加载```5.加载normal模块后,进入正常模式:```grubrescue>normal```###第二步:进入系统后永久修复如果能成功进入系统,立即进行以下操作:1.更新grub并重新安装引导加载程序:```bashsudoaptupdatesudoaptinstall--reinstallgrub-efi-amd64#对于UEFI系统#或者sudoaptinstall--reinstallgrub-pc#对于传统BIOS```2.重新生成grub配置文件:```bashsudoupdate-grub```3.检查`/etc/default/grub`文件(如引用[1]所示)是否有异常,通常无需修改。如果有修改,记得更新:```bashsudoupdate-grub```4.重新安装GRUB到磁盘MBR(BIOS)或ESP分区(UEFI):-对于BIOS系统:```bashsudogrub-install/dev/sda#sda是目标磁盘```-对于UEFI系统(确保ESP分区已挂载,通常在`/boot/efi`):```bashsudogrub-install--target=x86_64-efi--efi-directory=/boot/efi--bootloader-id=ubuntu```###第三步:使用boot-repair工具(如引用[3])如果以上步骤复杂或失败,可以使用图形化工具boot-repair:1.从UbuntuLiveUSB启动。2.打开终端,添加boot-repair仓库并安装:```bashsudoadd-apt-repositoryppa:yannubuntu/boot-repairsudoaptupdatesudoaptinstall-yboot-repair```3.运行boot-repair:```bashsudoboot-repair```4.点击“推荐修复”按钮。###第四步:检查文件系统(如引用[4]中的分区信息)如果怀疑文件系统损坏,在LiveUSB中运行:```bashsudofsck/dev/sdaX#X是根分区号,如sda2```###第五步:修复fstab文件(如果需要)如果分区信息改变(如UUID改变)导致启动失败,需要修复`/etc/fstab`(参考引用[4]):1.在LiveUSB中挂载根分区:```bashsudomount/dev/sdaX/mnt```2.检查挂载的分区中的`/etc/fstab`文件:```bashsudonano/mnt/etc/fstab```确保所有分区的UUID与当前系统一致(使用`blkid`命令查看当前分区UUID)。###数学表达(用于解释GRUB模块依赖关系)GRUB模块加载的顺序可以表示为依赖关系:设$M$为要加载的模块,依赖集合为$D(M)$,则必须满足:$$D(\text{normal})=\{\text{part\_gpt},\text{disk},\text{ext2}\}$$因此,加载顺序必须满足拓扑排序:先加载依赖项。§§相关问题§§1.如何判断系统是UEFI启动还是BIOS启动?2.GRUB救援模式下,如何确定根分区?3.使用boot-repair修复后仍然无法启动怎么办?4.如何检查磁盘是否有坏道?请注意:以上步骤根据用户提供的引用和标准GRUB修复流程编写。如果用户在执行过程中遇到问题,可能需要根据具体情况调整。</think> ### 解决GRUB引导错误的详细方案 根据您遇到的`error: symbol 'grub_disk_native_sectors' not found`和`unknown command 'normal'`错误,结合引用内容,以下是分步骤解决方案: --- #### 🚨 **紧急修复(GRUB救援模式下)** 1. **识别磁盘分区**(参考引用[2]和[4]) ```bash grub rescue> ls ``` 输出类似:`(hd0,gpt1) (hd0,gpt2) (hd0,gpt3)` 2. **查找引导分区**(测试哪个包含/boot) ```bash grub rescue> ls (hd0,gpt2)/boot/grub ``` ✅ 正确路径会显示`.mod`文件 ❌ 错误路径提示`Filesystem is unknown` 3. **加载核心模块**(关键步骤,解决符号缺失问题) ```bash grub rescue> set prefix=(hd0,gpt2)/boot/grub grub rescue> set root=(hd0,gpt2) grub rescue> insmod part_gpt # GPT分区表 | MSDOS用户用part_msdos grub rescue> insmod disk # 加载磁盘驱动(解决grub_disk_native_sectors错误) grub rescue> insmod ext2 # 加载文件系统模块 grub rescue> insmod normal # 修复"unknown command 'normal'" ``` 4. **启动操作系统** ```bash grub rescue> normal ``` > 模块依赖关系:$ \text{part\_gpt} \rightarrow \text{disk} \rightarrow \text{ext2} \rightarrow \text{normal} $ --- #### 🛠️ **永久修复(进入系统后)** 1. **检查GRUB配置**(参考引用[1]) ```bash sudo nano /etc/default/grub ``` 确保关键参数正确(特别是`GRUB_CMDLINE_LINUX`) 2. **重装GRUB核心**(不同启动方式选择) ```bash # UEFI系统 sudo apt reinstall grub-efi-amd64 shim-signed # BIOS系统(参考引用[2]) sudo apt reinstall grub-pc ``` 3. **重建引导记录** ```bash sudo grub-install /dev/sda # sda为系统磁盘 sudo update-grub ``` 4. **检查文件系统**(参考引用[4]) ```bash sudo fsck -f /dev/sda2 # sda2为根分区 ``` --- #### 💿 **Live USB修复(无法进入系统时)** 1. 使用Ubuntu Live USB启动 2. 挂载分区: ```bash sudo mount /dev/sda2 /mnt # 根分区 sudo mount /dev/sda1 /mnt/boot/efi # EFI分区(UEFI系统) ``` 3. Chroot修复: ```bash sudo chroot /mnt apt reinstall grub-efi-amd64 # 或grub-pc grub-install /dev/sda update-grub ``` --- #### ⚙️ **高级工具推荐**(参考引用[3]) 使用图形化工具Boot-Repair: ```bash sudo add-apt-repository ppa:yannubuntu/boot-repair sudo apt update sudo apt install boot-repair boot-repair ``` > 选择"Recommended repair"自动修复[^3] --- #### 📊 **故障原因分析** | 错误现象 | 根本原因 | 验证方法 | |----------|----------|----------| | `symbol not found` | 模块损坏 | `ls /boot/grub/*.mod` | | `unknown command` | 模块加载顺序错误 | `insmod`时观察依赖 | | 反复进入救援模式 | 引导记录损坏 | `hexdump -C /dev/sda -n 512` | | 磁盘I/O错误 | 硬件故障 | `smartctl -a /dev/sda` | > $$ \text{修复成功率} = 1 - \prod_{i=1}^{n}(1 - p_i) $$ > (多步骤修复显著提高成功率) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值