Btrfs

我想要多個提示來解密包含根文件系統的多個硬碟

  • September 14, 2017

我正在執行具有以下硬碟配置的 Ubuntu 16.04 系統:

  1. 1 個硬碟驅動器,我將其命名為 /dev/sda。/dev/sda 有 3 個分區用於以下目的:

  2. /dev/sda1 用於 EFI 系統分區。

  3. /dev/sda2 用於 /boot 分區。

  4. /dev/sda3 用於儲存加密卷,使用 LUKS 加密。

  5. 我將把解密後的 /dev/sda3 設備稱為 /dev/sda3_crypt。/dev/sda3_crypt 中有一個 LVM 配置。LVM 配置包含一個名為“alexmini”的捲組。alexmini 卷組包含以下邏輯捲和文件系統:

  6. 包含 btrfs 文件系統的 /dev/mapper/alexmini-vg–root 邏輯卷。

  7. 用於交換空間的 /dev/mapper/alexmini-vg–swap 邏輯卷。

  8. 我有第二個硬碟驅動器,名為 /dev/sdb。/dev/sdb 包含 1 個名為 /dev/sdb1 的分區。/dev/sdb1 也是使用 LUKS 的加密設備。我將呼叫解密的設備 /dev/sdb1_crypt。/dev/sdb1_crypt 包含一個 btrfs 文件系統。/dev/sdb1_crypt 添加到 /dev/mapper/alexmini-vg–root btrfs 卷池。

  9. btrfs 文件系統也是我的根文件系統。

當我從上面指定的配置執行 update-initramfs 時,我預計 cryptsetup initramfs 啟動腳本會解密 /dev/sda3 和 /dev/sdb1,但腳本只解密 /dev/sda3,這只會導致部分btrfs 卷池可用。我最終進入了 initramfs “恢復”模式。

如何配置 update-initramfs 以便 cryptsetup 引導腳本將提示我兩次解密我的硬碟,一次用於 /dev/sda3,一次用於 /dev/sdb1?

好的,我想通了,我得到了它的工作。我花了一些時間研究/usr/share/initramfs-tools/hooks. 此目錄包含在執行 update-initramfs 時執行的腳本。特別是,如果安裝了cryptsetup,在這個目錄下會有一個cryptroot腳本,這是我研究的一個腳本,用來尋找如何在啟動時解密磁碟的線索。

在啟動時載入 initramfs 時,有一個腳本將解密名為 conf/conf.d/cryptroot 的文件中列出的硬碟分區。該文件位於 initramfs 存檔中,您可以通過使用以下命令解壓縮存檔來探索它:

$ sudo cp /boot/initrd.img-4.4.0-93-generic ~
$ cd
$ # use sudo chown to change the ownership of the initramfs file to the current user
$ mv initrd.img-4.4.0-93-generic initrd.img-4.4.0-93-generic.gz
$ gunzip initrd.img-4.4.0-93-generic.gz
$ mkdir -p tmp && cd tmp
$ cpio -i < ../initrd.img-4.4.0-93-generic

通常,conf/conf.d/cryptroot只會列出包含您的根文件系統的分區以進行解密。如果您的根文件系統跨越多個加密分區,例如 btrfs 文件系統或位於 LVM 邏輯卷中的文件系統,您將無法在啟動時正確掛載文件系統,因為只有一個加密分區會被解密。我們需要的是在掛載之前解密**所有的備份分區。**列出的加密分區conf/conf.d/cryptroot是在您建構 initramfs 存檔時確定的。

當您建構 initramfs 映像時,cryptroot腳本會掃描哪些分區包含您的根文件系統。對於 btrfs 文件系統,cryptroot 將執行 btrfs 命令來查詢支持文件系統的分區。但是,並非從查詢返回的所有分區都將添加到 conf/conf.d/cryptroot。**只有在 /etc/crypttab 中列出的查詢分區才會被添加到 conf/conf.d/cryptroot。**我的解決方案是為支持我的根文件系統到 /etc/crypttab 的第二個加密分區添加一個條目。

我生成的 /etc/crypttab 文件如下所示:

sda3_crypt UUID=<my UUID for /dev/sda3> none luks,discard
sdb1_crypt UUID=<my UUID for /dev/sdb1> none luks

之後,您想執行update-initramfs以生成新的 initramfs,它將在 conf/conf.d/cryptroot 中包含 sda3_crypt 和 sdb1_crypt 的條目。這將導致解密腳本在啟動時提示您輸入密碼兩次:一次用於 sda3_crypt,另一次用於 sdb1_crypt。

**TL;DR:**確保支持根文件系統的所有分區都包含/etc/crypttab. update-initramfs更新後執行/etc/crypttab

旁注:每當update-grub跨多個設備執行 btrfs 文件系統時,它都不會正確生成核心命令行。https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1238347中給出了一個快速的解決方法

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