![更新](https://linux22.com/image/36459/%E6%9B%B4%E6%96%B0.png)
我有一个iscsi
2TB 大的磁盘。我每周都会备份该磁盘。备份脚本将整个 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
并且不必担心大小,如示例所示。