Kopiowanie woluminów na macierz dyskową przez serwer Linux z użyciem XCOPY

Czasami zachodzi potrzeba uzyskania pełnej kopii wolumenu w ramach jednego systemu przechowywania danych (SAN), nie migawki, klonu, a właśnie pełnoprawnego wolumenu. Jednak nie zawsze SAN pozwala na to wewnętrznymi środkami. Wydaje się, że jedyną opcją jest kopiowanie przez serwer, ale wówczas cały wolumen danych będzie przesyłany przez sam serwer, sieć do SAN oraz porty SAN, obciążając wszystkie te komponenty. Istnieją jednak komendy SCSI, które mogą umożliwić wykonanie tego w ramach samego SAN, a jeśli Twój system wspiera VAAI od VMware, to praktycznie na pewno wspiera komendę XCOPY (EXTENDED COPY), która informuje macierz co i gdzie skopiować, nie angażując w ten proces serwer i sieć.

Wydaje się, że wszystko powinno być proste, ale od razu nie znalazłem gotowych skryptów, musiałem wymyślić koło na nowo. Dla systemu operacyjnego serwera wybrano Linux, a jako narzędzie do kopiowania użyto komendy ddpt (http://sg.danny.cz/sg/ddpt.html). Dzięki tej kombinacji można kopiować dowolne wolumeny z dowolnego systemu operacyjnego, ponieważ kopiowanie odbywa się blokowo po stronie SAN. Ponieważ trzeba kopiować blokowo, a liczba bloków musi być obliczona, użyto komendy blockdev do obliczenia liczby takich iteracji. Maksymalny rozmiar bloku uzyskano empirycznie, z większym blokiem ddpt nie działał w praktyce. Ostatecznie uzyskano dość prosty skrypt:

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

Zróbmy małą weryfikację! Cóż, jak małą, plik 1TB był tworzony i sprawdzany przez md5sum niezbyt szybko 🙂

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: zły typ systemu plików, zła opcja, zły superblok na /dev/mapper/mpathfs, brak kodu strony lub programu pomocniczego, lub inny błąd.
root@sales-demo-05:/home/vasilyk# mkfs /dev/mapper/mpathfs
mke2fs 1.44.1 (24-Mar-2018)
Usuwanie bloków urządzenia: zakończono
Tworzenie systemu plików z 314572800 blokami 4k i 78643200 inode'ami
UUID systemu plików: bed3ea00-c181-4b4e-b52e-d9bb498be756
Kopie zapasowe superbloku zapisane na blokach:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Przydzielanie tabel grup: zakończone
Pisanie tabel inode'ów: zakończone
Pisanie superbloków i informacji o rozliczeniach systemu plików: zakończone

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: zły typ systemu plików, zła opcja, zły superblok na /dev/mapper/mpathfr, brak kodu strony lub programu pomocniczego, lub inny błąd.
root@sales-demo-05:/home/vasilyk# cat xcopy.sh
#!/bin/bash
# pierwszy parametr = urządzenie wejściowe
# drugi parametr = urządzenie wyjściowe
# rozmiar urządzenia musi być taki sam
# zmiana zmiennej bs może zwiększyć prędkość, maksymalna prędkość powinna być przy bs=32768. 32768 to maksymalna ustawienie, niższe ustawienia powinny być obliczane dzieląc przez 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

Co się działo w tym momencie na SCD:

Kopiowanie woluminów na macierz dyskową przez serwer Linux z użyciem XCOPY
Kontynuujemy z Linuksem.

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#

Udało się, ale testuj i używaj na własne ryzyko! Jako źródło najlepiej robić migawki.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster