前幾週,不知何故,電腦的 Grub 毀損,所以導致電腦無法開機。
搶救的原理,(1)先想辦法開機,(2)掛載原磁碟目錄進行檢查,看資料有無損毀,(3)若資料無問題,利用 chroot 原理,切回原系統,進行 grub 重建。
過程如下:
- 想辦法開機。
- 掛載原磁碟目錄進行檢查,看資料有無損毀。
- 利用 chroot 切回原系統
- 重建 grub 系統與選單。
- 完成上述工作後,卸載剛剛掛載上的所有目錄,重新開機。
可以使用安裝光碟片或是 安裝 USB ,Live CD/USB 等等,開機後,進入「Rescue」模式。
我的硬碟分割成四區,分別為:
/dev/nvme0n1p2 ==> /home
/dev/nvme0n1p3 ==> swap
/dev/nvme0n1p4 ==> /
又,我的硬碟為「固態硬碟」,採用 Btrfs 檔案系統的次磁碟區(subvolume)結構,因此會以 @ 開頭的次磁碟區來區分根目錄和家目錄。
可用以下方法來確認根目錄次磁碟區名稱。
sudo btrfs subvolume list /dev/nvme0n1p4
如果結果顯示 @rootfs,則證明根目錄次磁碟區名稱是 @rootfs。
確認根目錄後,在救援系統裡找個目錄,例如 /mnt ,在其底下目錄下建個空的目錄,再將原硬碟根目錄掛載上來,此時可以考慮用磁區名稱來命名,以免掛載上來時,搞混了。所以:
## /dev/nvme0n1p4 為 根目錄
sudo mount -o subvol=@rootfs /dev/nvme0n1p4 /mnt/nvme0n1p4
## /dev/nvme0n1p2 為 /boot/efi ,所以要掛載到 /mnt/nvme0n1p4/boot/efi
sudo mount -o subvol=@rootfs /dev/nvme0n1p1 /mnt/nvme0n1p4/boot/efi
因為要利用 chroot 來切換回原來系統,所以要掛載必要檔案系統,再 chroot 過去:
sudo mount –bind /dev /mnt/nvme0n1p4/dev
sudo mount –bind /proc /mnt/nvme0n1p4/proc
sudo mount –bind /sys /mnt/nvme0n1p4/sys
##再chroot 過去原系統
sudo chroot /mnt/nvme0n1p4
grub-install –target=x86_64-efi –efi-directory=/boot/efi –bootloader-id=debian
##更新 GRUB 配置文件,讓它能偵測到系統核心。
update-grub