Manchmal ist es nötig, eine vollständige Kopie eines Volumes innerhalb eines Speichersystems (SAN) zu erhalten, und zwar nicht als Snapshot oder Klon, sondern als echtes Volume. Doch nicht immer ermöglichen es die eigenen Mittel des SAN, dies zu tun. Der einzige Weg scheint, über einen Server zu kopieren, wobei jedoch das gesamte Datenvolumen über den Server, das Netzwerk zum SAN und die Ports des SAN geleitet wird, was alle diese Komponenten belastet. Es gibt jedoch SCSI-Befehle, die es ermöglichen, dies direkt im SAN selbst zu tun. Wenn Ihr System VAAI von VMware unterstützt, ist es so gut wie sicher, dass der Befehl XCOPY (EXTENDED COPY) unterstützt wird, der dem Speicherarray mitteilt, was und wohin kopiert werden soll, ohne diesen Prozess einzubeziehen. der Server und das Netzwerk.
Eigentlich sollte alles einfach sein, aber aus dem Stegreif habe ich keine fertigen Skripte gefunden und musste selbst einen Weg finden. Für das Betriebssystem Server Es wurde Linux gewählt, und als Kopierwerkzeug kam der Befehl ddpt (http://sg.danny.cz/sg/ddpt.html) zum Einsatz. Mit dieser Kombination können alle Volumes von jedem Betriebssystem kopiert werden, da die Kopie blockweise auf der Seite des Speichersystems erfolgt. Da blockweise kopiert werden muss und die Anzahl der Blöcke gezählt werden muss, wurde der Befehl blockdev zur Zählung der Iterationen verwendet. Die maximale Blockgröße wurde empirisch ermittelt, mit größeren Blöcken funktionierte ddpt unerwartet nicht. Am Ende ergab sich folgendes relativ einfaches Skript:
#!/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 ))
doneLassen Sie uns einen kleinen Test durchführen! Nun, nicht so klein, eine 1TB-Datei wurde erstellt und md5sum wurde nicht im Handumdrehen geprüft 🙂
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: falscher Dateisystemtyp, falsche Option, fehlerhafter Superblock auf /dev/mapper/mpathfs, fehlender Codepage oder Hilfsprogramm oder ein anderer Fehler.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Blockierung von Gerätedaten: abgeschlossen
Erstelle Dateisystem mit 314572800 4k-Blöcken und 78643200 Inodes
Filesystem UUID: bed3ea00-c181-4b4e-b52e-d9bb498be756
Superblock-Backups auf Blöcken gespeichert:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Zuweisen der Gruppentabellen: abgeschlossen
Schreiben der Inodetabellen: abgeschlossen
Schreiben der Superblöcke und Dateisystemprojektinformationen: abgeschlossen
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: falscher Dateisystemtyp, falsche Option, fehlerhafter Superblock auf /dev/mapper/mpathfr, fehlender Codepage oder Hilfsprogramm oder ein anderer Fehler.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#!/bin/bash
# erster Parameter = Eingabegerät
# zweiter Parameter = Ausgabegerät
# Gerätegröße muss gleich sein
# Ändern der bs-Variable kann die Geschwindigkeit reduzieren, die maximale Geschwindigkeit sollte bei bs=32768 liegen. 32768 ist die maximale Einstellung, niedrigere Einstellungen sollten durch 2 geteilt werden
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.657sWas in diesem Moment auf dem Speicher-Array geschah:

Lassen Sie uns mit Linux fortfahren.
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#Es hat funktioniert, aber testen Sie es und nutzen Sie es auf eigenes Risiko! Für das Quellvolumen ist es am besten, Snapshots als Ausgangspunkt zu verwenden.
Quelle: habr.com
