将拆分文件映射到 /dev/loop0

Mar*_*ter 3 mount filenames files loop-device

我有一个iscsi2TB 大的磁盘。我每周都会备份那个磁盘。备份脚本将整个 iSCSI 磁盘的映像复制到我的 NFS 上的文件中。不幸的是,它不会将图像一并复制,而是将其拆分为大小为 1TB 的块。所以就我而言,我有两个 1TB 文件(加上一个配置文件):

-r--r----- 1 root root 1099511627776 May 10 02:12 Backup-LUN-itmp-lun-0.000
-r--r----- 1 root root 1099500093440 May 10 03:50 Backup-LUN-itmp-lun-0.001
-rw-r--r-- 1 root root           251 May 10 03:50 Backup-LUN-itmp-lun-0.conf
Run Code Online (Sandbox Code Playgroud)

现在我需要访问我的备份。通常,如果它是一个文件,我会将其映射到/dev/loop0然后作为普通磁盘挂载。但就我而言,我无法将两个文件映射到/dev/loop0. 一种选择是对这两个文件进行分类以创建一个大文件,但我没有额外的 2TB 空间,而且无论如何这都不是一个好的解决方案。

有人可以提出解决方案吗?

更新

我曾按照 Andreas Wiese 的建议尝试将 dmsetup 与线性目标一起使用,但出现以下错误。

dmsetup create my-backup << EOF
> 0 2147483648 linear Backup-LUN-itmp-lun-0.000 0
> 2147483648 2147461120 linear Backup-LUN-itmp-lun-0.001 0
> EOF
device-mapper: reload ioctl on my-backup failed: Invalid argument
Command failed
Run Code Online (Sandbox Code Playgroud)

dmesg 包含以下错误:

device-mapper: table: 254:0: linear: dm-linear: Device lookup failed
device-mapper: ioctl: error adding target to table
Run Code Online (Sandbox Code Playgroud)

And*_*ese 6

您可以使用 Device Mapper(通过 配置dmsetup(8))来完成您想要做的事情。如果这两个文件中的数据确实是卷的线性转储,您可以创建一个由多个块设备组成的 DM 设备,您可以从循环设备的文件中创建这些设备,类似于:

# losetup /dev/loop0 /path/to/Backup-LUN-itmp-lun-0.000
# losetup /dev/loop1 /path/to/Backup-LUN-itmp-lun-0.001
# size1=$(blockdev --getsz /dev/loop0)
# size2=$(blockdev --getsz /dev/loop1)
# dmsetup create my-backup << EOF
0 $size1 linear /dev/loop0 0
$size1 $size2 linear /dev/loop1 0
EOF
Run Code Online (Sandbox Code Playgroud)

这会读取一个描述您的 DM 设备的表,stdin并创建一个名为的块设备/dev/mapper/my-backup,您应该能够像使用任何其他块设备一样使用它。

表格格式为

<start-sector> <length> <target> <target-args>
Run Code Online (Sandbox Code Playgroud)

<start-sector><length>描述 DM 设备一部分的开始和长度(以 512 字节的扇区为单位),<target>linear用于线性组装。linear目标的参数是要使用的设备和设备内部的偏移量(例如,如果您的备份软件在转储前写入了某种标题,您可以跳过它),在本例中,它0适用于原始转储。

因此,上面的示例组装my-backup设备,以便第一部分从Backup-LUN-itmp-lun-0.000(via loop0)映射,第二部分从Backup-LUN-itmp-lun-0.000(via loop1)映射。

如果您的备份不仅仅是线性转储(例如使用dd输出并将其拆分为多个文件),您可以尝试使用其他 DM 目标。

编辑: DM 只映射块设备,而不是文件,所以添加了losetup部分。有了这个,您也可以使用blockdev --getsz并且不必担心尺寸,如示例所示。