Copie de volumes vers le stockage via un serveur Linux à l'aide de XCOPY

Il arrive que vous deviez obtenir une copie complète d'un volume dans un système de stockage (DSS), pas un instantané, un clone, mais un volume à part entière. Mais le système de stockage ne vous permet pas toujours de le faire en vous-même par vos propres moyens. Il semble que la seule option soit de copier via le serveur, mais en même temps, toute la quantité de données sera chassée via le serveur lui-même, le réseau vers le système de stockage et les ports de stockage, chargeant tous ces composants. Mais il existe des commandes SCSI qui peuvent vous permettre de tout faire dans le système de stockage lui-même, et si votre système prend en charge VAAI de VMware, alors presque 100%, qui est pris en charge par la commande XCOPY (EXTENDED COPY), qui indique à la baie ce qu'il faut copier et où, sans l'impliquer dans cette serveur de processus et réseau.



Il semble que tout devrait être simple, mais je n'ai pas trouvé de scripts prêts à l'emploi tout de suite, j'ai dû réinventer la roue. Linux a été choisi pour le système d'exploitation du serveur et la commande ddpt (http://sg.danny.cz/sg/ddpt.html) a été choisie comme outil de copie. Tous les volumes de n'importe quel système d'exploitation peuvent être copiés à l'aide de cette combinaison, car la copie se fait bloc par bloc du côté stockage. Puisqu'il est nécessaire de copier bloc par bloc et que le nombre de blocs doit être compté, la commande blockdev a été utilisée pour compter le nombre de telles itérations. La taille de bloc maximale a été obtenue empiriquement, avec un grand bloc ddpt ne fonctionnait pas en fait. Le résultat est le script plutôt simple suivant:



#!/bin/bash
# first parameter = input device
# second parameter = output device
# device size must be the same
# changing bs variable can reduce speed, max speed should be at bs=32768. 32768 is max setting, lower settings should be calculated dividing by 2

set -o nounset
bs=32768
s=`blockdev --getsz $1`
i=0
while [ $i -le $s ]
do
ddpt of=$2 bs=512 oflag=xcopy,direct if=$1 iflag=xcopy,direct count=$bs verbose=-1 skip=$i seek=$i
i=$(( $i+$bs ))
done


Faisons un petit contrôle! Eh bien, combien petit, un fichier de 1 To a été créé et vérifié par md5sum pas rapidement :)



root@sales-demo-05:/home/vasilyk# blockdev --getsz /dev/mapper/mpathfs
2516582400
root@sales-demo-05:/home/vasilyk# blockdev --getsz /dev/mapper/mpathfr
2516582400
root@sales-demo-05:/home/vasilyk# mount /dev/mapper/mpathfs /xcopy_source/
mount: /xcopy_source: wrong fs type, bad option, bad superblock on /dev/mapper/mpathfs, missing codepage or helper program, or other error.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done
Creating filesystem with 314572800 4k blocks and 78643200 inodes
Filesystem UUID: bed3ea00-c181-4b4e-b52e-d9bb498be756
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

root@sales-demo-05:/home/vasilyk# mount /dev/mapper/mpathfs /xcopy_source/
root@sales-demo-05:/home/vasilyk# ls -l /xcopy_source/
total 16
drwx------ 2 root root 16384 Aug 19 15:35 lost+found
root@sales-demo-05:/home/vasilyk# head -c 1T </dev/urandom > /xcopy_source/1TB_file
root@sales-demo-05:/home/vasilyk# ls -l /xcopy_source/
total 1074791444
-rw-r--r-- 1 root root 1099511627776 Aug 19 17:25 1TB_file
drwx------ 2 root root         16384 Aug 19 15:35 lost+found
root@sales-demo-05:/home/vasilyk# umount /xcopy_source
root@sales-demo-05:/home/vasilyk# mount /dev/mapper/mpathfr /xcopy_dest/
mount: /xcopy_dest: wrong fs type, bad option, bad superblock on /dev/mapper/mpathfr, missing codepage or helper program, or other error.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#!/bin/bash
# first parameter = input device
# second parameter = output device
# device size must be the same
# changing bs variable can reduce speed, max speed should be at bs=32768. 32768 is max setting, lower settings should be calculated dividing by 2

bs=32768
s=`blockdev --getsz $1`
i=0
while [ $i -le $s ]
do
ddpt of=$2 bs=512 oflag=xcopy,direct if=$1 iflag=xcopy,direct count=$bs verbose=-1 skip=$i seek=$i
i=$(( $i+$bs ))
done
root@sales-demo-05:/home/vasilyk# time ./xcopy.sh /dev/mapper/mpathfs /dev/mapper/mpathfr
real    11m30.878s
user    2m3.000s
sys     1m11.657s


Ce qui se passait sur le système de stockage à ce moment-là:



image

continuons avec Linux.



root@sales-demo-05:/home/vasilyk# mount /dev/mapper/mpathfr /xcopy_dest/
root@sales-demo-05:/home/vasilyk# ls -l /xcopy_dest/
total 1074791444
-rw-r--r-- 1 root root 1099511627776 Aug 19 17:25 1TB_file
drwx------ 2 root root         16384 Aug 19 15:35 lost+found
root@sales-demo-05:/home/vasilyk# mount /dev/mapper/mpathfs /xcopy_source/
root@sales-demo-05:/home/vasilyk# md5sum /xcopy_source/1TB_file
53dc6dfdfc89f099c0d5177c652b5764  /xcopy_source/1TB_file
root@sales-demo-05:/home/vasilyk# md5sum /xcopy_dest/1TB_file
53dc6dfdfc89f099c0d5177c652b5764  /xcopy_dest/1TB_file
root@sales-demo-05:/home/vasilyk#




Tout a fonctionné, mais testez et utilisez à vos risques et périls! Il est préférable de prendre des instantanés en tant que volume source, pour commencer.



All Articles