您的位置:

Linux Grub引导修复指南

一、启动问题

1、如果你的计算机在开机后直接进入grub rescue模式,可能需要查看grub的环境变量和挂载点等信息,并且重新安装grub。

set命令可以查看当前grub环境的变量值:
set
# 正常grub menu界面将显示类似下面的信息
prefix=(hd0,gpt2)/boot/grub
root=hd0,gpt2
...

2、如果grub menu界面可以出现,但是无法正常启动Linux操作系统,可能是因为grub配置文件(如/boot/grub/grub.cfg)被删除或损坏。解决办法是进入grub命令行模式,查看当前grub菜单中的各项设置。

# 进入grub命令行模式
grub>
# 查看grub菜单
cat (hd0,gpt2)/boot/grub/grub.cfg
# 输出grub内容,并检查各项设置是否正确。

3、如果进入grub的menu之后,找不到正确的选项来启动Linux系统,可能需要手动添加一些启动菜单。这时可以使用grub-mkconfig或手动编辑grub配置文件。

# 使用grub-mkconfig自动生成grub menu
grub-mkconfig -o /boot/grub/grub.cfg
# 手动编辑grub.cfg,添加启动菜单(下面是示例)
menuentry "My Linux" {
    set root=(hd0,gpt2)
    linux /vmlinuz root=/dev/sda2
    initrd /initrd.img
}

二、分区问题

1、如果Linux的根分区发生磁盘损坏或者删除,可能需要重新建立分区并且安装Linux系统。

# 使用fdisk命令来查看当前分区情况
sudo fdisk -l /dev/sda
# 新建一个主分区
sudo fdisk /dev/sda
n # 创建新的分区
p # 创建一个主分区
# 选择分区起始和结束的扇区(按回车键表示使用默认值)
w # 保存并退出
# 格式化刚才新建的分区
sudo mkfs.ext4 /dev/sda3
# 挂载分区到/mnt下
sudo mount /dev/sda3 /mnt
# 将当前系统的文件拷贝到新分区
sudo cp -ax / /mnt
# 更新新分区的fstab文件
sudo nano /mnt/etc/fstab
# 在fstab中加入下面这行
UUID=3fdda0dd-6bef-4bab-9bef-4d8edaaa5aac / ext4 errors=remount-ro 0 1

2、如果Linux系统的根分区尚未损坏或删除,但是grub引导信息不正确,可能需要修改grub引导信息之后重新安装grub。

# 找到当前系统的根分区,假设为/dev/sda2
# 挂载该分区到/mnt下
sudo mount /dev/sda2 /mnt
# 挂载/boot分区(如果有的话)
sudo mount /dev/sda1 /mnt/boot
# 挂载虚拟文件系统到/mnt下
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
# 进入/mnt下的Linux系统,注意切换root用户
sudo chroot /mnt
# 重新安装grub引导信息
grub-install /dev/sda
# 更新grub配置
update-grub
# 退出chroot环境并卸载/mnt下的各个目录
exit
for i in /dev/pts /dev /proc /sys /run /boot; do sudo umount /mnt$i; done
sudo umount /mnt

三、故障诊断

1、如果grub引导信息显示错误信息,可能需要开启grub菜单的调试模式,或者查看grub日志文件(如/var/log/grub.log)来显示更多详细信息。

# 开启grub调试模式
grub> set debug=all
# 新建启动菜单,选择调试模式
menuentry "Debugging my Linux" {
    set root=(hd0,gpt2)
    linux /vmlinuz root=/dev/sda2 debug
    initrd /initrd.img
}
# 重启计算机,选择该菜单后,即可显示grub调试信息

2、如果Linux系统启动后,发现各种问题,可能需要进入单用户模式(也称紧急模式)进行故障诊断。

# 进入grub菜单,选择要进入的Linux启动菜单,按e键进入编辑模式
# 找到以“linux”开头的一行,末尾加入“single”或“emergency”,如下所示
linux /vmlinuz root=/dev/sda2 single
# 按Ctrl+X或F10进入单用户模式
# 进入之后,可以检查文件系统、日志文件、网络配置等

四、安全机制

1、为了防止grub和Linux系统被未经授权的用户或程序篡改,可以通过以下办法加强系统的安全性:

# 给grub.cfg加密并且保护
# 安装grub-mkstandalone
sudo apt install grub-efi-amd64-bin
# 生成一个grub密码,比如mypassword
echo -e "mypassword\nmypassword" | sudo grub-mkpasswd-pbkdf2 | grep 'PBKDF2' | awk -F " " '{print "set superusers=“root\npassword_pbkdf2 root " $NF}' | sudo tee -a /etc/grub.d/40_custom
# 生成加密后的grub.cfg文件
sudo grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --fonts="unicode" --themes="default" -o grub.efi /boot/grub/grub.cfg
# 移动已有的grub.efi文件
sudo mv /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/ubuntu/grubx64.efi.bak
# 移动新生成的grub.efi文件
sudo mv grub.efi /boot/efi/EFI/ubuntu/grubx64.efi

2、另外,还可以设置Linux系统的boot loader锁,使得只能使用密钥来启动Linux系统,防止系统被非法篡改。

# 安装mokutil工具
sudo apt-get install mokutil
# 创建一个私钥
sudo openssl req -new -x509 -newkey rsa:2048 -keyout ₹(id -un)-$(hostname -s).key  -outform DER -out ₹(id -un)-$(hostname -s).der -days 36500 -nodes -subj "/CN=$(hostname)"
# 上传该密钥到Linux MOK中,并且输入密码
sudo mokutil --import ₹(id -un)-$(hostname -s).der
# 重启计算机,进入UEFI界面,选择“MOK management”,导入秘钥
# 重启,之后再次安装grub-efi-amd64-signed,这样只有使用秘钥才能启动Linux系统
sudo apt-get install grub-efi-amd64-signed

五、总结

本文介绍了如何修复Linux系统的grub引导问题,包括启动问题、分区问题、故障诊断和安全机制等方面。通过本文的指引和代码示例,希望读者能够更好地理解Linux系统的grub引导工作原理,并且掌握一些实用的技巧,使得我们在Linux系统的日常运维工作中能够快速而准确地解决grub引导问题。