一、啟動(dòng)問(wèn)題1、如果你的計(jì)算機(jī)在開(kāi)機(jī)后直接進(jìn)入grub rescue模式,可能需要查看grub的環(huán)境變量和掛載點(diǎn)等信息,并且重新安裝grub。 set命令可以查看當(dāng)前grub環(huán)境的變量值:
set
# 正常grub menu界面將顯示類(lèi)似下面的信息
prefix=(hd0,gpt2)/boot/grub
root=hd0,gpt2
... 2、如果grub menu界面可以出現(xiàn),但是無(wú)法正常啟動(dòng)Linux操作系統(tǒng),可能是因?yàn)間rub配置文件(如/boot/grub/grub.cfg)被刪除或損壞。解決辦法是進(jìn)入grub命令行模式,查看當(dāng)前grub菜單中的各項(xiàng)設(shè)置。 # 進(jìn)入grub命令行模式 grub> # 查看grub菜單 cat (hd0,gpt2)/boot/grub/grub.cfg # 輸出grub內(nèi)容,并檢查各項(xiàng)設(shè)置是否正確。 3、如果進(jìn)入grub的menu之后,找不到正確的選項(xiàng)來(lái)啟動(dòng)Linux系統(tǒng),可能需要手動(dòng)添加一些啟動(dòng)菜單。這時(shí)可以使用grub-mkconfig或手動(dòng)編輯grub配置文件。 # 使用grub-mkconfig自動(dòng)生成grub menu
grub-mkconfig -o /boot/grub/grub.cfg
# 手動(dòng)編輯grub.cfg,添加啟動(dòng)菜單(下面是示例)
menuentry 'My Linux' {
set root=(hd0,gpt2)
linux /vmlinuz root=/dev/sda2
initrd /initrd.img
} 二、分區(qū)問(wèn)題1、如果Linux的根分區(qū)發(fā)生磁盤(pán)損壞或者刪除,可能需要重新建立分區(qū)并且安裝Linux系統(tǒng)。 # 使用fdisk命令來(lái)查看當(dāng)前分區(qū)情況 sudo fdisk -l /dev/sda # 新建一個(gè)主分區(qū) sudo fdisk /dev/sda n # 創(chuàng)建新的分區(qū) p # 創(chuàng)建一個(gè)主分區(qū) # 選擇分區(qū)起始和結(jié)束的扇區(qū)(按回車(chē)鍵表示使用默認(rèn)值) w # 保存并退出 # 格式化剛才新建的分區(qū) sudo mkfs.ext4 /dev/sda3 # 掛載分區(qū)到/mnt下 sudo mount /dev/sda3 /mnt # 將當(dāng)前系統(tǒng)的文件拷貝到新分區(qū) sudo cp -ax / /mnt # 更新新分區(qū)的fstab文件 sudo nano /mnt/etc/fstab # 在fstab中加入下面這行 UUID=3fdda0dd-6bef-4bab-9bef-4d8edaaa5aac / ext4 errors=remount-ro 0 1 2、如果Linux系統(tǒng)的根分區(qū)尚未損壞或刪除,但是grub引導(dǎo)信息不正確,可能需要修改grub引導(dǎo)信息之后重新安裝grub。 # 找到當(dāng)前系統(tǒng)的根分區(qū),假設(shè)為/dev/sda2
# 掛載該分區(qū)到/mnt下
sudo mount /dev/sda2 /mnt
# 掛載/boot分區(qū)(如果有的話(huà))
sudo mount /dev/sda1 /mnt/boot
# 掛載虛擬文件系統(tǒng)到/mnt下
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
# 進(jìn)入/mnt下的Linux系統(tǒng),注意切換root用戶(hù)
sudo chroot /mnt
# 重新安裝grub引導(dǎo)信息
grub-install /dev/sda
# 更新grub配置
update-grub
# 退出chroot環(huán)境并卸載/mnt下的各個(gè)目錄
exit
for i in /dev/pts /dev /proc /sys /run /boot; do sudo umount /mnt$i; done
sudo umount /mnt 三、故障診斷1、如果grub引導(dǎo)信息顯示錯(cuò)誤信息,可能需要開(kāi)啟grub菜單的調(diào)試模式,或者查看grub日志文件(如/var/log/grub.log)來(lái)顯示更多詳細(xì)信息。 # 開(kāi)啟grub調(diào)試模式 grub> set debug=all # 新建啟動(dòng)菜單,選擇調(diào)試模式 menuentry 'Debugging my Linux' { set root=(hd0,gpt2) linux /vmlinuz root=/dev/sda2 debug initrd /initrd.img } # 重啟計(jì)算機(jī),選擇該菜單后,即可顯示grub調(diào)試信息 2、如果Linux系統(tǒng)啟動(dòng)后,發(fā)現(xiàn)各種問(wèn)題,可能需要進(jìn)入單用戶(hù)模式(也稱(chēng)緊急模式)進(jìn)行故障診斷。 # 進(jìn)入grub菜單,選擇要進(jìn)入的Linux啟動(dòng)菜單,按e鍵進(jìn)入編輯模式
# 找到以“l(fā)inux”開(kāi)頭的一行,末尾加入“single”或“emergency”,如下所示
linux /vmlinuz root=/dev/sda2 single
# 按Ctrl+X或F10進(jìn)入單用戶(hù)模式
# 進(jìn)入之后,可以檢查文件系統(tǒng)、日志文件、網(wǎng)絡(luò)配置等 四、安全機(jī)制1、為了防止grub和Linux系統(tǒng)被未經(jīng)授權(quán)的用戶(hù)或程序篡改,可以通過(guò)以下辦法加強(qiáng)系統(tǒng)的安全性: # 給grub.cfg加密并且保護(hù) # 安裝grub-mkstandalone sudo apt install grub-efi-amd64-bin # 生成一個(gè)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 # 移動(dòng)已有的grub.efi文件 sudo mv /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/ubuntu/grubx64.efi.bak # 移動(dòng)新生成的grub.efi文件 sudo mv grub.efi /boot/efi/EFI/ubuntu/grubx64.efi 2、另外,還可以設(shè)置Linux系統(tǒng)的boot loader鎖,使得只能使用密鑰來(lái)啟動(dòng)Linux系統(tǒng),防止系統(tǒng)被非法篡改。 # 安裝mokutil工具
sudo apt-get install mokutil
# 創(chuàng)建一個(gè)私鑰
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
# 重啟計(jì)算機(jī),進(jìn)入U(xiǎn)EFI界面,選擇“MOK management”,導(dǎo)入秘鑰
# 重啟,之后再次安裝grub-efi-amd64-signed,這樣只有使用秘鑰才能啟動(dòng)Linux系統(tǒng)
sudo apt-get install grub-efi-amd64-signed 五、總結(jié)本文介紹了如何修復(fù)Linux系統(tǒng)的grub引導(dǎo)問(wèn)題,包括啟動(dòng)問(wèn)題、分區(qū)問(wèn)題、故障診斷和安全機(jī)制等方面。通過(guò)本文的指引和代碼示例,希望讀者能夠更好地理解Linux系統(tǒng)的grub引導(dǎo)工作原理,并且掌握一些實(shí)用的技巧,使得我們?cè)贚inux系統(tǒng)的日常運(yùn)維工作中能夠快速而準(zhǔn)確地解決grub引導(dǎo)問(wèn)題。 |
|