Linux-Kernel

從加密設備上的 LVM 引導

  • August 17, 2018

我剛剛完成了 Debian 安裝,我正在嘗試啟動。我在沒有分區的情況下加密了我的硬碟驅動器 (LUKS) 並在其上設置了 LVM。我沒有單獨的啟動卷,因此系統將從邏輯卷啟動root。我已經用 GRUB 替換了我的 BIOS,但我沒有為系統生成 GRUB 配置,所以我需要從 GRUB 手動引導。

我猜對的 GRUB shell 程式碼是這樣的:

cryptomount ahci0
set root=lvm/vg-root
linux /vmlinuz root=/dev/mapper/vg-root cryptdevice=/dev/sda
initrd /initrd.img

這是對此處給出的配置的修改,用於不同的加密 LVM 設置。

GRUB 可以很好地解密驅動器,但是當我嘗試像這樣啟動時,我得到了以下幾十次:

Begin: Running /scripts/local-block ...   WARNING: Failed to connect to lvmetad. Falling back to device scanning.
 Volume group "vg" not found
 Cannot process volume group vg
done.

然後我得到一個 initramfs shell。我懷疑核心在解密磁碟之前正在尋找根邏輯卷,因為如果我使案例如root=/dev/mapper/bogus-root. 是否有核心參數可以讓我啟動這個系統,還是我必須更改 initrd?

這可以通過使用Debian 軟體包添加/etc/crypttab到 initramfs(crypttab文件格式參見手冊頁)來解決。update-initramfs``initramfs-tools

首先,掛載加密磁碟。/dev然後將主機上的, /proc,/sys和綁定掛載/run到根文件系統中,例如mount --bind /dev /mnt/dev. 然後chroot進入根文件系統。現在可以創建 crypttab 文件(在任何位置),或在 chrooting 之前複製。

為了在 initramfs 中包含 crypttab,請在其中創建一個掛鉤腳本/usr/share/initramfs-tools/hooks,將文件複製到 initramfs 中。請注意,initramfs-tools使用兩種類型的腳本:引導腳本init在系統啟動時由 initramfs 執行,而掛鉤腳本在創建 initramfs 映像期間執行。

鉤子腳本應該看起來像這樣(source):

#!/bin/sh
. /usr/share/initramfs-tools/hook-functions
cp -pnL /path/to/crypttab ${DESTDIR}/etc/crypttab
chmod 644 ${DESTDIR}/etc/crypttab

${DESTDIR}擴展到執行鉤子時創建的 initramfs 的根目錄。

然後update-initramfs使用適當的選項執行。-k $(uname -r)因為主機和目標使用相同的核心版本,所以我使用了。我還使用-c, 和-b來指定圖像的寫入位置。

安裝新映像或將其路徑傳遞給 GRUB 後,早期使用者空間應解密磁碟並映射包含的邏輯卷,然後再嘗試掛載根卷。唯一需要的核心參數是根卷路徑,例如root=/dev/mapper/vg-root.

引用自:https://unix.stackexchange.com/questions/460688