11 ví dụ lệnh Rsync trên Centos / Ubuntu / Debian / Fedora

Với sự trợ giúp của lệnh rsync, bạn có thể sao chép và đồng bộ hóa dữ liệu của mình từ xa và cục bộ giữa các thư mục, đĩa và mạng, thực hiện sao lưu dữ liệu và tạo bản sao giữa hai máy Linux. 

Một số ưu điểm và tính năng của lệnh rsync:

  • Sao chép và đồng bộ dữ liệu một cách hiệu quả đến hoặc từ một hệ thống từ xa.
  • Hỗ trợ sao chép liên kết, thiết bị, chủ sở hữu, nhóm và quyền truy cập.
  • Nhanh hơn scp (Secure Copy) vì rsync sử dụng giao thức cập nhật từ xa cho phép truyền tải chỉ những sự khác biệt giữa hai tập hợp tệp. Lần đầu tiên, nó sao chép toàn bộ nội dung của một tệp hoặc thư mục từ nguồn đến đích, nhưng từ lần sau, nó chỉ sao chép những khối và byte đã thay đổi đến đích.
  • Rsync sử dụng ít băng thông hơn vì nó sử dụng phương pháp nén và giải nén trong quá trình gửi và nhận dữ liệu ở cả hai đầu.

Cú pháp cơ bản của lệnh rsync.

# rsync options source destination

Một số tùy chọn thông dụng được sử dụng với lệnh rsync:

  • -v: Chi tiết.
  • -r: Sao chép dữ liệu theo cách đệ quy (nhưng không bảo quản thời gian và quyền truy cập khi truyền tải dữ liệu).
  • -a: Chế độ lưu trữ, cho phép sao chép tệp một cách đệ quy và bảo tồn liên kết tượng trưng, quyền truy cập tệp, sở hữu người dùng và nhóm, và thời gian.
  • -z: Nén dữ liệu tệp.
  • -h: Hiển thị dữ liệu số dưới dạng định dạng đọc được cho con người.

Cài đặt Rsync trên hệ thống Linux

Cài đặt gói rsync bằng lệnh sau trên bản phân phối Linux.

$ sudo apt-get install rsync   [On Debian/Ubuntu & Mint] 
$ pacman -S rsync              [On Arch Linux]
$ emerge sys-apps/rsync        [On Gentoo]
$ sudo yum install rsync       [On Fedora/CentOS/RHEL and Rocky Linux/AlmaLinux]
$ sudo zypper install rsync    [On openSUSE]

Sao chép/đồng bộ tệp và thư mục cục bộ bằng lệnh rsync

2.1 Sao chép/đồng bộ một tệp trên máy tính cục bộ

Lệnh sau sẽ đồng bộ một tệp duy nhất trên máy cục bộ từ một vị trí này sang một vị trí khác. Ví dụ, trong ví dụ trên, tên tệp backup.tar cần được sao chép hoặc đồng bộ đến thư mục /tmp/backups/. 

# rsync -zvh backup.tar.gz /tmp/backups/

created directory /tmp/backups
backup.tar.gz
sent 224.54K bytes  received 70 bytes  449.21K bytes/sec
total size is 224.40K  speedup is 1.00

Trong ví dụ trên, bạn có thể thấy rằng nếu đích chưa tồn tại, rsync sẽ tự động tạo một thư mục cho đích.

2.2 Sao chép/đồng bộ một thư mục trên máy tính cục bộ

Lệnh sau sẽ chuyển hoặc đồng bộ tất cả các tệp từ một thư mục này sang một thư mục khác trên cùng máy. Ví dụ, trong ví dụ này, /root/rpmpkgs chứa một số tệp gói rpm và bạn muốn sao chép thư mục đó vào trong thư mục /tmp/backups/.

# 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

Lệnh rsync sao chép/đồng bộ tệp và thư mục

3.1 Sao chép một thư mục từ máy chủ cục bộ đến máy chủ xa

Lệnh này sẽ đồng bộ một thư mục từ máy cục bộ đến một máy từ xa. Ví dụ, nếu có một thư mục trên máy tính cục bộ có tên "rpmpkgs" chứa một số gói RPM và bạn muốn gửi nội dung của thư mục cục bộ đó đến một máy chủ từ xa, bạn có thể sử dụng lệnh sau.

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

The authenticity of host '192.168.0.141 (192.168.0.141)' 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.0.141' (ED25519) to the list of known hosts.
root@192.168.0.141'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

3.2 Sao chép/đồng bộ một thư mục từ máy chủ xa đến máy tính cục bộ

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

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

root@192.168.0.141'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

Lưu ý: Việc sử dụng lệnh rsync để sao chép hoặc đồng bộ dữ liệu là một công việc quan trọng, vì vậy hãy đảm bảo bạn đã nắm vững các tùy chọn và cú pháp trước khi thực hiện.

Rsync qua SSH

Sử dụng SSH (Secure Shell) để truyền dữ liệu với rsync, sử dụng giao thức SSH trong quá trình truyền dữ liệu giúp đảm bảo dữ liệu của bạn đang được truyền trong một kết nối an toàn với mã hóa, không ai có thể đọc dữ liệu trong quá trình truyền qua mạng internet.

Khi sử dụng rsync, chúng ta cần cung cấp mật khẩu người dùng/root để hoàn thành tác vụ cụ thể. Việc sử dụng tùy chọn SSH sẽ gửi thông tin đăng nhập theo cách mã hóa để bảo mật mật khẩu.

4.1 Sao chép một tệp từ máy chủ xa đến máy chủ cục bộ qua SSH

Để chỉ định một giao thức với rsync, sử dụng tùy chọn "-e" với tên giao thức bạn muốn sử dụng. Ở ví dụ này, chúng ta 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.0.141:/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

4.2 Sao chép một tệp từ máy chủ cục bộ đến máy chủ xa qua SSH

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

boot@192.168.0.141'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

Hiển thị tiến trình trong quá trình truyền dữ liệu với rsync

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

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

root@192.168.0.141'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

Sử dụng tùy chọn --include và --exclude

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 tham số với các tùy chọn này để chỉ định các tệp hoặc thư mục mà bạn muốn bao gồm trong quá trình đồng bộ và loại trừ các tệp và thư mục mà bạn không muốn được truyền.

Ở ví dụ này, 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.0.141:/var/lib/rpm/ /root/rpm
root@192.168.0.141's password: 
receiving incremental file list
created directory /root/rpm
./
Requirename
sent 61 bytes  received 273,074 bytes  60,696.67 bytes/sec
total size is 761,856  speedup is 2.79

Sử dụng tùy chọn --delete

Nếu một tệp hoặc 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 trong quá trình đồng bộ hóa.

Sử dụng tùy chọn --delete để xóa các tệp không tồn tại trong thư mục nguồn.

Ví dụ: Nguồn và đích đã được đồng bộ. Bây giờ tạo một tệp mới test.txt tại đích. 

# cd /root/rpm/
# touch test.txt
# rsync -avz --delete root@192.168.0.151:/var/lib/rpm/ /root/rpm/

root@192.168.0.151'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

Đích có tệp mới gọi là test.txt, khi đồng bộ với nguồn với tùy chọn --delete sẽ xóa tệp test.txt.

Thiết lập kích thước tệp tối đa được truyền bằng lệnh rsync

Chỉ định kích thước tệp tối đa được truyền hoặc đồng bộ, tùy chọn "--max-size". Ở ví dụ này, kích thước tệp tối đa là 200k, vì vậy lệnh này sẽ truyền chỉ những tệp có kích thước bằng hoặc nhỏ hơn 200k.

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

root@192.168.0.151'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

Lệnh rsync tự động xóa các tệp nguồn sau khi truyền thành công

Giả sử bạn có máy chủ web chính và một máy chủ sao lưu dữ liệu, bạn đã tạo sao lưu hàng ngày và đồng bộ nó với máy chủ sao lưu, bây giờ bạn không muốn giữ bản sao sao lưu địa phương đó trên máy chủ web nữa.

Vậy, bạn sẽ chờ đến khi quá trình truyền hoàn thành rồi xóa tệp sao lưu cục bộ đó bằng cách thủ công? Tất nhiên là KHÔNG. Việc xóa tự động này được thực hiện bằng tùy chọn "--remove-source-files".

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

root@192.168.0.151'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@tecmint:~]# ls -l backup.tar.gz
ls: cannot access 'backup.tar.gz': No such file or directory

Thực hiện thử nghiệm không thực tế với rsync

Nếu bạn là người mới sử dụng rsync và không biết chính xác lệnh của bạn sẽ làm gì. Rsync có thể gây ra rối loạn trong thư mục đích.

Việc sử dụng tùy chọn này sẽ không thay đổi các tệp và hiển thị kết quả của lệnh.
Nếu kết quả hiển thị chính xác như bạn muốn, bạn có thể loại bỏ tùy chọn "--dry-run" khỏi lệnh và chạy trên bảng điều khiển.

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

root@192.168.0.151'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)

Thiết lập giới hạn băng thông và truyền tệp với rsync

Đặt giới hạn băng thông khi truyền dữ liệu từ một máy đến máy khác bằng tùy chọn "--bwlimit". Tùy chọn này giới hạn băng thông I/O.

# rsync --bwlimit=100 -avzhe ssh  /var/lib/rpm/  root@192.168.0.151:/root/tmprpm/
root@192.168.0.151'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 đồng bộ chỉ các khối và byte đã thay đổi, nếu bạn muốn đồng bộ toàn bộ tệp một cách rõ ràng, sử dụng tùy chọn "-W".

# 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