资讯动态

GRUB菜单加密与修复:保护引导安全与应急恢复实战

发布时间:2026/10/14 10:43:59 来源:尧图企业网站定制
做Linux运维或者自己折腾多系统引导的人多半都遇到过这两种糟心事开机后发现GRUB菜单能随便进编辑模式担心系统安全或者某天开机直接黑屏连引导菜单都看不到。今天这篇就把这两块内容放一起聊透——GRUB菜单加密和GRUB修复一个管安全一个管救急在实际生产环境里组合起来用能解决不少麻烦。先花几十秒说明白GRUB到底是什么角色。GRUB是系统启动时第一个运行的程序它负责加载内核并把控制权交给操作系统。开机看到的那张菜单列表、按e进入的编辑界面、按c进到的命令行都是GRUB的工作范围。问题在于默认情况下任何能碰到键盘的人都可以在开机时按e修改启动参数比如往内核参数里加init/bin/bash或者rd.break直接绕过登录验证拿到root权限——这个漏洞比想象的严重。反过来一旦GRUB损坏比如Windows更新覆盖了引导、磁盘分区方式改动导致UUID失效、或者grub.cfg被写坏系统就彻底进不去这时候会修GRUB就是必须掌握的保命技能了。下面从加密和修复两条线展开按实际操作的顺序来写。1. 内容整体设计与思路拆解做这件事之前先把需求和方案理清楚。GRUB加密的目标不是阻止开机而是保护启动过程不被未授权的人干扰。很多初学的人有一个误解以为设置GRUB密码之后开机就必须输密码才能进系统其实不是这样。GRUB密码的默认作用是限制进入编辑模式和命令行模式而正常的启动菜单项选择不受影响。也就是说日常开机还是老样子按一下回车就直接进了系统但如果有人想按e改参数、按c进命令行就会提示输入用户名和密码。这个设计思路很合理。如果每次开机都要求输密码双系统或者频繁重启的服务器会非常烦人而且密码一旦泄漏等于没有防护。把防护的重点放在“修改启动参数”和“进入命令行”这两个高风险操作上既不打扰日常使用又能堵住最危险的入口。生产环境的服务器尤其推荐开启因为服务器通常不关“键盘前的人”这个风险面同事误操作、机房维护人员顺手改个内核参数都可能造成不可控的问题。GRUB修复的场景拆解也很清晰。大概能分成三大类引导程序本身损坏GRUB文件丢失或者写入了错误的磁盘区域配置文件出错比如/etc/default/grub里的内核参数写错、磁盘UUID对不上磁盘分区变化比如用分区工具调整过分区、删过或新增过分区导致原来的GRUB配置失效修复的核心思想就一句话用外部启动介质U盘或Live CD进入一个最小化的Linux系统挂载原系统的分区然后重新安装GRUB并重新生成配置。凡是涉及“系统起不来”的问题都绕不开这个基本套路。后面详细拆每一步。为什么要优先考虑chroot方式而不是直接用启动盘里的工具因为直接改有时候不彻底。挂载原系统分区后如果不chroot很多修复命令会默认操作启动盘的环境导致GRUB装不到该去的位置配置文件的生成也可能因为检测不到原始系统环境而失败。chroot的作用是把当前修复环境切换到原系统的磁盘分区内让所有命令都像是原系统自己运行的一样这样生成出来的grub.cfg才能准确对应原系统的实际情况。2. 核心细节解析与实操要点2.1 GRUB加密的本质原理GRUB加密机制由两个核心要素构成superusers超级用户在配置文件里用set superusers用户名定义用户密码哈希格式是一长串grub.pbkdf2.sha512...的散列值这两个要素缺一不可。只设置了用户账号但没定义superusers密码形同虚设只定义了superusers但没给用户设置密码哈希GRUB会直接拒绝所有操作。因为superusers代表最高权限必须绑定一个可验证的密码。grub2-setpassword这个命令是生成密码的官方途径。它做的事情本质上就是向用户询问密码两次以确认然后生成PBKDF2哈希字符串追加写入/etc/grub.d/01_users这个配置片段文件。如果该文件不存在命令会顺便创建。执行完毕后需要运行grub2-mkconfig -o /boot/grub2/grub.cfg重新生成主配置把新密码配置实际生效。手动配置方式也完全可行。在/etc/grub.d/01_users里写入类似这样的内容set superusersadmin password_pbkdf2 admin grub.pbkdf2.sha512.10000.XXXXXXXXXXXXXXXX...哈希串从哪里来可以用grub2-mkpasswd-pbkdf2命令生成。交互输入密码两次后终端输出很长一串哈希值把它复制到配置文件中即可。这里的10000是PBKDF2的迭代次数GRUB默认使用这个值安全性足够。这个命令本质上和grub2-setpassword生成哈希的逻辑一致只是要手动写入配置文件灵活度更高。有一点值得特别强调密码保护对恢复模式不生效。比如通过Live USB启动系统后可以直接挂载分区修改文件此时GRUB密码只是“进入GRUB命令行界面”的锁不是整个磁盘的加密锁。如果系统里有需要严格保密的数据GRUB密码只是第一层真正的数据加密需要依赖LUKS这类全盘加密方案。明白这一点就不会对GRUB密码的防护范围产生不切实际的期待。2.2 GRUB修复的两种引导模式差异做GRUB修复前必须先确认机器是BIOS引导还是UEFI引导。这个判断直接决定安装GRUB时命令不同BIOS/LEGACY模式grub-install /dev/sda安装目标是整块磁盘/dev/sdaGRUB会把启动代码写入磁盘的MBR区域。UEFI模式grub-install --targetx86_64-efi --efi-directory/boot/efi安装目标是EFI系统分区ESP分区通常挂载在/boot/efi或者/boot。GRUB会在ESP分区里生成grubx64.efi引导文件并在NVRAM启动项列表里注册引导记录。判断方法不复杂开机时进BIOS设置界面看启动模式即可或者在进入Live环境后检测一下挂载原系统分区前先查看/sys/firmware/efi目录是否存在。如果存在这个目录说明当前环境是UEFI模式不存在则是BIOS模式。注意这里判断的是当前启动环境Live USB的模式不是目标系统的模式所以Live USB最好和原系统的引导模式保持一致修复起来最顺手。提示在UEFI模式下修复如果ESP分区没有挂载或者挂载位置不对grub-install会直接报错。通常需要先手动挂载ESP分区到/boot/efi。挂载命令大致是mount /dev/sda1 /boot/efi具体分区编号用lsblk查看。2.3 参数计算和过程说明修复过程中经常遇到的问题就是磁盘分区对不上。比如双系统机器磁盘划分为/dev/nvme0n1p1EFI分区、/dev/nvme0n1p2Windows系统分区、/dev/nvme0n1p3Linux根分区。要准确识别哪个分区是根分区可以用lsblk -f查看文件系统类型和UUIDNAME FSTYPE UUID nvme0n1 ├─nvme0n1p1 vfat ABCD-1234 ├─nvme0n1p2 ntfs 0123456789ABCDEF └─nvme0n1p3 ext4 abcd1234-...根分区通常是ext4或xfs格式挂载点对应系统文件根。识别之后再mount挂载。挂载的顺序有讲究。推荐先挂载根分区然后挂载/dev、/proc、/sys这三个虚拟文件系统以及EFI分区UEFI模式。命令序列如下mount /dev/nvme0n1p3 /mnt mount /dev/nvme0n1p1 /mnt/boot/efi mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys为什么必须先挂载根分区再挂载其他目录因为/dev、/proc、/sys这些目录都存在于根分区中。如果先挂载虚拟文件系统再挂根分区挂载点就会被覆盖造成目录内容不一致。这个顺序问题遇到过的人应该深有体会。绑定的--bind参数本质上是把当前Live环境的/dev等目录镜像到原系统的/mnt/dev位置让chroot环境内的程序能正常访问设备节点和内核接口。没有这一步chroot后会看不到磁盘设备后续的grub-install可能找不到盘。接着chroot /mnt进入原系统环境。chroot之后/dev/sda、/etc/default/grub等路径都指向原系统操作起来和平时直接操作原系统没区别。修复完成后exit退出chroot环境再umount卸载所有挂载点。卸载顺序和挂载顺序相反先卸载后挂载的最后卸载根分区。3. 实操过程与核心环节实现3.1 为GRUB菜单加密的完整流程场景设定一台CentOS/RHEL系列服务器BIOS引导需要给GRUB菜单设置密码保护同时不影响正常开机。第一步确认当前GRUB版本。运行grub2-install --version看版本号通常是2.02或2.06等。不同大版本的配置路径略有差异但这套流程基本通用。第二步生成密码哈希grub2-mkpasswd-pbkdf2输入两次密码后得到类似这样的输出伪装示例Your PBKDF2 password is grub.pbkdf2.sha512.10000.9F3D...A1B2建议把这个哈希串复制保存到临时文本文件后面用得上。第三步创建或编辑/etc/grub.d/01_usersvi /etc/grub.d/01_users写入内容set superusersadmin export superusers password_pbkdf2 admin grub.pbkdf2.sha512.10000.9F3D...A1B2保存退出。这里注意文件权限chmod 600 /etc/grub.d/01_usersGRUB配置生成时会读取这个文件普通用户不该看到密码哈希。第四步重新生成GRUB配置grub2-mkconfig -o /boot/grub2/grub.cfg看到输出中出现类似Found linux image这样的信息说明配置生成成功。重启机器验证正常人开机直接回车可以进系统按e尝试编辑菜单项会弹出用户密码验证提示。如果想要更严格的策略比如所有菜单项都需要密码才能启动可以在/etc/grub.d/01_users中追加export superusers menuentry xxx --unrestricted { ... }不过默认策略仅保护编辑和命令行已经满足绝大多数场景不建议轻易改动避免记住密码的人才能开机导致麻烦。有一个隐藏坑需要提醒如果服务器是UEFI引导重新生成配置后的文件路径可能是/boot/efi/EFI/...下对应的grub.cfg地址。CentOS/RHEL里grub2-mkconfig的输出目标要和实际引导路径一致否则配置不会生效。一个判断办法是执行后注意输出最后几行看它声称写入的路径如果和实际不符手动复制覆盖。3.2 GRUB加密后的行为验证重启进入GRUB菜单界面后有几个操作建议都验证一遍直接按回车——应当正常启动系统不要求输密码按e——出现登录提示输入错误密码会重新提示或退回菜单在编辑界面按c进入命令行——同样要求密码在GRUB菜单界面按c命令行入口——也要求密码这个验证很关键因为有时候配置写得不严谨可能出现“按e不要求密码”或者“直接启动也要密码”的相反情况。排除这两个问题的方法通常都是回到/etc/grub.d/01_users检查语法。注意看export superusers这一行缺少这个导出指令有时会导致部分版本的GRUB行为异常。3.3 修复GRUB的通用LIVE介质流程场景设定一台双系统的笔记本Windows系统更新后重启GRUB菜单直接消失只有Windows引导管理器出现或者黑屏提示Grub Rescue。需要修复Linux引导。准备一个Ubuntu Live USB启动盘。启动后选择“试用Ubuntu”而不是安装系统进入桌面打开终端。第一步确认磁盘布局lsblk -f假设输出显示/dev/sda1EFI分区vfat/dev/sda2Windows系统分区ntfs/dev/sda3Linux根分区ext4第二步挂载根分区和虚拟文件系统UEFI模式示例sudo mount /dev/sda3 /mnt sudo mount /dev/sda1 /mnt/boot/efi sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys第三步chroot并修复sudo chroot /mnt grub-install --targetx86_64-efi --efi-directory/boot/efi --bootloader-idGRUB update-grub如果机器是BIOS引导第二条命令换成grub-install /dev/sda update-grub最后退出并重启exit sudo umount /mnt/dev /mnt/proc /mnt/sys /mnt/boot/efi /mnt sudo reboot重启后GRUB菜单应该恢复。怎么分辨Bootloader-ID是不是原来的如果原系统刷过自定义引导名未必叫GRUB。无妨重新刷一个GRUB或者随便取个名只要能从菜单里选到Linux和Windows即可。如果BIOS的启动菜单里出现两个GRUB条目把旧的删掉或者从BIOS设置里调整优先级即可。4. 常见问题与排查技巧实录4.1 修改/etc/default/grub导致无法启动这个坑很典型。比如在/etc/default/grub里加了内核启动参数结果参数写错比如多打了空格或者语法不对执行update-grub之后重启系统卡在内核加载阶段连紧急模式都进不去。排查思路用Live USB挂载原系统然后进入chroot环境编辑/etc/default/grub把可疑参数改回正常值再重新执行update-grub。如果没有Live USB在手边也可以在GRUB菜单界面按e临时修改内核参数行把错误的参数删掉再启动系统。这个方法能应急进系统但不会改动生成的grub.cfg所以修复后一定要进系统重新生成配置。注意紧急模式下进不了系统不代表文件损坏大多数情况就是内核参数写错了。优先检查GRUB_CMDLINE_LINUX这一行的内容这是故障高发区。4.2 密码忘了如何解除GRUB密码如果设置了GRUB密码但忘记了需要解除。方法是利用Live USB进入系统然后清除或重置密码配置。挂载根分区后chroot进系统mount /dev/sda3 /mnt mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys chroot /mnt进入chroot后把/etc/grub.d/01_users文件清空或者删除然后重新生成配置rm -f /etc/grub.d/01_users grub2-mkconfig -o /boot/grub2/grub.cfg # CentOS/RHEL系 update-grub # Debian/Ubuntu系这样密码就被解除了。如果想重置新密码用grub2-mkpasswd-pbkdf2生成新哈希并重新写入01_users文件即可。这个操作可以直接在chroot环境里完成不需要重新进系统。4.3 BIOS/UEFI双系统修复中的分区对不上排查时最常见的问题是grub-install提示找不到设备或EFI分区。很多人挂载了根分区就急着执行命令结果报错EFI variables are not supported on this system。这个报错的根源大多是缺少EFI变量支持。Live USB默认没有加载efivarfs需要手动挂载mount -t efivarfs efivarfs /sys/firmware/efi/efivars这个步骤要在chroot之前执行。如果在chroot环境里执行会因为没有系统目录权限而失败。一个稳妥的顺序是挂载根分区和EFI分区后、绑定虚拟文件系统之前先挂载efivarfs到当前Live环境的对应位置。然后chroot再执行grub-install。如果依然报错检查/mnt/boot/efi目录下是否有内容。如果挂载到的是空目录很可能EFI分区根本没挂对用lsblk -f再确认一遍分区号和文件系统类型。4.4 GRUB Rescue模式救援开机显示GRUB Rescue提示符通常是GRUB核心文件损坏或者找不到启动分区。这是GRUB修复中比较麻烦的一种情况因为系统没能加载到菜单阶段只能在rescue命令行里处理。在rescue提示符下输入ls会列出GRUB能识别的磁盘分区(hd0) (hd0,gpt1) (hd0,gpt2) ...先用ls (hd0,gpt3)/试探哪个分区是根分区确认后设置root变量并加载正常模块set root(hd0,gpt3) insmod normal normal如果这个命令成功进入菜单说明只是模块路径没找对可以进入系统后重新执行update-grub修好。如果insmod normal报错说明GRUB安装损坏只能借助Live USB进行完整重装GRUB。GRUB rescue模式里面没有完整的功能模块很多命令不可用不用浪费太多时间尝试尽早转Live USB流程更省事。4.5 修复WinLinux双系统时菜单里没有Windows项重新生成GRUB配置后菜单里只剩LinuxWindows系统消失了。这是os-prober没有检测到Windows分区导致的。检查/dev/sda2那个ntfs分区是否正常可读。在chroot环境里跑一下os-prober如果输出里有Windows相关条目说明检测正常执行grub2-mkconfig或update-grub重新生成即可。如果没有输出可能是os-prober未安装Debian系执行apt install os-proberCentOS系执行yum install os-prober也可能是ntfs分区处于休眠状态Windows快速启动功能会让分区标记为不可读。这种情况直接重启进入Windows一次然后正常关机再回Live环境重新生成配置通常能解决。5. 实操中的避坑经验与个人体会GRUB加密和修复看起来简单真正上手往往要折腾几个小时这里把踩过几次坑的教训整理成清单。第一改GRUB配置前一定要备份。cp /etc/grub.d/01_users /etc/grub.d/01_users.bak修改/etc/default/grub前也备份一份。配置生成后如果系统能正常引导不用太在意备份文件但一旦出问题备份能让你快速回滚。第二Live USB修复GRUB时尽量选择和目标系统引导模式一致的方式启动。UEFI机器就用UEFI模式的Live USBBIOS机器就用BIOS模式的Live USB。混着用偶尔也能修成但会出现grub-install时提示签名校验失败或者找不到EFI目录的奇怪问题浪费大量时间排查。第三chroot环境内执行grub2-mkconfig之前确认/etc/default/grub里的配置没有明显错误。尤其是GRUB_DISABLE_OS_PROBER这一项有些系统默认把os-prober关闭了如果你需要双系统菜单必须显式改为GRUB_DISABLE_OS_PROBERfalse再生成配置。第四生产环境服务器开启GRUB密码后建议把密码记录在密码管理工具里并且至少有两个管理员知道。GRUB密码忘记虽然可以通过Live USB重置但服务器通常不在手边现场操作折腾下来业务停机时间会变得很难看。第五如果你在家里给个人电脑设置了GRUB密码又经常调整启动参数比如折腾内核、开启debug日志建议把常用操作都整理成笔记避免真需要改动时卡在密码验证环节还要翻半天资料。GRUB加密属于锦上添花的安全措施GRUB修复则是每个Linux用户迟早要面对的基本功。把这两块练熟之后遇到系统起不来的情况至少心里有底知道从哪一步开始排查不慌不乱一步步来大部分问题都能救回来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑