Copia de volúmenes en almacenamiento a través de un servidor Linux usando XCOPY

A veces es necesario obtener una copia completa de un volumen dentro de un solo sistema de almacenamiento (SAS), no una instantánea, un clon, sino un volumen completamente funcional. Pero no siempre el SAS permite hacerlo con sus propios medios. Parece que la única opción es copiar a través de un servidor, pero con esto todo el volumen de datos se trasladaría a través del propio servidor, la red hasta el SAS y los puertos del SAS, sobrecargando todos estos componentes. Sin embargo, hay comandos SCSI que pueden permitir realizar todo dentro del propio SAS y si su sistema admite VAAI de VMware, entonces es casi 100% seguro que se admite el comando XCOPY (COPY EXTENDIDO), que le dice a la matriz qué y adónde copiar, sin involucrar en este proceso servidor y la red.

La verdad es que todo debería ser sencillo, pero no encontré scripts listos de inmediato, tuve que inventar la pólvora. Para el sistema operativo servidores se eligió Linux y como herramienta de copia el comando ddpt (http://sg.danny.cz/sg/ddpt.html). Con esta combinación se pueden copiar volúmenes de cualquier sistema operativo, ya que la copia se realiza por bloques en el lado del SAS. Dado que hay que copiar por bloques y hay que contar el número de bloques, se utilizó el comando blockdev para calcular el número de esas iteraciones. El tamaño máximo del bloque se obtuvo experimentalmente; con bloques más grandes, ddpt no funcionaba realmente. Al final, se obtuvo el siguiente script bastante sencillo:

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

¡Hagamos una pequeña verificación! Bueno, no tan pequeña, se creó un archivo de 1TB y se verificó el md5sum no tan rápido 🙂

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 archivos incorrecto, mala opción, superbloque dañado en /dev/mapper/mpathfs, falta el código de página o el programa auxiliar, u otro error.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-mar-2018)
Descartando bloques de dispositivo: hecho
Creando sistema de archivos con 314572800 bloques de 4k y 78643200 inodos
UUID del sistema de archivos: bed3ea00-c181-4b4e-b52e-d9bb498be756
Copias de seguridad de superbloques almacenadas en bloques:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Asignando tablas de grupo: hecho
Escribiendo tablas de inodos: hecho
Escribiendo superbloques e información de contabilidad del sistema de archivos: hecho

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 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/
total 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 de sistema de archivos incorrecto, mala opción, superbloque dañado en /dev/mapper/mpathfr, falta el código de página o el programa auxiliar, u otro error.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#! /bin/bash
# primer parámetro = dispositivo de entrada
# segundo parámetro = dispositivo de salida
# el tamaño del dispositivo debe ser el mismo
# cambiar la variable bs puede reducir la velocidad, la velocidad máxima debería estar en bs=32768. 32768 es la configuración máxima, configuraciones más bajas deben calcularse dividiendo 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

¿Qué estaba pasando en ese momento en el almacenamiento?

Copia de volúmenes en almacenamiento a través de un servidor Linux usando XCOPY
Continuemos 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 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#

Todo funcionó, pero ¡pruébalo y úsalo bajo tu propio riesgo! Para el volumen de origen, es mejor tomar instantáneas, para empezar.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster