Копирование томов на СХД через Linux сервер с использованием XCOPY

от автора

Бывает, что нужно получить полную копию тома в рамках одной системы хранения данных (СХД), не снимок, клон, а именно полноценный том. Но не всегда СХД дает это сделать внутри себя собственными средствами. Вроде единственный вариант копировать через сервер, но при этом весь объем данных будет гоняться через сам сервер, сеть до СХД и порты СХД, нагружая все эти компоненты. Но есть SCSI команды, которые могут позволить сделать все в рамках самой СХД и если ваша система поддерживает VAAI от VMware, то практически 100%, что поддерживается команда XCOPY (EXTENDED COPY), которая и говорит массиву что и куда скопировать, не вовлекая в этот процесс сервер и сеть.

Вроде как все должно быть просто, но так сходу я готовых скриптов не нашел, пришлось изобретать велосипед. Для ОС сервера был выбран Linux, а в качестве средства копирования команда ddpt (http://sg.danny.cz/sg/ddpt.html). Копировать с помощью такой комбинации можно любые тома от любой ОС, поскольку копирование идет поблочно на стороне СХД. Поскольку надо копировать поблочно, а количество блоков надо посчитать, то для подсчета количества таких итераций использовалась команда blockdev. Максимальный размер блока был получен опытным путем, с большим блоком ddpt не работал по факту. В итоге получился следующий довольно простой скрипт:

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

Давайте сделаем небольшую проверку! Ну как небольшую, 1ТБ файл создавался небыстро 🙂

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: wrong fs type, bad option, bad superblock on /dev/mapper/mpathfs, missing codepage or helper program, or other error. root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs mke2fs 1.44.1 (24-Mar-2018) Discarding device blocks: done Creating filesystem with 314572800 4k blocks and 78643200 inodes Filesystem UUID: bed3ea00-c181-4b4e-b52e-d9bb498be756 Superblock backups stored on blocks:         32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,         4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,         102400000, 214990848  Allocating group tables: done Writing inode tables: done Writing superblocks and filesystem accounting information: done  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 </dev/urandom > /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: wrong fs type, bad option, bad superblock on /dev/mapper/mpathfr, missing codepage or helper program, or other error. root@sales-demo-05:/home/vasilyk# cat xcopy.sh #!/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  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

Что в этот момент происходило на СХД:

image
Продолжим с Линуксом.

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# tail /xcopy_dest/1TB_file | strings .;Dj FcSxz DHIW ~oz( Eiok 5+9k gG7PZ BukF{IQ ?HW%Y pt[c$ |Xe, jV{a o:a' H<qD @5:] IeEr f(:H ^;xr v3F' NQ|E \t)?m ErKP [7zQB [\?ut tme@ w=zO *T3! root@sales-demo-05:/home/vasilyk# tail /xcopy_source/1TB_file | strings .;Dj FcSxz DHIW ~oz( Eiok 5+9k gG7PZ BukF{IQ ?HW%Y pt[c$ |Xe, jV{a o:a' H<qD @5:] IeEr f(:H ^;xr v3F' NQ|E \t)?m ErKP [7zQB [\?ut tme@ w=zO *T3! root@sales-demo-05:/home/vasilyk#

Все получилось, но тестируйте и используйте на свой страх и риск! Как исходный том лучше брать снепшоты, для начала.

ссылка на оригинал статьи https://habr.com/ru/post/515834/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *