Copia de volumes em armazenamento através de servidor Linux usando XCOPY

Às vezes, é necessário obter uma cópia completa de um volume dentro de um único sistema de armazenamento (SAN), não um snapshot, mas sim um volume real. No entanto, nem sempre o SAN permite fazer isso por conta própria. O único jeito parece ser copiar através do servidor, mas isso fará com que todo o volume de dados trafegue pelo próprio servidor, pela rede até o SAN e pelas portas do SAN, sobrecarregando todos esses componentes. Contudo, existem comandos SCSI que podem permitir realizar tudo dentro do próprio SAN e, se o seu sistema suportar VAAI da VMware, é praticamente 100% certo que o comando XCOPY (CÓPIA EXTENDIDA) é suportado, que informa ao array o que e para onde copiar, sem envolver todo esse processo. servidor e rede.

Parece que tudo deveria ser simples, mas a princípio não encontrei scripts prontos, tive que inventar a roda. Para o SO servidor foi escolhido o Linux, e como ferramenta de cópia foi utilizada a comando ddpt (http://sg.danny.cz/sg/ddpt.html). Com essa combinação, é possível copiar quaisquer volumes de qualquer SO, uma vez que a cópia é feita em blocos do lado do SAN. Como a cópia precisa ser em blocos e é preciso contar o número de blocos, o comando blockdev foi utilizado para contar o número dessas iterações. O tamanho máximo do bloco foi obtido empiricamente, com blocos maiores o ddpt não funcionou na prática. No final, o seguinte script bastante simples foi obtido:

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

Vamos fazer uma pequena verificação! Bem, não tão pequena, um arquivo de 1TB foi criado e verificou-se o md5sum não muito rapidamente 🙂

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 de sistema de arquivos errado, opção errada, superbloco ruim em /dev/mapper/mpathfs, código de página ou programa auxiliar ausente, ou outro erro.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Descartando blocos do dispositivo: feito
Criando sistema de arquivos com 314572800 blocos de 4k e 78643200 inodes
UUID do sistema de arquivos: bed3ea00-c181-4b4e-b52e-d9bb498be756
Backups do superbloco armazenados em blocos:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Alocando tabelas de grupo: feito
Escrevendo tabelas de inode: feito
Escrevendo superblocos e informações de contabilidade do sistema de arquivos: feito

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 Ago 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 Ago 19 17:25 1TB_file
drwx------ 2 root root         16384 Ago 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 de sistema de arquivos errado, opção errada, superbloco ruim em /dev/mapper/mpathfr, código de página ou programa auxiliar ausente, ou outro erro.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#!/bin/bash
# primeiro parâmetro = dispositivo de entrada
# segundo parâmetro = dispositivo de saída
# o tamanho do dispositivo deve ser o mesmo
# mudar a variável bs pode reduzir a velocidade, a velocidade máxima deve ser bs=32768. 32768 é a configuração máxima, configurações mais baixas devem ser calculadas dividindo por 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

O que estava acontecendo no armazenamento:

Copia de volumes em armazenamento através de servidor Linux usando XCOPY
Vamos continuar com o 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 Ago 19 17:25 1TB_file
drwx------ 2 root root         16384 Ago 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#

Tudo funcionou, mas teste e use por sua conta e risco! Como volume de origem, é melhor usar snapshots, para começar.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster