Còpia de volums a sistemes d'emmagatzematge mitjançant un servidor Linux mitjançant XCOPY

Succeeix que necessiteu obtenir una còpia completa d'un volum dins d'un sistema d'emmagatzematge de dades (DSS), no una instantània, un clon, sinó un volum complet. Però el sistema d'emmagatzematge no sempre permet que això es faci internament mitjançant els seus propis mitjans. Sembla que l'única opció és copiar a través del servidor, però en aquest cas tot el volum de dades es conduirà a través del propi servidor, la xarxa fins al sistema d'emmagatzematge i els ports d'emmagatzematge, carregant tots aquests components. Però hi ha ordres SCSI que us poden permetre fer tot dins del propi sistema d'emmagatzematge, i si el vostre sistema admet VAAI de VMware, és gairebé el 100% que s'admet l'ordre XCOPY (EXTENDED COPY), que indica a la matriu què i què. on copiar, sense implicar el servidor de procés i la xarxa.

Sembla que tot hauria de ser senzill, però no vaig trobar cap guió preparat de seguida, així que vaig haver de reinventar la roda. Es va seleccionar Linux per al sistema operatiu del servidor i es va seleccionar l'ordre ddpt (http://sg.danny.cz/sg/ddpt.html) com a eina de còpia. Amb aquesta combinació, podeu copiar qualsevol volum des de qualsevol sistema operatiu, ja que la còpia es produeix bloc per bloc al costat del sistema d'emmagatzematge. Com que cal copiar bloc per bloc i s'ha de comptar el nombre de blocs, es va utilitzar l'ordre blockdev per comptar el nombre d'aquestes iteracions. La mida màxima del bloc es va obtenir experimentalment; ddpt no funcionava realment amb un bloc gran. El resultat va ser el següent script bastant senzill:

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

Fem una petita comprovació! Bé, com a petit, md1sum no va crear ni comprovar ràpidament un fitxer d'5 TB :)

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

Què estava passant al sistema d'emmagatzematge en aquell moment:

Còpia de volums a sistemes d'emmagatzematge mitjançant un servidor Linux mitjançant XCOPY
Continuem amb 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#

Tot ha funcionat, però prova i utilitza sota el teu propi risc! Com a volum font, és millor fer instantànies, per començar.

Font: www.habr.com

Afegeix comentari