Copierea volumelor pe sistemele de stocare prin intermediul unui server Linux folosind XCOPY

Se întâmplă că trebuie să obțineți o copie completă a unui volum într-un sistem de stocare a datelor (DSS), nu un instantaneu, o clonă, ci un volum complet. Însă sistemul de stocare nu permite întotdeauna ca acest lucru să fie realizat intern folosind propriile mijloace. Se pare că singura opțiune este să copiați prin server, dar în acest caz întregul volum de date va fi condus prin serverul propriu-zis, prin rețea către sistemul de stocare și porturile de stocare, încărcând toate aceste componente. Dar există comenzi SCSI care vă pot permite să faceți totul în sistemul de stocare în sine, iar dacă sistemul dvs. acceptă VAAI de la VMware, atunci este acceptată aproape 100% comanda XCOPY (EXTENDED COPY), care spune matricei ce și unde să copiați, fără a implica serverul de proces și rețeaua.

Se pare că totul ar trebui să fie simplu, dar nu am putut găsi niciun script gata făcut imediat, așa că a trebuit să reinventez roata. Linux a fost selectat pentru sistemul de operare al serverului, iar comanda ddpt (http://sg.danny.cz/sg/ddpt.html) a fost selectată ca instrument de copiere. Folosind această combinație, puteți copia orice volume din orice sistem de operare, deoarece copiarea are loc bloc cu bloc pe partea sistemului de stocare. Deoarece este necesar să copiați bloc cu bloc, iar numărul de blocuri trebuie numărat, comanda blockdev a fost folosită pentru a număra numărul de astfel de iterații. Dimensiunea maximă a blocului a fost obținută experimental; ddpt nu a funcționat de fapt cu un bloc mare. Rezultatul a fost următorul script destul de simplu:

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

Hai să facem o mică verificare! Ei bine, ca fiind unul mic, un fișier de 1 TB nu a fost creat și verificat rapid de 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

Ce se întâmpla pe sistemul de stocare în acel moment:

Copierea volumelor pe sistemele de stocare prin intermediul unui server Linux folosind XCOPY
Să continuăm cu 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#

Totul a funcționat, dar testați și utilizați pe propriul risc! Ca volum sursă, este mai bine să faceți instantanee, pentru început.

Sursa: www.habr.com

Adauga un comentariu