Para testar a junção de 3 arquivos linearmente em meu sistema Linux, eu faço:
fallocate -l 100M file1.image
fallocate -l 150M file2.image
fallocate -l 50M file3.image
e então eu corro losetup
:
losetup /dev/loop1 file1.image
losetup /dev/loop2 file2.image
losetup /dev/loop3 file3.image
Encontrei este script para juntar dois arquivos:
#!/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
E eu começo com
./join.sh /dev/loop1 /dev/loop2
funciona com dois dispositivos, eles são unidos em um:
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
Em seguida, removo o dispositivo "ingressado" dmsetup remove joined
e ajusto o script para três arquivos de dispositivo:
#!/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
comece com
./join.sh /dev/loop1 /dev/loop2 /dev/loop3
device-mapper: reload ioctl on joined (253:10) failed: Das Argument ist ungültig
Command failed.
Mas falha com o erro acima. O que estou fazendo de errado?
dmesg
device-mapper: table: 253:10: linear: Gap in table (-EINVAL)
device-mapper: ioctl: error adding target to table
no
Encontrei uma maneira de mdadm
juntar linearmente e quando tentei funcionou. Eu fiz:
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
Por que o dmsetup
método não funciona com 3 dispositivos?
Qual é a diferença entre as formas dmsetup
e mdadm
?
Para que é dmsetup
...?
E é mdadm
para ataque?
Fiz um raid0 com 3 tamanhos de disco diferentes? isso é possível?
O formato das
linear
linhas da tabela do mapeador de dispositivos é o seguinte:Ou em outras palavras,
<source device>
a partir da posição do bloco<source start>
em diante,<mapping length>
os blocos devem ser representados no mapeamento resultante como uma sequência de blocos começando em<target start>
.Ao unir dispositivos em ordem:
<target start>
deve ser 0<target start>
deve ser igual à soma dos tamanhos de todas as partes anteriores .Portanto, o seu script para três dispositivos deve ser:
Ou para um número arbitrário de dispositivos:
Para usar este script, especifique primeiro o nome do destino, por exemplo
Crie um script executável
mapdevlist
:Chame isso assim: