Αντιγραφή τόμων σε συστήματα αποθήκευσης μέσω διακομιστή Linux χρησιμοποιώντας XCOPY

Συμβαίνει ότι πρέπει να λάβετε ένα πλήρες αντίγραφο ενός τόμου σε ένα σύστημα αποθήκευσης δεδομένων (DSS), όχι ένα στιγμιότυπο, έναν κλώνο, αλλά έναν πλήρη τόμο. Αλλά το σύστημα αποθήκευσης δεν επιτρέπει πάντα αυτό να γίνεται εσωτερικά με δικά του μέσα. Φαίνεται ότι η μόνη επιλογή είναι η αντιγραφή μέσω του διακομιστή, αλλά σε αυτήν την περίπτωση ολόκληρος ο όγκος των δεδομένων θα οδηγηθεί μέσω του ίδιου του διακομιστή, του δικτύου στο σύστημα αποθήκευσης και τις θύρες αποθήκευσης, φορτώνοντας όλα αυτά τα στοιχεία. Υπάρχουν όμως εντολές SCSI που μπορούν να σας επιτρέψουν να κάνετε τα πάντα μέσα στο ίδιο το σύστημα αποθήκευσης και εάν το σύστημά σας υποστηρίζει VAAI από το VMware, τότε είναι σχεδόν 100% ότι υποστηρίζεται η εντολή XCOPY (EXTENDED COPY), η οποία λέει στον πίνακα τι και πού να αντιγράψετε, χωρίς τη συμμετοχή διακομιστή διαδικασίας και δικτύου.

Φαίνεται ότι όλα θα έπρεπε να είναι απλά, αλλά δεν μπορούσα να βρω έτοιμα σενάρια αμέσως, οπότε έπρεπε να ανακαλύψω ξανά τον τροχό. Επιλέχθηκε Linux για το λειτουργικό σύστημα διακομιστή και η εντολή ddpt (http://sg.danny.cz/sg/ddpt.html) επιλέχθηκε ως εργαλείο αντιγραφής. Χρησιμοποιώντας αυτόν τον συνδυασμό, μπορείτε να αντιγράψετε οποιουσδήποτε τόμους από οποιοδήποτε λειτουργικό σύστημα, καθώς η αντιγραφή πραγματοποιείται μπλοκ προς μπλοκ στην πλευρά του συστήματος αποθήκευσης. Δεδομένου ότι είναι απαραίτητο να αντιγράψετε μπλοκ προς μπλοκ και ο αριθμός των μπλοκ πρέπει να μετρηθεί, η εντολή blockdev χρησιμοποιήθηκε για να μετρήσει τον αριθμό τέτοιων επαναλήψεων. Το μέγιστο μέγεθος μπλοκ λήφθηκε πειραματικά· το ddpt στην πραγματικότητα δεν λειτουργούσε με μεγάλο μπλοκ. Το αποτέλεσμα ήταν το ακόλουθο σχετικά απλό σενάριο:

#!/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

Ας κάνουμε έναν μικρό έλεγχο! Λοιπόν, ως μικρό, ένα αρχείο 1 TB δεν δημιουργήθηκε γρήγορα και δεν ελέγχθηκε από το 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

Τι συνέβαινε στο σύστημα αποθήκευσης εκείνη τη στιγμή:

Αντιγραφή τόμων σε συστήματα αποθήκευσης μέσω διακομιστή Linux χρησιμοποιώντας XCOPY
Ας συνεχίσουμε με το 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#

Όλα λειτούργησαν, αλλά δοκιμάστε και χρησιμοποιήστε με δική σας ευθύνη! Ως τόμος πηγής, είναι καλύτερο να τραβάτε στιγμιότυπα, για αρχή.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο