A volte è necessario ottenere una copia completa di un volume all'interno di un unico sistema di storage (SASD), non un'istantanea, un clone, ma un vero e proprio volume. Tuttavia, non sempre la SASD consente di farlo con i propri mezzi. Sembra che l'unica opzione sia copiare tramite server, ma in questo caso l'intero volume di dati sarà trasferito attraverso il server stesso, la rete verso la SASD e le porte della SASD, sovraccaricando tutti questi componenti. Ci sono però comandi SCSI che potrebbero permettere di svolgere tutto all'interno della stessa SASD e, se il tuo sistema supporta VAAI di VMware, è praticamente certo che il comando XCOPY (COPIA ESTESA) sia supportato, il quale indica al sistema di archiviazione cosa e dove copiare, senza coinvolgere questi processi. un server e la rete.
Sembra che tutto dovrebbe essere semplice, ma non ho trovato script pronti e ho dovuto inventare la ruota. Per il sistema operativo server ho scelto Linux e come strumento di copia ho utilizzato il comando ddpt (http://sg.danny.cz/sg/ddpt.html). Questo metodo permette di copiare qualsiasi volume da qualsiasi sistema operativo, poiché la copia avviene a livello di blocchi lato SASD. Poiché è necessario copiare a blocchi e il numero di blocchi deve essere calcolato, ho usato il comando blockdev per contare il numero di iterazioni. La dimensione massima del blocco è stata determinata empiricamente, in quanto ddpt non funzionava con blocchi più grandi. Alla fine, ho creato il seguente script abbastanza 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 un piccolo controllo! Beh, non così piccolo, un file da 1 TB è stato creato e verificato con md5sum non 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 filesystem errato, opzione errata, superblocco corrotto su /dev/mapper/mpathfs, codice di 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)
Cancellazione dei blocchi del dispositivo: completato
Creazione del filesystem con 314572800 blocchi da 4k e 78643200 inode
UUID del filesystem: bed3ea00-c181-4b4e-b52e-d9bb498be756
Backup del superblocco memorizzati nei blocchi:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Allocazione delle tabelle di gruppo: completato
Scrittura delle tabelle inode: completato
Scrittura dei superblocco e delle informazioni di contabilizzazione del filesystem: completato
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: tipo di filesystem errato, opzione errata, superblocco corrotto su /dev/mapper/mpathfr, codice di 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
# modificare la variabile bs può ridurre la velocità, la velocità massima dovrebbe essere impostata su bs=32768. 32768 è l'impostazione massima, le impostazioni più basse 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
real 11m30.878s
user 2m3.000s
sys 1m11.657sCosa stava succedendo in quel momento nella SASD:

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/
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#Tutto è andato a buon fine, ma testate e usate a vostro rischio e pericolo! Come volume sorgente è meglio prendere degli snapshot, per iniziare.
Fonte: habr.com
