[Системное администрирование, IT-инфраструктура, Хранение данных] Копирование томов на СХД через Linux сервер с использованием XCOPY

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
19-Авг-2020 20:42

Бывает, что нужно получить полную копию тома в рамках одной системы хранения данных (СХД), не снимок, клон, а именно полноценный том. Но не всегда СХД дает это сделать внутри себя собственными средствами. Вроде единственный вариант копировать через сервер, но при этом весь объем данных будет гоняться через сам сервер, сеть до СХД и порты СХД, нагружая все эти компоненты. Но есть 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
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

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

Продолжим с Линуксом.
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#

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

Похожие новости: Теги для поиска: #_sistemnoe_administrirovanie (Системное администрирование), #_itinfrastruktura (IT-инфраструктура), #_hranenie_dannyh (Хранение данных), #_shd (схд), #_infrastruktura (инфраструктура), #_infrastruktura_tsod (инфраструктура цод), #_arhitektura_tsod (архитектура цод), #_sistemnoe_administrirovanie (
Системное администрирование
)
, #_itinfrastruktura (
IT-инфраструктура
)
, #_hranenie_dannyh (
Хранение данных
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 03:28
Часовой пояс: UTC + 5