更新

更新

我有一个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

现在我需要访问我的备份。通常,如果它是一个文件,我会将其映射到/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

dmesg 包含以下错误:

device-mapper: table: 254:0: linear: dm-linear: Device lookup failed
device-mapper: ioctl: error adding target to table

答案1

您想要做的事情可以使用设备映射器来完成(通过配置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

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

表格格式为

<start-sector> <length> <target> <target-args>

<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并且不必担心大小,如示例所示。

相关内容