一、啟動問題
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引導問題。
原創文章,作者:KTSKM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333514.html