Kopiera volymer till lagringssystem via en Linux-server med XCOPY

Det händer att du behöver få en fullständig kopia av en volym inom ett datalagringssystem (DSS), inte en ögonblicksbild, en klon, utan en hel volym. Men lagringssystemet tillåter inte alltid att detta görs internt med egna medel. Det verkar som att det enda alternativet är att kopiera via servern, men i det här fallet kommer hela datavolymen att drivas genom själva servern, nätverket till lagringssystemet och lagringsportarna, och laddar alla dessa komponenter. Men det finns SCSI-kommandon som kan låta dig göra allt inom själva lagringssystemet, och om ditt system stöder VAAI från VMware, så är det nästan 100 % som XCOPY (EXTENDED COPY)-kommandot stöds, vilket talar om för arrayen vad och var att kopiera, utan att involvera processserver och nätverk.

Det verkar som att allt borde vara enkelt, men jag kunde inte hitta några färdiga skript direkt, så jag var tvungen att uppfinna hjulet på nytt. Linux valdes för serveroperativsystemet och kommandot ddpt (http://sg.danny.cz/sg/ddpt.html) valdes som kopieringsverktyg. Med den här kombinationen kan du kopiera alla volymer från vilket operativsystem som helst, eftersom kopiering sker block-för-block på lagringssystemsidan. Eftersom det är nödvändigt att kopiera block för block, och antalet block måste räknas, användes blockdev-kommandot för att räkna antalet sådana iterationer. Den maximala blockstorleken erhölls experimentellt; ddpt fungerade faktiskt inte med ett stort block. Resultatet blev följande ganska enkla manus:

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

Låt oss göra en liten koll! Tja, som en liten, skapades inte en 1TB-fil snabbt och kontrollerades av 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

Vad hände på lagringssystemet just då:

Kopiera volymer till lagringssystem via en Linux-server med XCOPY
Låt oss fortsätta 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 löste sig, men testa och använda på egen risk! Som källvolym är det bättre att ta ögonblicksbilder, till att börja med.

Källa: will.com

Lägg en kommentar