修復在加密硬碟裡安裝 Ubuntu 20.04 後無法開機的問題

作者: Yong-Siang Shih / Thu 16 July 2020 / 分類: Notes

LUKS, Ubuntu

問題

最近嘗試在不同的筆電上安裝 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/sda2MAPPED_NAMEsda2_crypt

筆者遇到的情況是, /media/ubuntu/disk/etc/crypttab 這個檔案不知為何並不存在,因此必須手動根據 sudo blkid 的輸出,或者直接用硬碟工具 gnome-disks 查出 LUKS_DEVLUKS_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

假設上面的指令沒錯誤訊息的話,那重新開機應該就能成功進入系統裡了,但若有錯誤訊息,就得處理一下想辦法排除。

Notebook

參考資料

Yong-Siang Shih

作者

Yong-Siang Shih

軟體工程師,機器學習科學家,開放原始碼愛好者。曾在 Appier 從事機器學習系統開發,也曾在 Google, IBM, Microsoft 擔任軟體實習生。喜好探索學習新科技。* 在 GitHub 上追蹤我

載入 Disqus 評論