Kopiranje nosilcev v sisteme za shranjevanje prek strežnika Linux z uporabo XCOPY

Zgodi se, da morate dobiti celotno kopijo nosilca znotraj enega sistema za shranjevanje podatkov (DSS), ne posnetka, klona, ​​ampak celotnega nosilca. Toda sistem za shranjevanje ne omogoča vedno, da se to izvede interno z lastnimi sredstvi. Zdi se, da je edina možnost kopiranje prek strežnika, toda v tem primeru bo celoten obseg podatkov šel skozi sam strežnik, omrežje do sistema za shranjevanje in vrat za shranjevanje, pri čemer bodo naložene vse te komponente. Obstajajo pa ukazi SCSI, ki vam lahko omogočijo, da naredite vse znotraj samega sistema za shranjevanje, in če vaš sistem podpira VAAI iz VMware, potem je skoraj 100 % podprt ukaz XCOPY (EXTENDED COPY), ki pove nizu, kaj in kam kopirati, brez vključevanja procesnega strežnika in omrežja.

Zdi se, da bi moralo biti vse preprosto, vendar nisem mogel takoj najti nobenega pripravljenega scenarija, zato sem moral znova izumiti kolo. Za strežniški OS je bil izbran Linux, kot orodje za kopiranje pa ukaz ddpt (http://sg.danny.cz/sg/ddpt.html). S to kombinacijo lahko kopirate poljubne nosilce iz katerega koli operacijskega sistema, saj se kopiranje izvaja blok za blokom na strani sistema za shranjevanje. Ker je treba kopirati blok za blokom in je treba prešteti število blokov, smo za štetje števila takih ponovitev uporabili ukaz blockdev. Največja velikost bloka je bila pridobljena eksperimentalno; ddpt dejansko ni deloval z velikim blokom. Rezultat je bil naslednji dokaj preprost skript:

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

Naredimo majhen pregled! No, kot majhna, 1TB datoteke ni hitro ustvaril in preveril 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: 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

Kaj se je v tistem trenutku dogajalo na sistemu za shranjevanje:

Kopiranje nosilcev v sisteme za shranjevanje prek strežnika Linux z uporabo XCOPY
Nadaljujmo z Linuxom.

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#

Vse je uspelo, vendar preizkusite in uporabite na lastno odgovornost! Kot izvorni obseg je za začetek bolje narediti posnetke.

Vir: www.habr.com

Dodaj komentar