問題
最近嘗試在不同的筆電上安裝 Ubuntu 20.04,發現如果選擇使用 LUKS 加密整個硬碟然後再把 Ubuntu 裝在裡頭的話,似乎有的時候會導致安裝好的 Ubuntu 無法開機。雖然不是很確定觸發的理由為何以及解法的原理為何,但也遇到了兩次了,於是便決定順手把解法紀錄下來以免之後又再遇到。
問題大概如下:在開機的時候,無法成功進入 Ubuntu,而會進入 BusyBox,並顯示類似下面的畫面:
BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash)
Enter 'help' for a list of built-in commands.
(initramfs)
此時輸入 exit
之後就會顯示錯誤的理由,而理由是無法找到某個 /dev/mapper/MAPPED_NAME
檔案,或者是無法找到某個 UUID=LUKS_UUID
的磁區。具體的訊息忘了記錄下來。
解法
首先利用 Ubuntu 安裝 usb disk 或光碟開機。然後記得要連上網路才有辦法完成修復。
接著利用磁碟工具 gnome-disks
將加密磁區裡頭的 root filesystem 掛載起來,比如說如果掛載在 /media/ubuntu/disk
的話,那檢查這個加密檔案系統裡頭的 /media/ubuntu/disk/etc/fstab
和 /media/ubuntu/disk/etc/crypttab
兩個檔案 。理論上 /media/ubuntu/disk/etc/fstab
裡頭應該要有以下一行:
/dev/mapper/MAPPED_NAME / ext4 errors=remount-ro 0 1
而 /media/ubuntu/disk/etc/crypttab
裡頭應該要有下面這行:
MAPPED_NAME UUID=LUKS_UUID none luks,discard
其中,兩者的 MAPPED_NAME
應該要一樣,而 LUKS_UUID
應該要等於用來安裝 Ubuntu 的那個 LUKS 磁區的 UUID,也就是如果執行 sudo blkid
的話,應該會看到一行是:
/dev/LUKS_DEV: UUID="LUKS_UUID" TYPE="crypto_LUKS" PARTUUID="..."
而在這個 /dev/LUKS_DEV
的 LUKS 磁區底下有個用來安裝 Ubuntu 的 file system。
比如說有可能 /dev/LUKS_DEV
是 /dev/sda2
而 MAPPED_NAME
是 sda2_crypt
。
筆者遇到的情況是, /media/ubuntu/disk/etc/crypttab
這個檔案不知為何並不存在,因此必須手動根據 sudo blkid
的輸出,或者直接用硬碟工具 gnome-disks
查出 LUKS_DEV
和 LUKS_UUID
自行製造出 /media/ubuntu/disk/etc/crypttab
。
這麼做了以後,因為我們要參照 /media/ubuntu/disk/etc/crypttab,fsttab
裡的內容來重新掛載加密硬碟,所以先用磁碟工具把加密磁區卸除掛載。然後開始執行以下一連串指令:
# 手動掛載 LUKS 磁區,這裡的 `LUKS_DEV` 和 `MAPPED_NAME` 須跟 `.../etc/crypttab` 裡頭的一致。
sudo cryptsetup luksOpen /dev/LUKS_DEV MAPPED_NAME
sudo vgchange -ay
# 將安裝後系統的根目錄掛在 `/mnt` 底下,這裡的 `MAPPED_NAME` 要跟 `.../etc/fstab,crypttab` 裡頭的一致。
sudo mount /dev/mapper/MAPPED_NAME /mnt
# 這裡的 `BOOT_DEV` 要選安裝後的系統裡用來掛載 `/boot` 的磁區。
sudo mount /dev/BOOT_DEV /mnt/boot
sudo mount -t proc proc /mnt/proc
sudo mount -o bind /dev /mnt/dev
# 把這個複製進去,等等我們才能用網路
sudo cp /etc/resolv.conf /mnt/etc/resolv.conf
# 假裝我們的根目錄其實是 `/mnt`
sudo chroot /mnt
sudo apt install lvm2 cryptsetup-initramfs cryptsetup-run
sudo mount -t sysfs sys /sys
sudo update-initramfs -c -k all
假設上面的指令沒錯誤訊息的話,那重新開機應該就能成功進入系統裡了,但若有錯誤訊息,就得處理一下想辦法排除。