(Docker)容器

(Docker)容器

我将 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/rootPV的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_crypt253:0)更改为root253:?))

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 设备。

相关内容