为了在我的 Linux 系统上测试线性连接 3 个文件,我这样做:
fallocate -l 100M file1.image
fallocate -l 150M file2.image
fallocate -l 50M file3.image
然后我运行losetup
:
losetup /dev/loop1 file1.image
losetup /dev/loop2 file2.image
losetup /dev/loop3 file3.image
我找到了这个用于合并两个文件的脚本:
#!/bin/sh
# Join 2 devices together
size1=`blockdev --getsz $1`
size2=`blockdev --getsz $2`
echo "0 $size1 linear $1 0
$size1 $size2 linear $2 0" | dmsetup create joined
我开始
./join.sh /dev/loop1 /dev/loop2
它适用于两个设备,它们合并成一个:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop1 7:1 0 100M 0 loop
└─joined 253:10 0 250M 0 dm
loop2 7:2 0 150M 0 loop
└─joined 253:10 0 250M 0 dm
然后,我删除“加入”的设备dmsetup remove joined
并调整 3 个设备文件的脚本:
#!/bin/sh
# Join 3 devices together
size1=`blockdev --getsz $1`
size2=`blockdev --getsz $2`
size3=`blockdev --getsz $3`
echo "0 $size1 linear $1 0
$size1 $size2 linear $2 0
$size2 $size3 linear $3 0" | dmsetup create joined
开始于
./join.sh /dev/loop1 /dev/loop2 /dev/loop3
device-mapper: reload ioctl on joined (253:10) failed: Das Argument ist ungültig
Command failed.
但它失败了,并出现上述错误。我做错了什么?
消息
device-mapper: table: 253:10: linear: Gap in table (-EINVAL)
device-mapper: ioctl: error adding target to table
在
mdadm
我找到了一种用于线性连接的方法,当我尝试它时,它起作用了。我做了:
dd if=/dev/zero bs=1M count=100 of=a.img
dd if=/dev/zero bs=1M count=50 of=b.img
dd if=/dev/zero bs=1M count=150 of=c.img
losetup -f
/dev/loop0
for i in a b c; do losetup -f $i.img; done
mdadm --build /dev/md0 -l linear -n 3 /dev/loop[012]
mdadm: array /dev/md0 built and started.
cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active linear loop2[2] loop1[1] loop0[0]
307200 blocks super non-persistent 64k rounding
unused devices: <none>
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 100M 0 loop
└─md0 9:0 0 300M 0 linear
loop1 7:1 0 50M 0 loop
└─md0 9:0 0 300M 0 linear
loop2 7:2 0 150M 0 loop
└─md0 9:0 0 300M 0 linear
为什么该dmsetup
方法不适用于 3 台设备?
dmsetup
和方式有什么区别mdadm
?
...是干什么dmsetup
用的?
是mdadm
用于突袭吗?
我是否已完成具有 3 种不同磁盘大小的 raid0?这可能吗?
设备映射器表行的格式
linear
如下:或者换句话说,从 开始
<source device>
,从块位置 开始<source start>
向前的<mapping length>
块应该在结果映射中表示为从 开始的块序列<target start>
。按以下顺序将设备连接在一起:
<target start>
必须为 0<target start>
必须等于所有先前部分的大小总和。因此,针对三个设备的脚本应该是:
或者对于任意数量的设备:
要使用此脚本,请先指定目标名称,例如
创建可执行脚本
mapdevlist
:像这样调用它: