Lệnh rsync trên Linux: tùy chọn | ví dụ sử dụng

Nếu để đồng bộ thư mục giữa hai server mà lần nào cũng sao chép lại toàn bộ, thì dù chỉ có một tệp thay đổi, lượng dữ liệu truyền vẫn bằng toàn bộ dung lượng. Lệnh rsync là viết tắt của remote sync; lệnh này so sánh nguồn và đích rồi chỉ truyền những tệp khác nhau, và hoạt động theo cùng một cách giữa các thư mục cục bộ cũng như giữa các server kết nối qua SSH. Bài viết này tổng hợp cách dùng cơ bản, các tùy chọn và ví dụ của hai phương thức kết nối: SSH và rsync daemon.
Kết quả trong bài này được lấy từ rsync 3.2.7 trên AlmaLinux 9.8; nếu chưa cài, hãy cài bằng trình quản lý gói.
# Họ RHEL
dnf -y install rsync
# Họ Debian
apt -y install rsync✅ Cách dùng cơ bản
Cách dùng cơ bản như sau.
rsync -tùy chọn nguồn đíchGiống như lệnh cp, bạn ghi nguồn trước, đích sau. Nếu thêm dấu gạch chéo [/] vào cuối nguồn thì chỉ nội dung bên trong thư mục được đưa vào đích; nếu không thêm thì cả thư mục sẽ được đưa vào.
~]# rsync -av www/ backup/
sending incremental file list
index.html
img/
img/logo.png
~]# rsync -av www backup/
sending incremental file list
www/
www/index.html
www/img/
www/img/logo.pngChạy lại cùng lệnh đó thì danh sách tệp sẽ trống và số byte sent giảm xuống còn vài trăm byte, vì các tệp có cùng kích thước và thời gian sửa đổi sẽ được bỏ qua.
~]# rsync -av www/ backup/
sending incremental file list
sent 166 bytes received 13 bytes 358.00 bytes/sec
total size is 3,015 speedup is 16.84Nếu chỉ dùng -r mà không có -a, thời gian sửa đổi sẽ không được giữ lại, nên lần chạy sau sẽ gửi lại chính các tệp đó. Khi đồng bộ thư mục, hãy mặc định thêm -a.
Tùy chọn -n chỉ hiển thị những tệp sẽ thay đổi mà không truyền gì, và cuối kết quả có thêm [(DRY RUN)]. Với các tùy chọn xóa tệp ở đích như --delete, hãy kiểm tra trước bằng -n rồi mới chạy thật.
~]# rsync -avn --delete www/ backup/
sending incremental file list
deleting old.bak
index.html
sent 188 bytes received 39 bytes 454.00 bytes/sec
total size is 3,013 speedup is 13.27 (DRY RUN)✅ Tùy chọn lệnh rsync & trình mô phỏng
| Tùy chọn | Mô tả | |
|---|---|---|
| -a | --archiveSao chép cả thư mục con và giữ nguyên quyền, chủ sở hữu, thời gian sửa đổi và liên kết tượng trưng (giống -rlptgoD) | |
| -v | --verboseIn ra tên các tệp đã truyền và lượng dữ liệu đã truyền | |
| -z | --compressNén dữ liệu tệp trong lúc truyền | |
| -r | --recursiveSao chép cả thư mục con (có trong -a) | |
| -t | --timesGiữ nguyên thời gian sửa đổi (có trong -a). Đây là căn cứ để quyết định tệp nào được bỏ qua ở lần chạy sau | |
| -n | --dry-runChỉ in ra các tệp sẽ thay đổi mà không truyền, và hiển thị (DRY RUN) ở cuối | |
| -u | --updateBỏ qua các tệp mới hơn ở phía đích | |
| -h | --human-readableIn số byte theo đơn vị K·M·G | |
| -P | Giống --partial --progress. Hiển thị tiến độ của từng tệp và tiếp tục các lần truyền bị gián đoạn | |
| -i | --itemize-changesIn ra các thay đổi của từng tệp dưới dạng ký hiệu>f+++++++++ tệp mới · >f.st...... đổi kích thước và thời gian · *deleting đã xóa | |
| -e | --rsh=COMMANDChỉ định shell từ xa-e 'ssh -p 2222 -i /root/.ssh/key.pem' | |
| --delete | Xóa ở đích những tệp không có trong nguồn (cần -r hoặc -a) | |
| --exclude=PATTERN | Loại trừ các tệp và thư mục khớp với mẫu--exclude '*.tmp' --exclude 'cache/' | |
| --include=PATTERN | Đặt trước --exclude để đưa riêng mẫu đó ra khỏi danh sách loại trừ | |
| --max-size=SIZE | Không truyền các tệp lớn hơn kích thước chỉ định (--min-size dành cho tệp nhỏ hơn)--max-size=3M --min-size=10k | |
| --bwlimit=RATE | Giới hạn tốc độ truyền, đơn vị là KiB/s | |
| --stats | In thống kê số tệp và lượng dữ liệu truyền |
✅ Phương thức kết nối: SSH và rsync daemon
Có hai phương thức kết nối để đồng bộ với server từ xa. Một dấu hai chấm [:] sau host là đi qua SSH, còn hai dấu hai chấm [::] là kết nối thẳng tới rsync daemon ở cổng 873.
| Phân loại | Phương thức SSH (:) | Phương thức rsync daemon (::) |
|---|---|---|
| Cú pháp kết nối | rsync -tùy chọn user@host:/đường_dẫn /đường_dẫn_cục_bộ | rsync -tùy chọn host::module/đường_dẫn /đường_dẫn_cục_bộ |
| Cổng | Cổng SSH (mặc định 22) | 873 |
| Mã hóa | Mã hóa bằng SSH | Không mã hóa |
| Xác thực | Khóa SSH hoặc mật khẩu | hosts allow trong rsyncd.conf, có thể thêm tài khoản và mật khẩu (tùy chọn) |
| Thiết lập phía server | Không cần (chỉ cần kết nối SSH được là dùng được) | Cài rsync-daemon, /etc/rsyncd.conf, mở cổng 873 |
| Mục đích | Sao lưu và triển khai giữa các server (lựa chọn mặc định) | Nhân bản (mirror) trong mạng nội bộ mà không cấp tài khoản SSH |
🔲 Phương thức SSH
Nếu server kết nối được qua SSH thì có thể dùng ngay mà không cần thiết lập gì phía server. Khi dùng cổng khác hoặc dùng tệp khóa, hãy đưa nguyên lệnh ssh vào tùy chọn -e.
# Cục bộ → từ xa
rsync -avz /home/2server_data/ root@192.168.45.239:/home/1server_data/
# Từ xa → cục bộ
rsync -avz root@192.168.45.239:/home/1server_data/html_Remote /home/2server_data
# Chỉ định cổng SSH và tệp khóa
rsync -avz -e 'ssh -p 2222 -i /root/.ssh/key.pem' root@192.168.45.239:/home/1server_data/ /home/2server_data
Để loại bỏ một số tệp hoặc thư mục, hãy thêm --exclude cho từng mẫu, hoặc gom các mẫu trong dấu ngoặc nhọn để ghi một lần.
rsync -avz --exclude 'html_Remote_Excertion' --exclude 'Exception_File' root@192.168.45.239:/home/1server_data/ /home/2server_data
rsync -avz --exclude={'html_Remote_excertion/*','Exception_File'} root@192.168.45.239:/home/1server_data/ /home/2server_data
🔲 Phương thức rsync daemon
rsync daemon cho phép truy cập theo từng module qua cổng 873 mà không cần tài khoản SSH; vì dữ liệu truyền đi không được mã hóa nên nó được dùng giữa các server trong cùng một mạng nội bộ.
Trên AlmaLinux 9, hãy cài gói rsync-daemon rồi bật dịch vụ. Nếu server dùng firewalld thì mở cổng 873; với server cloud thì mở trong tường lửa trên console. Cách dùng xinetd trên RHEL 8 trở về trước đã không còn ở bản 9.
dnf -y install rsync-daemon
systemctl enable --now rsyncd
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reloadGhi tên module, đường dẫn và các host được phép vào tệp cấu hình [/etc/rsyncd.conf]. Nếu đặt read only là yes, phía từ xa chỉ có thể lấy dữ liệu về.
[myhome]
path = /home
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 192.168.45.182
max connections = 3
timeout = 30Từ phía từ xa, nếu chỉ ghi hai dấu hai chấm sau host thì sẽ hiện danh sách module, còn ghi thêm tên module thì sẽ hiện danh sách tệp bên trong module đó.
~]# rsync 192.168.45.239::
myhome
home
~]# rsync 192.168.45.239::myhome
drwxr-xr-x 4,096 2025/06/12 22:14:39 .
drwxr-xr-x 4,096 2025/06/12 22:21:10 1server_data
drwxr-xr-x 4,096 2025/06/12 22:14:39 2server_dataKhi sao chép, dữ liệu được nhận theo dạng [host::module/đường_dẫn]. --delete xóa ở đích những tệp không có trong nguồn, còn --include chỉ đưa những mục đặt trước --exclude ra khỏi danh sách loại trừ.
~]# rsync -avz 192.168.45.239::myhome/1server_data/ /home/2server_data/
receiving incremental file list
./
Exception_File
html_Remote/
html_Remote_Excertion/
sent 58 bytes received 332 bytes 780.00 bytes/sec
total size is 442 speedup is 1.13
~]# rsync -avz --delete 192.168.45.239::myhome/1server_data/ /home/2server_data/
~]# rsync -avz --include '*.html' --exclude 'exclude.txt' 192.168.45.239::myhome/1server_data/ /home/2server_data/

Trên server bật SELinux, việc truy cập đường dẫn module có thể bị chặn với lỗi [Permission denied (13)]. Trong thử nghiệm, lệnh đã chạy được sau khi tắt SELinux bằng [setenforce 0].
~]# rsync -avz 192.168.45.239::myhome/1server_data/ /home/2server_data/
receiving incremental file list
rsync: change_dir "/1server_data" (in myhome) failed: Permission denied (13)
sent 8 bytes received 90 bytes 65.33 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files/attrs were not transferred (see Trước errors) (code 23) at main.c(1658) [Receiver=3.1.2]--bwlimit giới hạn tốc độ truyền theo đơn vị KiB/s, còn thêm -P thì xem được cả tiến độ của từng tệp. --max-size và --min-size chỉ truyền các tệp nằm trong khoảng kích thước chỉ định.
rsync -avzP --bwlimit=100 192.168.45.239::myhome/1server_data/ /home/2server_data/
rsync -avz --max-size='3M' --min-size='10k' 192.168.45.239::myhome/1server_data/ /home/2server_data/
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.