Копиране на томове на СХД чрез 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ТБ се създаде и проверяваше с md5sum не бързо 🙂

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: грешен тип файловата система, лоша опция, лош суперблок на /dev/mapper/mpathfs, липсва кодова страница или помощна програма, или друга грешка.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Изтриване на блокове на устройството: готово
Създаване на файловата система с 314572800 4k блока и 78643200 инода
UUID на файловата система: bed3ea00-c181-4b4e-b52e-d9bb498be756
Резервни копия на суперблокове, съхранени на блокове:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Заделят се таблици за групи: готово
Запис на таблици за иноди: готово
Запис на суперблокове и информация за счетоводството на файловата система: готово

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: грешен тип файловата система, лоша опция, лош суперблок на /dev/mapper/mpathfr, липсва кодова страница или помощна програма, или друга грешка.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#!/bin/bash
# първи параметър = входно устройство
# втори параметър = изходно устройство
# размерът на устройството трябва да е същия
# промяната на променливата bs може да намали скоростта, максималната скорост трябва да бъде при bs=32768. 32768 е максималната настройка, по-ниските настройки трябва да се изчисляват, делейки на 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

Какво се случва в този момент на СХД:

Копиране на томове на СХД чрез Linux сървър с използване на XCOPY
Продължаваме с 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#

Всичко е наред, но тестването и използването е на ваш риск! По-добре е да се вземат снимки от оригиналния том за начало.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster