A volte è necessario ottenere una copia completa di un volume all'interno di un unico sistema di archiviazione dati (SCD), non un'istantanea, un clone, ma un vero e proprio volume. Tuttavia, non sempre lo SCD consente di farlo con i propri strumenti. Sembra che l'unica opzione sia copiare tramite il server, ma in questo caso l'intero volume di dati verrà trasferito attraverso il server stesso, la rete fino allo SCD e le porte dello SCD, sovraccaricando tutti questi componenti. Ma ci sono comandi SCSI che possono consentire di fare tutto all'interno dello stesso SCD e se il tuo sistema supporta VAAI di VMware, è praticamente certo che il comando XCOPY (EXTENDED COPY) sia supportato, il quale indica al sistema di archiviazione cosa e dove copiare, senza coinvolgere in questo processo server e la rete.
Pare che tutto debba essere semplice, ma subito non ho trovato script pronti, ho dovuto inventare la ruota. Per il sistema operativo server è stata scelta Linux, e come strumento di copia ho utilizzato il comando ddpt (http://sg.danny.cz/sg/ddpt.html). È possibile copiare con questa combinazione qualsiasi volume da qualsiasi sistema operativo, poiché la copia avviene a livello di blocco sul lato SCD. Poiché è necessario copiare a blocchi e bisogna calcolare il numero di blocchi, è stato utilizzato il comando blockdev per contare il numero di tali iterazioni. La dimensione massima del blocco è stata ottenuta empiricamente; con blocchi più grandi ddpt non funzionava in pratica. Alla fine, è stato realizzato il seguente script piuttosto semplice:
#!/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 ))
doneFacciamo una piccola verifica! Beh, piccola o grande, un file da 1 TB è stato creato e verificato con md5sum non proprio velocemente 🙂
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: tipo di fs errato, opzione errata, superblocco errato su /dev/mapper/mpathfs, codice pagina mancante o programma di supporto, o altro errore.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Scartando blocchi del dispositivo: fatto
Creando filesystem con 314572800 blocchi da 4k e 78643200 inodes
Filesystem UUID: bed3ea00-c181-4b4e-b52e-d9bb498be756
Backup del superblocco memorizzati sui blocchi:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Allocazione delle tabelle di gruppo: fatto
Scrittura delle tabelle degli inode: fatto
Scrittura dei superblocco e delle informazioni contabili del filesystem: fatto
root@sales-demo-05:/home/vasilyk# mount /dev/mapper/mpathfs /xcopy_source/
root@sales-demo-05:/home/vasilyk# ls -l /xcopy_source/
totale 16
drwx------ 2 root root 16384 19 Ago 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/
totale 1074791444
-rw-r--r-- 1 root root 1099511627776 19 Ago 17:25 1TB_file
drwx------ 2 root root 16384 19 Ago 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: tipo di fs errato, opzione errata, superblocco errato su /dev/mapper/mpathfr, codice pagina mancante o programma di supporto, o altro errore.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#!/bin/bash
# primo parametro = dispositivo di input
# secondo parametro = dispositivo di output
# la dimensione del dispositivo deve essere la stessa
# cambiare la variabile bs può ridurre la velocità, la massima velocità dovrebbe essere a bs=32768. 32768 è l'impostazione massima, impostazioni inferiori dovrebbero essere calcolate dividendo per 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
reale 11m30.878s
utente 2m3.000s
sys 1m11.657sCosa stava succedendo in quel momento nel sistema di archiviazione:

Continuiamo con Linux.
root@sales-demo-05:/home/vasilyk# mount /dev/mapper/mpathfr /xcopy_dest/
root@sales-demo-05:/home/vasilyk# ls -l /xcopy_dest/
totale 1074791444
-rw-r--r-- 1 root root 1099511627776 19 Ago 17:25 1TB_file
drwx------ 2 root root 16384 19 Ago 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#Tutto è andato a buon fine, ma testate e utilizzate a vostro rischio e pericolo! Come volume sorgente è meglio utilizzare snapshot, per iniziare.
Fonte: habr.com
