Kopiering af mængder til lagersystemer via en Linux-server ved hjælp af XCOPY

Det sker, at du skal have en fuld kopi af en volumen inden for ét datalagringssystem (DSS), ikke et øjebliksbillede, en klon, men en fuld volumen. Men lagersystemet tillader dig ikke altid at gøre dette internt ved hjælp af dine egne midler. Det ser ud til, at den eneste mulighed er at kopiere gennem serveren, men i dette tilfælde vil hele mængden af ​​data blive kørt gennem selve serveren, netværket til lagersystemet og lagerportene, hvor alle disse komponenter indlæses. Men der er SCSI-kommandoer, der kan give dig mulighed for at gøre alt inden for selve lagersystemet, og hvis dit system understøtter VAAI fra VMware, så er det næsten 100%, at XCOPY (EXTENDED COPY) kommandoen er understøttet, som fortæller arrayet hvad og hvor man kopierer, uden at involvere processerver og netværk.

Det ser ud til, at alt skulle være enkelt, men jeg kunne ikke finde nogle færdige scripts med det samme, så jeg var nødt til at genopfinde hjulet. Linux blev valgt til server-OS, og ddpt-kommandoen (http://sg.danny.cz/sg/ddpt.html) blev valgt som kopieringsværktøj. Ved at bruge denne kombination kan du kopiere alle diskenheder fra et hvilket som helst operativsystem, da kopiering sker blok-for-blok på lagersystemsiden. Da det er nødvendigt at kopiere blok for blok, og antallet af blokke skal tælles, blev blockdev-kommandoen brugt til at tælle antallet af sådanne iterationer. Den maksimale blokstørrelse blev opnået eksperimentelt; ddpt fungerede faktisk ikke med en stor blok. Resultatet var følgende ret simple 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 tage et lille tjek! Nå, som en lille fil blev en 1TB fil ikke hurtigt oprettet og tjekket af 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

Hvad skete der på lagersystemet i det øjeblik:

Kopiering af mængder til lagersystemer via en Linux-server ved hjælp af 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#

Alt fungerede, men test og brug på eget ansvar! Som kildevolumen er det bedre at tage snapshots, for det første.

Kilde: www.habr.com

Tilføj en kommentar