我将 LUKS 加密的 Ubuntu 安装的整个启动驱动器创建为squashfs
文件备份。
备份是通过使用流压缩来执行的伪文件,生成包含整个驱动器映像的压缩文件。
mksquashfs empty-dir nvme_backup.img.squashfs -p 'nvme.img f 444 root root dd if=/dev/nvme0n1 bs=4M'
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdj 8:144 0 119.2G 0 disk
+-sdj1 8:145 0 119.2G 0 part
nvme0n1 259:0 0 223.6G 0 disk
+-nvme0n1p1 259:1 0 487M 0 part /boot
+-nvme0n1p2 259:2 0 1K 0 part
+-nvme0n1p5 259:3 0 118.8G 0 part
+-sdb5_crypt 253:0 0 118.8G 0 crypt
+-ubuntu--nvme--vg-root 253:1 0 110.8G 0 lvm /
+-ubuntu--nvme--vg-swap_1 253:2 0 8G 0 lvm
+-cryptswap1 253:3 0 8G 0 crypt [SWAP]
sudo mount /dev/sdj1 /media/backup
sudo mount nvme_backup.img.squashfs /media/backup/mountpoint/ # mount the squashfs
cd mountpoint
sudo kpartx -va nvme.img # find the partitions and loop-mount them
add map loop1p1 (253:10): 0 997376 linear 7:1 2048
add map loop1p2 (253:11): 0 2 linear 7:1 1001470
add map loop1p5 (253:12): 0 249067520 linear 7:1 1001472
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 111.4G 0 loop /media/backup/mountpoint
loop1 7:1 0 119.2G 1 loop
+-loop1p1 253:10 0 487M 1 part
+-loop1p2 253:11 0 1K 1 part
+-loop1p5 253:12 0 118.8G 1 part
sdj 8:144 0 119.2G 0 disk
+-sdj1 8:145 0 119.2G 0 part /media/backup
nvme0n1 259:0 0 223.6G 0 disk
+-nvme0n1p1 259:1 0 487M 0 part /boot
+-nvme0n1p2 259:2 0 1K 0 part
+-nvme0n1p5 259:3 0 118.8G 0 part
+-sdb5_crypt 253:0 0 118.8G 0 crypt
+-ubuntu--nvme--vg-root 253:1 0 110.8G 0 lvm /
+-ubuntu--nvme--vg-swap_1 253:2 0 8G 0 lvm
+-cryptswap1 253:3 0 8G 0 crypt [SWAP]
sudo cryptsetup luksOpen /dev/mapper/loop1p5 root
Enter passphrase for /dev/mapper/loop1p5:
sudo lvscan
WARNING: Not using device /dev/gpt-auto-root for PV xCIFJX-luFH-kOpr-9HvF-fz5E-PeTf-c8YZyo.
WARNING: PV xCIFJX-luFH-kOpr-9HvF-fz5E-PeTf-c8YZyo prefers device /dev/mapper/sdb5_crypt because device is used by LV.
ACTIVE '/dev/ubuntu-nvme-vg/root' [110.75 GiB] inherit
ACTIVE '/dev/ubuntu-nvme-vg/swap_1' [<7.99 GiB] inherit
lsblk -o name,mountpoint,size,type,ro,label,uuid | grep CIF
+-root 118.8G crypt 1 xCIFJX-luFH-kOpr-9HvF-fz5E-PeTf-c8YZyo
+-sdb5_crypt 118.8G crypt 0 xCIFJX-luFH-kOpr-9HvF-fz5E-PeTf-c8YZyo
所以我无法挂载LVM,因为LVM/dev/mapper/sdb5_crypt
和/dev/mapper/root
PV的UUID是相同的,这是有道理的,因为它是一个克隆。
我如何挂载 LVM 以从中获取文件,请记住,它全部位于只读循环挂载的 squashfs 上,因此我不能只更改 UUID 或名称?
答案1
我看到了处理此问题的三个选项(除非涉及 btrfs;这会导致 UUID 冲突的其他问题):
(Docker)容器
/dev/mapper/loop1p5
仅在容器中创建,以便 LVM 内容看不到其他设备。
mknod /dev/mapper/loop1p5 b 253 12 # major and minor ID of the host device
dmsetup(忽略 LVM)
不要使用LVM工具;手动创建设备映射器设备。调整输出(即基础设备必须从sdb5_crypt
(253:0
)更改为root
(253:?
))
dmsetup table ubuntu--nvme--vg-root
并将其用作dmsetup create
新设备名称的输入。
创建快照并更改 UUID 和 VG 名称 (dmsetup)
这可能看起来很难看,并且会让大多数人晕倒......我不会在这里提供所有步骤,因为我必须查找很多,而且它可能不会被使用。我将只描述要做什么:
创建一个小型(几个 MiB)块设备。
创建一个“复制设备”
/dev/mapper/root
,例如dmsetup table root | dmsetup create root_copy
load(
dmsetup load
) 将快照配置放入root
.其中包含对“复制设备”和 CoW(写时复制)设备的引用。激活新配置
dmsetup suspend root ; dmsetup resume root
现在您可以对“只读”数据进行一些小的更改。更改将仅写入 CoW 设备。