Copie de volumes sur des systèmes de stockage via un serveur Linux à l'aide de XCOPY

Il arrive que vous ayez besoin d'obtenir une copie complète d'un volume dans un système de stockage de données (DSS), non pas un instantané, un clone, mais un volume complet. Mais le système de stockage ne permet pas toujours de le faire en interne avec ses propres moyens. Il semble que la seule option soit de copier via le serveur, mais dans ce cas, la totalité du volume de données sera acheminée via le serveur lui-même, le réseau vers le système de stockage et les ports de stockage, chargeant ainsi tous ces composants. Mais il existe des commandes SCSI qui peuvent vous permettre de tout faire au sein du système de stockage lui-même, et si votre système prend en charge VAAI de VMware, alors c'est presque à 100 % que la commande XCOPY (EXTENDED COPY) est prise en charge, qui indique à la baie quoi et où copier, sans impliquer le serveur de processus et le 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 donc dû réinventer la roue. Linux a été sélectionné pour le système d'exploitation du serveur et la commande ddpt (http://sg.danny.cz/sg/ddpt.html) a été sélectionnée comme outil de copie. En utilisant cette combinaison, vous pouvez copier n'importe quel volume à partir de n'importe quel système d'exploitation, car la copie s'effectue bloc par bloc côté système de 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 ces itérations. La taille maximale des blocs a été obtenue expérimentalement ; ddpt ne fonctionnait pas réellement avec un gros bloc. Le résultat était le script suivant assez simple :

#!/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 une petite vérification ! Eh bien, comme un petit fichier, un fichier de 1 To n'a pas été créé et vérifié rapidement par md5sum :)

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

Que se passait-il sur le système de stockage à ce moment-là :

Copie de volumes sur des systèmes de stockage via un serveur Linux à l'aide de XCOPY
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 s'est bien passé, mais testez et utilisez à vos propres risques ! En tant que volume source, il est préférable de prendre des instantanés, pour commencer.

Source: habr.com

Ajouter un commentaire