Uneori, este necesar să obțineți o copie completă a unui volum în cadrul aceluiași sistem de stocare (SDS), nu un instantaneu, ci un volum complet. Dar nu întotdeauna SDS-ul permite acest lucru prin resursele sale interne. Din câte se pare, singura opțiune este să copiați prin server, dar astfel întregul volum de date va fi transmis prin serverul însuși, rețeaua până la SDS și porturile SDS, suprasolicitând toate aceste componente. Totuși, există comenzi SCSI care pot permite să faceți totul în cadrul SDS-ului și, dacă sistemul dvs. suportă VAAI de la VMware, atunci aproape 100% este suportată comanda XCOPY (EXTENDED COPY), care îi spune array-ului ce și unde să copieze, fără a implica în acest proces serverul și rețeaua.
Se pare că totul ar trebui să fie simplu, dar din păcate nu am găsit scripturi gata făcute, așa că a trebuit să inventez bicicleta. Pentru sistemul de operare server am ales Linux, iar ca instrument de copiere comanda ddpt (http://sg.danny.cz/sg/ddpt.html). Cu această combinație, puteți copia orice volume de la orice sistem de operare, deoarece copierea se face pe blocuri pe partea SDS-ului. Deoarece trebuie să copiați pe blocuri, iar numărul de blocuri trebuie să fie calculat, pentru a determina numărul de astfel de iterații am folosit comanda blockdev. Dimensiunea maximă a blocului a fost obținută empiric, cu un bloc mai mare ddpt nu funcționa de fapt. În cele din urmă, a rezultat 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 ))
doneSă facem o mică verificare! Ei bine, nu chiar mică, a fost creat un fișier de 1TB și s-a verificat md5sum-ul, nu foarte repede 🙂
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: tip greșit al sistemului de fișiere, opțiune greșită, superblock corupt pe /dev/mapper/mpathfs, lipsesc codul de pagină sau programul ajutător, sau altă eroare.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Se elimină blocurile dispozitivului: gata
Se creează sistemul de fișiere cu 314572800 blocuri de 4k și 78643200 inodes
UUID sistem de fișiere: bed3ea00-c181-4b4e-b52e-d9bb498be756
Copiile de rezervă ale superblock-ului sunt stocate pe blocuri:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Alocarea meselor de grup: gata
Scrierea meselor de inode: gata
Scrierea superblock-urilor și informațiilor contabile ale sistemului de fișiere: gata
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: tip greșit al sistemului de fișiere, opțiune greșită, superblock corupt pe /dev/mapper/mpathfr, lipsesc codul de pagină sau programul ajutător, sau altă eroare.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#! /bin/bash
# primul parametru = dispozitiv de intrare
# al doilea parametru = dispozitiv de ieșire
# dimensiunea dispozitivului trebuie să fie aceeași
# schimbarea variabilei bs poate reduce viteza, viteza maximă ar trebui să fie la bs=32768. 32768 este setarea maximă, setările inferioare ar trebui să fie calculate prin împărțirea la 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.657sCe se întâmpla în acel moment în sistemul de stocare:

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#A ieșit totul bine, dar testați și utilizați pe riscul vostru! Este recomandat să folosiți snapshot-uri pentru volumul sursă, la început.
Sursa: habr.com
