Copie de volumes sur un système de stockage via un serveur Linux en utilisant XCOPY

Il arrive qu'il soit nécessaire d'obtenir une copie complète d'un volume au sein d'un même système de stockage (SAN), non pas une photo, mais un véritable clone. Cependant, il n'est pas toujours possible de le faire uniquement avec les ressources internes du SAN. Il semble que l'unique option soit de copier via un serveur, mais cela entraînerait une surcharge de données à travers le serveur lui-même, le réseau jusqu'au SAN et les ports du SAN, sollicitant tous ces composants. Toutefois, il existe des commandes SCSI qui permettent de réaliser cela au sein même du SAN et si votre système supporte le VAAI de VMware, il y a quasiment 100% de chances que la commande XCOPY (COPIE ÉTENDUE) soit supportée, indiquant au système de stockage quoi et où copier, sans impliquer ces processus. serveur et le réseau.

Il semble que tout devrait être simple, mais je n'ai pas trouvé de scripts tout prêts, il a donc fallu inventer un moyen. Pour le système d'exploitation de serveurs Linux a été choisi, et comme outil de copie, la commande ddpt (http://sg.danny.cz/sg/ddpt.html). Avec cette combinaison, il est possible de copier n'importe quel volume depuis n'importe quel système d'exploitation, car la copie se fait par blocs du côté du SAN. Comme il faut copier bloc par bloc, et qu'il faut compter le nombre de blocs, la commande blockdev a été utilisée pour effectuer ce calcul. La taille de bloc maximale a été déterminée par essais, car ddpt ne fonctionnait pas avec de plus gros blocs. Au final, voici un script 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 un petit test ! Enfin, pas si petit, un fichier de 1 To a été créé et vérifié avec md5sum, ce n'était pas très rapide 🙂

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: type de système de fichiers incorrect, mauvaise option, mauvais superbloc sur /dev/mapper/mpathfs, codepage manquante ou programme d'aide, ou autre erreur.
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  /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: type de système de fichiers incorrect, mauvaise option, mauvais superbloc sur /dev/mapper/mpathfr, codepage manquante ou programme d'aide, ou autre erreur.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#! /bin /bash
# premier paramètre = périphérique d'entrée
# second paramètre = périphérique de sortie
# la taille du périphérique doit être la même
# changer la variable bs peut réduire la vitesse, la vitesse max doit être à bs=32768. 32768 est le réglage max, les réglages inférieurs doivent être calculés en divisant par 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 à ce moment-là sur le stockage ?

Copie de volumes sur un système de stockage via un serveur Linux en utilisant 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 a fonctionné, mais testez et utilisez à vos risques et périls ! Il est préférable de prendre des instantanés du volume source pour commencer.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster