一、启动问题
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引导问题。