Ibland behöver man fÄ en fullstÀndig kopia av en volym inom ett lagringssystem (SAN), inte en snapshot, utan en riktig volym. Men det Àr inte alltid som SAN kan erbjuda detta med sina egna medel. Det verkar som den enda lösningen Àr att kopiera via servern, men dÄ kommer hela datamÀngden att skickas genom sjÀlva servern, nÀtverket till SAN och SAN-portarna, vilket belastar alla dessa komponenter. Men det finns SCSI-kommandon som kan möjliggöra detta inom SAN, och om ditt system stöder VAAI frÄn VMware, Àr det nÀstan 100% sÀkert att kommandot XCOPY (EXTENDED COPY) stöds, vilket anvisar arrayen vad som ska kopieras och vart, utan att involvera dessa processer. server och nÀtverket.
Det borde vara ganska enkelt, men jag kunde inte snabbt hitta nÄgra fÀrdiga skript, sÄ jag fick hitta pÄ nÄgot sjÀlv. För operativsystemet servern valdes Linux, och som kopieringsmedel anvÀndes kommandot ddpt (http://sg.danny.cz/sg/ddpt.html). Med denna kombination kan man kopiera alla volymer frÄn vilket operativsystem som helst, eftersom kopieringen gÄr blockvis pÄ SAN-sidan. Eftersom blocken mÄste kopieras blockvis och antalet block mÄste rÀknas, anvÀndes kommandot blockdev för att rÀkna antalet iterationer. Den maximala blockstorleken erhölls genom försök, med ett större block fungerade ddpt inte i praktiken. Resultatet blev följande ganska enkla 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 ))
doneLĂ„t oss göra en liten kontroll! Ja, en liten sĂ„, en 1TB-fil skapades och md5sum kontrollerades inte sĂ„ snabbt đ
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: felaktig filsystemstyp, dÄligt alternativ, dÄlig superblock pÄ /dev/mapper/mpathfs, saknad teckenkod eller hjÀlpprogram, eller annat fel.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-mar-2018)
Avbryter enhetens block: klart
Skapar filsystem med 314572800 4k block och 78643200 inoder
Filsystem UUID: bed3ea00-c181-4b4e-b52e-d9bb498be756
Superblock sÀkerhetskopior lagrade pÄ block:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Allokerar grupp tabeller: klart
Skriver inode-tabeller: klart
Skriver superblock och filsystem konto-information: klart
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: felaktig filsystemstyp, dÄligt alternativ, dÄlig superblock pÄ /dev/mapper/mpathfr, saknad teckenkod eller hjÀlpprogram, eller annat fel.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#! /bin/bash
# första parametern = in-enhet
# andra parametern = ut-enhet
# enhetsstorleken mÄste vara densamma
# Àndra bs-variabeln kan minska hastighet, maximal hastighet bör vara vid bs=32768. 32768 Àr högsta instÀllningen, lÀgre instÀllningar bör berÀknas genom att dela 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.657sVad som hÀnde vid detta tillfÀlle pÄ Lagringssystemet:

Vi fortsÀtter 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#Allt fungerade, men testa och anvÀnd pÄ egen risk! Som kÀllvolym Àr det bÀst att ta snapshots först.
KĂ€lla: habr.com
