Lệnh Rsync trong Linux [16 ví dụ thực tiễn]

Rsync (Remote Sync) là lệnh được sử dụng phổ biến nhất để sao chép và đồng bộ hóa tập tin và thư mục từ xa cũng như nội bộ trong các hệ thống Linux/Unix.

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 từ xa và từ nội bộ giữa các thư mục, ổ đĩa và mạng, thực hiện sao lưu dữ liệu và đồng bộ hoá giữa hai máy Linux.

Bài viết này giải thích  16  cách sử dụng cơ bản và nâng cao của  lệnh  rsync để chuyển tập tin từ xa và từ nội bộ trong máy Linux dựa trên hệ thống  Linux. Bạn không cần phải là người dùng root để chạy lệnh rsync.

Ưu điểm của Lệnh Rsync

Nó cung cấp một số lợi ích, bao gồm:

  • Truyền tệp hiệu quả - rsync sử dụng thuật toán truyền tải delta, điều này có nghĩa chỉ truyền tải các khác biệt giữa các tệp nguồn và đích, từ đó giảm đáng kể lượng dữ liệu được truyền tải, làm cho nó hiệu quả cho việc đồng bộ hóa tập tin hoặc thư mục lớn.
  • Đồng bộ hóa tệp từ xa - rsync hỗ trợ cả truyền tệp cục bộ và từ xa qua SSH, cho phép đồng bộ hóa giữa các hệ thống cục bộ và từ xa hoặc sao chép thư mục qua nhiều máy.
  • Sao lưu kiểu tăng tiến - rsync rất phù hợp để tạo và cập nhật bản sao tăng tiến, vì nó tạo và cập nhật sao lưu hiệu quả bằng cách truyền tải chỉ các tệp mới hoặc đã sửa đổi.
  • Giữ quyền tệp - rsync có thể bảo tồn các thuộc tính tệp khác nhau, chẳng hạn như quyền hạn, quyền sở hữu, dấu thời gian và liên kết biểu tượng, đảm bảo rằng các tệp sao chép giữ nguyên tính chất gốc trên đích.
  • Kiểm soát băng thông - rsync cho phép bạn giới hạn việc sử dụng băng thông trong quá trình truyền tải tệp, vì nó sử dụng phương pháp nén và giải nén khi gửi và nhận dữ liệu ở cả hai đầu.
  • Nhanh hơn - rsync có thể nhanh hơn scp (Sao chép an toàn) khi truyền tải tệp, đặc biệt là khi đồng bộ hóa các thư mục lớn hoặc khi làm việc với các tệp đã được truyền tải một phần hoặc tồn tại trên đích.

Cú pháp Lệnh Rsync

Lệnh rsync tuân theo cú pháp sau:

# rsync [OPTIONS] SOURCE DESTINATION

Đây là một giải thích về các thành phần và tùy chọn khác được sử dụng với các lệnh rsync:

  • -v - đầu ra chi tiết, hiển thị thông tin chi tiết về quá trình truyền tải.
  • -r - sao chép dữ liệu theo cách đệ quy (nhưng không bảo tồn thời gian và quyền hạn khi truyền tải dữ liệu.
  • -a - chế độ lưu trữ, cho phép sao chép tệp đệ quy và nó cũng bảo tồn các liên kết biểu tượng, quyền hạn tệp, quyền sở hữu người dùng & nhóm, và thời gian dấu thời gian.
  • -z - Nén tệp trong quá trình truyền tải để giảm việc sử dụng mạng.
  • -h - có thể đọc được, đầu ra số theo định dạng có thể đọc được cho con người.
  • -P - Hiển thị tiến trình trong quá trình truyền tải.
  • SOURCE - Chỉ định tệp hoặc thư mục nguồn sẽ được chuyển tới, có thể là một vị trí cục bộ hoặc từ xa.
  • DESTINATION - Chỉ định đường dẫn đích mà các tệp hoặc thư mục sẽ được sao chép. Tương tự với nguồn, nó có thể là một đường dẫn cục bộ hoặc một vị trí từ xa.

Cài đặt Rsync trong hệ thống Linux

Chúng ta có thể cài đặt gói rsync bằng cách sử dụng trình quản lý gói sau đây phù hợp với phiên bản Linux của bạn.

$ sudo apt install rsync         [On Debian, Ubuntu and Mint]
$ sudo yum install rsync         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
$ sudo emerge -a sys-apps/rsync  [On Gentoo Linux]
$ sudo apk add rsync            [On Alpine Linux]
$ sudo pacman -S rsync           [On Arch Linux]
$ sudo zypper install rsync      [On OpenSUSE]    

1. Sao chép/Đồng bộ Tệp Địa phương

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

Ở ví dụ này, tên tệp là backup.tar được sao chép hoặc đồng bộ hóa sang thư mục /tmp/backups/.

[root@tecmint]# 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 ra một thư mục cho đích.

Rsync Local Files

2. Sao chép/Đồng bộ Thư mục địa phương

Lệnh sau đây sẽ sao chép hoặc đồng bộ tất cả các tệp từ một thư mục khác đến một thư mục khác trên cùng một máy.

Ở ví dụ này, /root/rpmpkgs chứa một số tệp gói rpm và bạn muốn thư mục đó được sao chép vào thư mục /tmp/backups/.

[root@tecmint]# 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
Rsync Local Directory

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

Để sao chép một thư mục từ máy chủ cục bộ đến máy chủ từ xa, bạn có thể sử dụng lệnh sau, đồng bộ một thư mục từ máy cục bộ đến 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 một số gói RPM và nếu bạn muốn nội dung của thư mục cục bộ đó được gửi đế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
Rsync Directory Remote System

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

Lệnh này sẽ giúp bạn đồng bộ một thư mục từ máy chủ từ xa đến một thư mục cục bộ. Ở ví dụ này, một thư mục /root/rpmpkgs đang nằm 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 ở /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
Rsync Remote Directory to Local

5. Rsync qua SSH

Với rsync, chúng ta có thể sử dụng SSH (Shell an toàn) cho việc truyền dữ liệu, bằng cách sử dụng giao thức SSH khi truyền dữ liệu của bạn, bạn có thể đảm bảo rằng dữ liệu của bạn được truyền trong một kết nối an toàn với mã hóa, vì vậy không ai có thể đọc dữ liệu của bạn trong quá trình truyền qua mạng Internet.

Ngoài ra, 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 nhiệm vụ cụ thể đó, vì vậy sử dụng tùy chọn SSH sẽ gửi thông tin đăng nhập của bạn theo một cách được mã hóa để mật khẩu của bạn được bảo mật.

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

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

6. Sao chép Tệp từ Máy chủ từ xa đến Máy chủ cục bộ với SSH

Để đồng bộ một tệp từ máy chủ từ xa đến máy chủ cục bộ, bạn có thể chỉ định một giao thức với rsync bằng cách 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 việc 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
Rsync Copy Remote File to Local

7. Sao chép Tệp từ Máy chủ cục bộ đến Máy chủ từ xa với SSH

Để đồng bộ một tệp từ máy chủ cục bộ đến máy chủ từ xa bằng SSH, bạn có thể tận dụng lệnh sau đây.

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

root@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
Rsync Copy Local File to Remote

8. Hiển thị tiến trình khi truyền dữ liệu với Rsync

Để hiển thị tiến trình khi truyền tải dữ liệu từ một máy tính này đến máy tính khác, chúng ta có thể sử dụng tùy chọn ‘--progress' để hiển thị các tệp và thời gian còn lại để hoàn thành truyền tải.

# 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
Rsync Progress While Copying Files

9. Bao gồm các tệp với phần mở rộng cụ thể bằng Rsync

Để bao gồm các tệp hoặc mẫu cụ thể trong quá trình rsync, bạn có thể sử dụng tùy chọn --include kèm với phần mở rộng khớp với tất cả các tệp.

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

Trong ví dụ cung cấp, rsync sẽ chỉ bao gồm các tệp có phần mở rộng .txt từ thư mục /path/to/source/ trong quá trình truyền tải.

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ừ phần mở rộng cụ thể trong quá trình rsync, bạn có thể sử dụng tùy chọn --exclude kèm mẫu ký tự đại diện.

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

Trong ví dụ cung cấp, 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 tải, trong khi 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 với Rsync

Để bao gồm và loại trừ các tệp hoặc mẫu cụ thể trong quá trình rsync, bạn có thể sử dụng cả hai tùy chọn --include và --exclude kèm 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 ta chỉ định các tệp hoặc thư mục mà bạn muốn bao gồm vào đồng bộ hóa 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
Rsync Include and Exclude Files

12. Sử dụng tùy chọn –delete với Rsync

Nếu một tệp hoặc thư mục không tồn tại tại nguồn, nhưng đã tồn tại tại đích, bạn có thể muốn xóa tệp/ thư mục hiện có đó tại đích trong khi đồ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 tồn tại trong thư mục nguồn.

Nguồn và đích đang được đồng bộ hóa. Bây giờ tạo một tệp mới test.txt tại đích.

[root@tecmint:~]# cd /root/rpm/
[root@tecmint:~/rpm]# touch test.txt
[root@tecmint:~/rpm]# 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 được gọi là test.txt khi đồng bộ hóa với nguồn bằng tùy chọn ‘–delete‘, tệp test.txt đã được xóa.

Rsync Delete Option

13. Đặt giới hạn Truyền tệp với Rsync

Bạn có thể chỉ định kích thước tệp tối đa được truyền hoặc đồng bộ hóa. Bạn có thể làm điều này với tùy chọn ‘--max-size’. Ở đây, ví dụ, Kích thước tệp tối đa là 200k, vì vậy lệnh này chỉ sẽ chuyển 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
Rsync Set Max File Transfer Size

14. Tự động Xóa các tệp Nguồn sau khi Truyền

Bây giờ, 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 bản sao lưu hàng ngày và đồng bộ hóa nó với máy chủ sao lưu của bạn, nhưng bây giờ bạn không muốn giữ bản sao lưu cục bộ đó trên máy chủ web của bạn.

Vậy, bạn sẽ chờ đến khi truyền tải hoàn thành sau đó xóa tệp sao lưu cục bộ đó bằng tay? Tất nhiên KHÔNG. Việc xóa tự động này có thể được thực hiện bằng cách sử dụ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
Rsync Delete Source File After Transfer

15. Thực hiện Dry Run 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 thực sự có thể làm hỏng mọi thứ trong thư mục đích của bạn và việc hoàn tác có thể là một công việc đáng mệt mỏi.

Sử dụng tùy chọn này sẽ không thay đổi bất kỳ tệp nào 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 làm, bạn có thể xóa tùy chọn ‘--dry-run‘ khỏi lệnh của bạn và chạy trên cửa sổ terminal.

# 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)
Rsync Dry Run

16. Rsync Đặt giới hạn Băng thông và Truyền File

Bạn có thể đặt giới hạn băng thông khi truyền dữ liệu từ máy tính này sang máy tính khác với 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.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, mặc định rsync đồng bộ các khối và byte đã thay đổi mà thôi, nếu bạn muốn rõ ràng đồng bộ toàn bộ tệp thì sử dụng tùy chọn ‘-W’ kèm 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
Kết luận

Đó là tổng quan về rsync và khả năng của nó. Để khám phá các tùy chọn và chức năng đa dạng khác của nó, tôi khuyến khích bạn tham khảo các trang hướng dẫn chi tiết (man pages) có sẵn.