我有两个带有加密 ZFS 分区的驱动器:sda 和 sdd。
如何将 sda5 分区挂载到 /media/sda5 并将 sdd5 分区挂载到 /media/sdd5?
sdd 驱动器是 USB 拇指驱动器,sda 是内部驱动器。
两个驱动器均包含全新安装的 Ubunru。
sda
├─sda1
├─sda2 vfat FAT32
├─sda3 crypto_LUKS 2
├─sda4 zfs_member 5000 bpool
└─sda5 zfs_member 5000 rpool
sdd
├─sdd1
├─sdd2 vfat FAT32
├─sdd3
├─sdd4 zfs_member 5000 bpool
└─sdd5 zfs_member 5000 rpool
答案1
查找加密密钥
gdisk -l /dev/sda
Number Start (sector) End (sector) Size Code Name
1 2048 4095 1024.0 KiB EF02
2 4096 1054719 513.0 MiB EF00 EFI System Partition
3 1054720 5249023 2.0 GiB 8200
4 5249024 9443327 2.0 GiB BE00
5 9443328 488397134 228.4 GiB BF00
这些分区是由 Ubuntu 22.04 安装程序创建的。分区 1 和 2 是 EFI,分区 3 是加密交换,分区 4 和 5 是 zfs:
# blkid /dev/sda3
/dev/sda3: UUID="46081d1f-4d72-44d0-9bff-dc9ebda4f590" TYPE="crypto_LUKS" PARTUUID="4d56cb7e-69a9-2849-9c20-eb9688669b76"
# blkid /dev/sda4
/dev/sda4: LABEL="bpool" UUID="14572403564643613467" UUID_SUB="7325057841745216519" BLOCK_SIZE="4096" TYPE="zfs_member" PARTUUID="1773b78d-af63-0548-862a-8dd9f0a74800"
# blkid /dev/sda5
/dev/sda5: LABEL="rpool" UUID="6561332372469175307" UUID_SUB="3722037216287012081" BLOCK_SIZE="4096" TYPE="zfs_member" PARTUUID="2905452c-9f72-3042-b010-97663c37194c"
zfs import bpool
zfs import rpool
zpool status -v
pool: bpool
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
bpool ONLINE 0 0 0
1773b78d-af63-0548-862a-8dd9f0a74800 ONLINE 0 0 0
errors: No known data errors
pool: rpool
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
2905452c-9f72-3042-b010-97663c37194c ONLINE 0 0 0
errors: No known data errors
# zfs list -o name,type,keylocation
NAME TYPE KEYLOCATION
bpool filesystem none
bpool/BOOT filesystem none
bpool/BOOT/ubuntu_aqj46w filesystem none
rpool filesystem file:///run/keystore/rpool/system.key
rpool/ROOT filesystem none
rpool/ROOT/ubuntu_aqj46w filesystem none
rpool/ROOT/ubuntu_aqj46w/srv filesystem none
rpool/ROOT/ubuntu_aqj46w/usr filesystem none
rpool/ROOT/ubuntu_aqj46w/usr/local filesystem none
rpool/ROOT/ubuntu_aqj46w/var filesystem none
rpool/ROOT/ubuntu_aqj46w/var/games filesystem none
rpool/ROOT/ubuntu_aqj46w/var/lib filesystem none
rpool/ROOT/ubuntu_aqj46w/var/lib/AccountsService filesystem none
rpool/ROOT/ubuntu_aqj46w/var/lib/NetworkManager filesystem none
rpool/ROOT/ubuntu_aqj46w/var/lib/apt filesystem none
rpool/ROOT/ubuntu_aqj46w/var/lib/dpkg filesystem none
rpool/ROOT/ubuntu_aqj46w/var/log filesystem none
rpool/ROOT/ubuntu_aqj46w/var/mail filesystem none
rpool/ROOT/ubuntu_aqj46w/var/snap filesystem none
rpool/ROOT/ubuntu_aqj46w/var/spool filesystem none
rpool/ROOT/ubuntu_aqj46w/var/www filesystem none
rpool/USERDATA filesystem none
rpool/USERDATA/andrew_rh4h1s filesystem none
rpool/USERDATA/root_rh4h1s filesystem none
rpool/keystore volume none
从中可以看出,我已导入了两个池:bpool 和 rpool。Bpool 有一个数据集:BOOT。rpool 有三个数据集:ROOT、USERDATA 和 keystore。找到了!该 keystore 数据集听起来像是我们可能想要查看的东西。查看 rpool 的 Keylocation 参数:它包含该 keystore 字词。让我们仔细看看 keystore 数据集。它属于卷类型。这是 zfs 用于存储原始、未格式化数据的类型。来自手册:
ZFS 卷是代表块设备的数据集。ZFS 卷被标识为 /dev/zvol/{dsk,rdsk}/pool 目录中的设备。在以下示例中,创建了一个 5 GB 的 ZFS 卷 system1/vol:# zfs create -V 5gb system1/vol。更改卷大小时请务必小心。
所以也许这个数据集是一个存储 zfs 密钥的 luks 卷?
# cryptsetup luksOpen /dev/zvol/rpool/keystore keystore
Enter passphrase for /dev/zvol/rpool/keystore: (enter key used in the ubuntu installer when you created the encrypted zfs install)
# mkdir /mnt/keystore
# mount /dev/mapper/keystore /mnt/keystore/
# ls /mnt/keystore/
lost+found system.key
# hexdump /mnt/keystore/system.key
0000000 81de 1df7 a36e 6fd2 7cdf 367a 4e4a 0601
0000010 9679 0be2 7445 bbbd 853c 6f07 79fe ad28
0000020
太棒了!这看起来像是一个 512 位系统密钥。
挂载 ZFS 根
更改挂载点
我们不希望 rpool/ROOT 文件系统破坏我们的根文件系统。因此,请更改挂载点。
# mkdir /mnt/rpool
# zfs set mountpoint=/mnt/rpool rpool
回顾 rpool 的 keylocation 属性,我们知道 zfs 期望在 /run/keystore/rpool/system.key 找到解密密钥。因此,我们需要创建该子目录并将密钥移动到该位置
# mkdir -p /run/keystore/rpool
# cp /mnt/keystore/system.key //run/keystore/rpool
由于某种原因,rpool canmount 属性设置为 off。因此我们将其设置为 on,加载密钥并挂载它。
# zfs set canmount=on rpool
# zfs load-key rpool
# zfs mount rpool
# ls //mnt/rpool
什么都没有。那是因为我挂载了池,而不是数据集。我可以使用 zfs mount -a 命令快速挂载所有数据集,但这会破坏我现有的许多文件夹。回顾数据集列表,我发现此列表中的每一行都是一个挂载点,而且有很多。我只想要 USERDATA/andrew_rh4h1s 信息,所以我将挂载它。
# mkdir -p //mnt/rpool/USERDATA/andrew_rh4h1s
# zfs set mountpoint=/mnt/rpool/USERDATA/andrew_rh4h1s rpool/USERDATA/andrew_rh4h1s
# ls -ah //mnt/rpool/USERDATA/andrew_rh4h1s
完成!现在我可以将所有内容复制到备份驱动器并重新开始。
我发现答案是一篇在线文章这里。