Hướng dẫn sử dụng Rsync – command đồng bộ dữ liệu trên linux

I. Lệnh Rsync 

Rsync (Remote Sync) là lệnh được sử dụng phổ biến để sao chép và đồng bộ hóa các tệp, thư mục từ xa cũng như cục bộ trong các hệ thống Linux/Unix.
Với sự trợ giúp của lệnh rsync, có thể sao chép và đồng bộ dữ liệu từ xa và nội bộ trên các thư mục, ổ đĩa và mạng, thực hiện sao lưu dữ liệu và nhân bản giữa hai máy chủ Linux.

Cú pháp lệnh Rsync

rsync [options] source destination 

các tùy chọn dùng với lệnh rsync
-v verbose output, hiển thị thông tin chi tiết về quá trình xử lí chuyển dữ liệu.

-r sao chép dữ liệu theo cách đệ quy, không lưu giữ dấu thời gian và quyền trong khi chuyển dữ liệu.

-a chế độ lưu trữ, sao chép tệp đệ quy và duy trì các liên kết tượng trưng, quyền truy cập tệp, quyền sở hữu của người dùng và nhóm cũng như dấu thời gian.

-z nén tệp trong khi chuyển để giảm mức sử dụng mạng.

-h người dùng có thể đọc, in ra số ở định dạng người có thể đọc được

-P hiển thị tiến độ trong quá trình chuyển

SOURCE chỉ định (các) tệp hoặc thư mục nguồn sẽ được chuyển, có thể là vị trí cục bộ hoặc vị trí từ xa.

DESTINATION chỉ định đường dẫn đích nơi các tệp hoặc thư mục sẽ được sao chép. Tương tư như Source, nó có thể là đường dẫn cục bộ

II. Cài đặt Rsync trên Linux

Chúng ta có thể cài đặt rsync với trình cài đặt mặc định theo của từng hệ điều hành.

$ sudo apt install rsync         [trên Debian, UbuntuMint ]
$ sudo yum install rsync         [trên RHEL/CentOS/FedoraRocky/AlmaLinux]
$ sudo emerge -a sys-apps/rsync  [trên Gentoo Linux]
$ sudo apk add rsync             [trên Alpine Linux]
$ sudo pacman -S rsync           [trên Arch Linux]
$ sudo zypper install rsync      [trên OpenSUSE]

III. Một số trường hợp sử dụng lệnh Rsync

1. Sao chép/đồng bộ tệp cục bộ

Để sao chép hoặc đồng bộ hóa tệp cục bộ, bạn có thể dùng lệnh sau để đồng bộ hóa tệp trên máy cục bộ từ vị trí này sang vị trí khác.

Ví dụ tên tệp source-backup.tar cần sao chép hoặc đồng bộ vào thư mục /tmp/backups.

[root@longvan]# rsync -zvh source-backup.tar.gz /tmp/backups/

created directory /tmp/backups
backup.tar.gz

sent 448.54K bytes  received 70 bytes  889.21K bytes/sec
total size is 448.40K  speedup is 1.00

Như ví vụ trên, có thể thấy rằng này nếu thư mục đến chưa tồn tại thì rsync tự động tạo một thư mục.

2. Sao chép/đồng bộ thư mục cục bộ

Lệnh bên dưới sẽ chuyển hoặc đồng bộ tất cả tệp từ thư mục này sang thư mục khác trong cùng một máy chủ.

Trong ví dụ này, /root/rpmpkgs chứa các tệp rpm package và ở đây sẽ thư mục này được sao chép vào bên trong thư mục /tmp/backups/.

[root@longvan]# rsync -avzh /root/rpmpkgs /tmp/backups/

sending incremental file list
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm

sent 3.47M bytes  received 96 bytes  2.32M bytes/sec
total size is 3.74M  speedup is 1.08

3. Sao chép thư mục từ máy chủ cục bộ sang máy chủ từ xa

Để sao chép một thư mục từ máy chủ cục bộ sang máy chủ từ xa, bạn có thể dùng lệnh sau để đồng bộ hóa thư mục từ máy cục bộ sang máy từ xa.

Ví dụ: nếu có một thư mục trong máy tính cục bộ của bạn “rpmpkgs” chứa các RPM packages và bạn muốn nội dung của thư mục cục bộ đó gửi đến máy chủ từ xa, bạn có thể dùng lệnh sau.

# rsync -avzh /root/rpmpkgs root@192.168.1.123:/root/

The authenticity of host '192.168.1.123 (192.168.1.123)' can't be established.
ED25519 key fingerprint is SHA256:bH2tiWQn4S5o6qmZhmtXcBROV5TU5H4t2C42QDEMx1c.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.123' (ED25519) to the list of known hosts.
root@192.168.1.123's password: 
sending incremental file list
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm

sent 3.74M bytes  received 96 bytes  439.88K bytes/sec
total size is 3.74M  speedup is 1.00

4. Sao chép thư mục từ xa sang máy chủ cục bộ

Lệnh này sẽ giúp bạn đồng bộ thư mục từ xa với thư mục cục bộ. Ở đây thư mục /root/rpmpkgs trên máy chủ từ xa đang được sao chép vào máy tính cục bộ của bạn trong /tmp/myrpms.

# rsync -avzh root@192.168.1.123:/root/rpmpkgs /tmp/myrpms

root@192.168.1.123's password: 
receiving incremental file list
created directory /tmp/myrpms
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm

sent 104 bytes  received 3.49M bytes  997.68K bytes/sec
total size is 3.74M  speedup is 1.07

5. Rsync qua SSH

Với rsync, có thể sử dụng SSH (Secure Shell) để truyền dữ liệu, sử dụng giao thức SSH trong khi truyền dữ liệu, có thể đảm bảo rằng dữ liệu của mình đang được truyền trong một kết nối bảo mật bằng mã hóa để không ai có thể đọc dữ liệu của bạn trong khi nó đang được truyền qua WAN.

Ngoài ra khi sử dụng rsync, cần cung cấp mật khẩu người dùng root để hoàn thành tác vụ cụ thể, vì vậy việc dùng tùy chọn SSH sẽ gửi thông tin đăng nhập của bạn theo cách được mã hóa để mật khyẩu của bạn được an toàn.

Để sử dụng rsync qua SSH, có thể sử dụng tùy chọn -e để chỉ định lệnh shell từ xa, thường là ssh như bên dưới

rsync [OPTIONS] -e ssh /path/to/source user@remote:/path/to/destination

6. Sao chép tệp từ máy chủ từ xa sang cục bộ bằng SSH

Để đồng bộ hóa tệp từ máy chủ từ xa đến máy chủ cục bộ, bạn có thể chỉ định giao thức với rsync bằng tùy chọn -e với tên giao thức bạn muốn sử dụng.

Ở đây sẽ sử dụng ssh với tùy chọn -e và thực hiện truyền dữ liệu.

# rsync -avzhe ssh root@192.168.1.123:/root/anaconda-ks.cfg /tmp

root@192.168.0.141's password: 
receiving incremental file list
anaconda-ks.cfg

sent 43 bytes  received 1.10K bytes  325.43 bytes/sec
total size is 1.90K  speedup is 1.67

7. Sao chép tệp từ máy chủ cục bộ sang máy chủ từ xa bằng SSH

Để đồng bộ hóa tệp từ máy chủ cục bộ với máy chủ từ xa bằng SSH, bạn có thể tận dụng lệnh sau như bên dưới.

# rsync -avzhe ssh backup.tar.gz root@192.168.0.141:/backups/

root@192.168.1.123's password: 
sending incremental file list
created directory /backups
backup.tar.gz

sent 224.59K bytes  received 66 bytes  64.19K bytes/sec
total size is 224.40K  speedup is 1.00

8. Hiển thị tiến trình trong khi truyền dữ liệu bằng Rsync

Để hiển thị tiến trình trong khi truyền dữ liệu từ máy này sang máy khác, sử dụng tùy chọn –progress, tùy chọn này sẽ hiển thị các tệp và thời gian còn lại để hoàn tất quá trình truyền.

# rsync -avzhe ssh --progress /root/rpmpkgs root@192.168.0.141:/root/rpmpkgs

root@192.168.1.123's password: 
sending incremental file list
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
          1.47M 100%   31.80MB/s    0:00:00 (xfr#1, to-chk=3/5)
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
        138.01K 100%    2.69MB/s    0:00:00 (xfr#2, to-chk=2/5)
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
          2.01M 100%   18.45MB/s    0:00:00 (xfr#3, to-chk=1/5)
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm
        120.48K 100%    1.04MB/s    0:00:00 (xfr#4, to-chk=0/5)

sent 3.74M bytes  received 96 bytes  1.50M bytes/sec
total size is 3.74M  speedup is 1.00

9. Gồm các tệp có phần mở rộng đặc biệt với rsync

Để ấn định các tệp hoặc mẫu cụ thể trong quá trình hoạt động rsync, sử dụng tùy chọn –include với tiện ích mở rộng phù hợp với tất cả các tệp.

# rsync -avz --include='*.txt' /path/to/source/ user@remote:/path/to/destination/

Rsync sẽ chỉ bao gồm các tệp có phần đuôi .txt từ thư mục /path/to/source/ trong quá trình truyền

10. Loại trừ các tệp có phần mở rộng cụ thể bằng rsync

Tương tự để loại trừ một tiện ích mở rộng cụ thể trong quá trình hoạt động rsync, sử dụng tùy chọn –exclude với mẫu ký tự đại diện cần loại bỏ.

# rsync -avz --exclude='*.ext' /path/to/source/ user@remote:/path/to/destination/

Rsync sẽ loại trừ các tệp có phần mở rộng được chỉ định (*.ext) trong quá trình truyền, đồng thời bao gồm tất cả các tệp và thư mục khác.

11. Bao gồm và loại trừ các tệp bằng rsync

Để bao gồm và loại trừ các tệp hoặc mẫu cụ thể trong quá trình hoạt động rsync,
có thể sử dụng cả hai tùy chọn –include–exclude với các mẫu ký tự đại diện thích hợp.

Hai tùy chọn này cho phép chúng ta bao gồm và loại trừ các tệp bằng cách chỉ định các tham số. Tùy chọn này giúp chúng tôi chỉ định các tệp hoặc thư mục mà bạn muốn đưa vào đồng bộ hóa và loại trừ các tệp, thư mục không muốn chuyển.

lệnh rsync sẽ chỉ bao gồm các tệp và thư mục bắt đầu bằng R và loại trừ tất cả các tệp và thư mục khác.

# rsync -avze ssh --include 'R*' --exclude '*' root@192.168.1.123:/var/lib/rpm/ /root/rpm

12. Sử dụng -delete với rsync

Nếu tệp hoặc một thư mục không tồn tại ở nguồn nhưng đã tồn tại ở đích, bạn có thể muốn xóa tệp/thư mục hiện có đó ở đích để đồng bộ hóa.

Chúng ta có thể sử dụng tùy chọn –delete để xóa các tệp không có trong thư mục nguồn.

Nguồn và đích được đồng bộ hóa. và hãy tạo một tệp test.txt để kiểm chứng

[root@longvan:~]# cd /root/rpm/
[root@longvan:~/rpm]# touch test.txt
[root@longvan:~/rpm]# rsync -avz --delete root@192.168.1.132:/var/lib/rpm/ /root/rpm/

root@192.168.1.132's password: 
receiving incremental file list
deleting test.txt
./
.dbenv.lock
.rpm.lock
Basenames
Conflictname
Dirnames
Enhancename
Filetriggername
Group
Installtid
Name
Obsoletename
Packages
Providename
Sha1header
Sigmd5
Suggestname
Supplementname
Transfiletriggername
Triggername
__db.001
__db.002
__db.003

sent 445 bytes  received 18,543,954 bytes  2,472,586.53 bytes/sec
total size is 71,151,616  speedup is 3.84

13. Đặt giới hạn truyền tệp bằng Rsync

Bạn có thể chỉ định kích thước tệp tối đa sẽ được chuyển hoặc đồng bộ hóa.
Có thể làm điều đó với tùy chọn –max-size. Ở đây kích thước tệp tối đa là 200k, nên lệnh này sẽ chỉ chuyển những tệp bằng hoặc nhỏ hơn 200k.

# rsync -avzhe ssh --max-size='200k' /var/lib/rpm/ root@192.168.1.123:/root/tmprpm

root@192.168.1.123's password: 
sending incremental file list
created directory /root/tmprpm
./
.dbenv.lock
.rpm.lock
Conflictname
Enhancename
Filetriggername
Group
Installtid
Name
Obsoletename
Recommendname
Requirename
Sha1header
Sigmd5
Suggestname
Supplementname
Transfiletriggername
Triggername
__db.002

sent 129.52K bytes  received 396 bytes  28.87K bytes/sec
total size is 71.15M  speedup is 547.66

14. Tự động xóa tập tin nguồn sau khi chuyển

Trường hợp nếu bạn có một máy chủ web chính và máy chủ sao lưu dữ liệu, bạn đã tạo bản sao lưu hàng ngày và động bộ hóa với máy chủ dữ phòng của mình, nhưng bây giờ bạn không muốn giữ bản sao lưu cục bộ đó trong máy chủ web của mình.

Vì vậy, bạn sẽ đợi quá trình chuyển hoàn tất rồi xóa tệp sao lưu cục bộ đó theo cách thủ công không? Dĩ nhiên là không. Việc xóa tự động này có thể được thực hiện bằng các sử dụng tùy chọn –remove-source-files

# rsync --remove-source-files -zvh backup.tar.gz root@192.168.1.123:/tmp/backups/

root@192.168.1.123's password: 
backup.tar.gz

sent 795 bytes  received 2.33K bytes  894.29 bytes/sec
total size is 267.30K  speedup is 85.40

[root@longvan:~]# ls -l backup.tar.gz

ls: cannot access 'backup.tar.gz': No such file or directory

15. Chạy thử với Rsync

Nếu bạn mới sử dụng rsync và không biết chính xác lệnh hoạt động ra sao. Rsync thực sự có thể làm xáo trộn mọi thứ trong thư mục đích của bạn và sau đó làm hỏng mọi thứ.

Việc sử dụng tùy chọn này sẽ không thực hiện bất ký thay đổi nào với các tệp và hiển thị đầu ra của lệnh, nếu đầu ra hiển thị chính xác như bạn muốn thì bạn có thể xóa tùy chọn –dry-run khỏi lệnh của mình và chạy trên thiết bị đầu cuối.

# rsync --dry-run --remove-source-files -zvh backup.tar.gz root@192.168.1.123:/tmp/backups/

root@192.168.1.123's password: 
backup.tar.gz

sent 50 bytes  received 19 bytes  19.71 bytes/sec
total size is 267.30K  speedup is 3,873.97 (DRY RUN)

16. Đặt giới hạn băng thông và truyền tệp trong lệnh rsync

Bạn có thể đặt giới hạn băng thông trong khi truyền dữ liệu từ máy này sang máy khác với sự trợ giúp của tùy chọn –bwlimit. Tùy chọn này giúp chúng ta giới hạn băng thông I/O.

# rsync --bwlimit=100 -avzhe ssh  /var/lib/rpm/  root@192.168.1.123:/root/tmprpm/
root@192.168.1.123's password:
sending incremental file list
sent 324 bytes  received 12 bytes  61.09 bytes/sec
total size is 38.08M  speedup is 113347.05

Ngoài ra, theo mặc định rsync chỉ đồng bộ hóa các khối và byte đã thay đổi, nếu bạn muốn đồng bộ hóa toàn bộ tệp một các rõ ràng thì bạn sử dụng tùy chọn -W với nó.

# rsync -zvhW backup.tar /tmp/backups/backup.tar
backup.tar
sent 14.71M bytes  received 31 bytes  3.27M bytes/sec
total size is 16.18M  speedup is 1.10