Kopiering af volumener på SAN via Linux-server med XCOPY

Nogle gange er det nødvendigt at få en fuld kopi af en volumen inden for et lagringssystem (SAN), ikke et snapshot eller en klon, men en egentlig fungerende volumenenhed. Men ikke altid tillader SAN'en os at gøre dette ved hjælp af sine egne ressourcer. Det virker som om den eneste mulighed er at kopiere via serveren, men hele datamængden vil blive sendt gennem selve serveren, netværket til SAN'en og portene på SAN'en, hvilket belaster alle disse komponenter. Men der findes SCSI-kommandoer, som kan give os mulighed for at gøre alt inden for selve SAN'en, og hvis dit system understøtter VAAI fra VMware, så er det næsten 100% sikkert, at kommandoen XCOPY (EXTENDED COPY) understøttes, hvilket instruerer arrayet hvad der skal kopieres og hvor, uden at involvere disse processer. server og netværket.

Det burde være ganske enkelt, men jeg kunne ikke finde færdige scripts med det samme, så jeg måtte opfinde cyklen igen. For OS server blev Linux valgt, og som kopieringsværktøj blev ddpt-kommandoen (http://sg.danny.cz/sg/ddpt.html) valgt. Med denne kombination kan man kopiere enhver volumen fra enhver OS, da kopieringen foregår blok for blok på SAN'en. Da vi skal kopiere blok for blok, og antallet af blokke skal tælles, blev blockdev-kommandoen brugt til at tælle antallet af disse iterationer. Den maksimale blokstørrelse blev bestemt gennem forsøg, da ddpt reelt ikke fungerede med større blokke. Resultatet blev et ret simpelt script:

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

Lad os lave en lille kontrol! Nå, ikke så lille, en 1TB fil blev oprettet og md5sum blev kontrolleret langsomt 🙂

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: forkert fs-type, dårlig indstilling, dårlig superblock på /dev/mapper/mpathfs, manglende kodepage eller hjælpeprogram, eller anden fejl.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Frigiver enhedsblokke: færdig
Opretter filsystem med 314572800 4k blokke og 78643200 inoder
Filsystem UUID: bed3ea00-c181-4b4e-b52e-d9bb498be756
Superblock-backups gemt på blokke:
		32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
		4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
		102400000, 214990848

Allokerer gruppetabeller: færdig
Skriver inode-tabeller: færdig
Skriver superblokke og filsystemregnskabsoplysninger: færdig

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: forkert fs-type, dårlig indstilling, dårlig superblock på /dev/mapper/mpathfr, manglende kodepage eller hjælpeprogram, eller anden fejl.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#! /bin/bash
# første parameter = input-enhed
# anden parameter = output-enhed
# enheds størrelse skal være den samme
# ændring af bs-variablen kan nedsætte hastigheden, maks hastighed skal være ved bs=32768. 32768 er maks indstilling, lavere indstillinger skal beregnes ved at dividere med 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

Hvad der skete på lagringssystemet på dette tidspunkt:

Kopiering af volumener på SAN via Linux-server med XCOPY
Lad os fortsætte med 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#

Det lykkedes, men test og brug på egen risiko! Det er bedst at tage snapshots af kildevolumen.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster