如何挂载两个类似的 ZFS 文件系统?

如何挂载两个类似的 ZFS 文件系统?

我有两个带有加密 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

完成!现在我可以将所有内容复制到备份驱动器并重新开始。

我发现答案是一篇在线文章这里

相关内容