Sao chép ổ đĩa vào hệ thống lưu trữ thông qua máy chủ Linux bằng XCOPY

Điều xảy ra là bạn cần có một bản sao đầy đủ của một tập trong một hệ thống lưu trữ dữ liệu (DSS), không phải một bản chụp nhanh, một bản sao mà là một tập đầy đủ. Nhưng hệ thống lưu trữ không phải lúc nào cũng cho phép thực hiện việc này trong nội bộ bằng các phương tiện riêng của nó. Có vẻ như lựa chọn duy nhất là sao chép qua máy chủ, nhưng trong trường hợp này toàn bộ khối lượng dữ liệu sẽ được điều khiển qua chính máy chủ, mạng tới hệ thống lưu trữ và các cổng lưu trữ, tải tất cả các thành phần này. Nhưng có các lệnh SCSI có thể cho phép bạn thực hiện mọi thứ trong chính hệ thống lưu trữ và nếu hệ thống của bạn hỗ trợ VAAI từ VMware, thì gần như 100% lệnh XCOPY (EXTENDED COPY) được hỗ trợ, lệnh này cho biết mảng gì và sao chép ở đâu mà không liên quan đến máy chủ xử lý và mạng.

Có vẻ như mọi thứ đều đơn giản, nhưng tôi không thể tìm thấy bất kỳ kịch bản làm sẵn nào ngay lập tức, vì vậy tôi phải phát minh lại cái bánh xe. Linux đã được chọn cho hệ điều hành máy chủ và lệnh ddpt (http://sg.danny.cz/sg/ddpt.html) đã được chọn làm công cụ sao chép. Bằng cách sử dụng kết hợp này, bạn có thể sao chép bất kỳ ổ đĩa nào từ bất kỳ hệ điều hành nào vì quá trình sao chép diễn ra theo từng khối ở phía hệ thống lưu trữ. Vì cần phải sao chép từng khối và phải đếm số khối nên lệnh blockdev được sử dụng để đếm số lần lặp như vậy. Kích thước khối tối đa đạt được bằng thực nghiệm; ddpt không thực sự hoạt động với khối lớn. Kết quả là tập lệnh khá đơn giản sau:

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

Hãy kiểm tra một chút nhé! Chà, vì là một tệp nhỏ, tệp 1TB không được md5sum tạo và kiểm tra nhanh chóng :)

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

Điều gì đang xảy ra trên hệ thống lưu trữ tại thời điểm đó:

Sao chép ổ đĩa vào hệ thống lưu trữ thông qua máy chủ Linux bằng XCOPY
Hãy tiếp tục với 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#

Mọi thứ đều ổn, nhưng bạn phải tự chịu rủi ro khi thử nghiệm và sử dụng! Là một khối nguồn, tốt hơn hết bạn nên chụp ảnh nhanh để bắt đầu.

Nguồn: www.habr.com

Thêm một lời nhận xét