Rsync, viết tắt của remote sync, là một công cụ đồng bộ file cục bộ và từ xa. Nó sử dụng một thuật toán để giảm thiểu lượng dữ liệu cần sao chép bằng cách chỉ chuyển những phần của file đã thay đổi. Trong hướng dẫn này, chúng ta sẽ định nghĩa Rsync, xem xét cú pháp khi sử dụng rsync, giải thích cách sử dụng Rsync để đồng bộ với một hệ thống từ xa và giới thiệu các tùy chọn khác mà bạn có thể áp dụng.
Yêu Cầu
Để thực hành sử dụng rsync nhằm đồng bộ file giữa hệ thống cục bộ và từ xa, bạn sẽ cần có hai máy, đóng vai trò là máy tính cục bộ và máy từ xa tương ứng. Hai máy này có thể là các máy chủ ảo riêng (VPS), máy ảo, container hoặc máy tính cá nhân miễn là chúng đã được cấu hình đúng cách.
Bất kể loại máy nào bạn sử dụng, bạn cần tạo SSH keys trên cả hai máy. Sau đó, sao chép public key của mỗi máy sang file authorized_keys
của máy kia như được nêu trong Bước 2 của hướng dẫn đó. Hướng dẫn này đã được xác thực trên các máy chạy Ubuntu 20.04, mặc dù về cơ bản nó sẽ hoạt động với bất kỳ máy tính nào chạy hệ điều hành Linux có cài đặt rsync.
Định Nghĩa Rsync
Rsync là một công cụ đồng bộ có khả năng kết nối mạng rất linh hoạt. Do tính phổ biến trên các hệ thống Linux và Unix-like cũng như sự ưa chuộng trong các script hệ thống, rsync thường được tích hợp sẵn trong hầu hết các bản phân phối Linux.
Bạn cần biết gì về Cú Pháp Rsync?
Cú pháp của rsync hoạt động tương tự như các công cụ khác, chẳng hạn như ssh, scp và cp.
Đầu tiên, chuyển vào thư mục home của bạn bằng cách chạy lệnh sau:
cd ~
Sau đó, tạo một thư mục kiểm tra:
mkdir dir1
Tiếp theo, tạo một thư mục kiểm tra khác:
mkdir dir2
Bây giờ, thêm một số file kiểm tra:
touch dir1/file{1..100}
Hiện nay, đã có một thư mục có tên dir1 chứa 100 file trống. Hãy xác nhận bằng cách liệt kê các file:
ls dir1
Output:
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
Bạn cũng có một thư mục trống có tên dir2. Để đồng bộ nội dung của dir1 sang dir2 trên cùng một hệ thống, bạn sẽ chạy rsync và sử dụng tham số -r
(viết tắt của “recursive”, cần thiết cho việc đồng bộ thư mục):
rsync -r dir1/ dir2
Một lựa chọn khác là sử dụng tham số -a
, là tham số kết hợp (viết tắt của “archive”). Tham số này đồng bộ một cách đệ quy và bảo toàn các liên kết tượng trưng, file đặc biệt, file thiết bị, thời gian chỉnh sửa, nhóm, chủ sở hữu và quyền truy cập. Nó được sử dụng phổ biến hơn -r
và được khuyến nghị sử dụng. Chạy lệnh tương tự ví dụ trước, lần này sử dụng tham số -a
:
rsync -a dir1/ dir2
Xin lưu ý rằng có một dấu gạch chéo (/
) ở cuối đối số đầu tiên trong cú pháp của hai lệnh trên và được làm nổi bật ở đây:
rsync -a dir1/ dir2
Dấu gạch chéo kết thúc này biểu thị nội dung của thư mục dir1. Nếu không có dấu gạch chéo, toàn bộ thư mục dir1 sẽ được đặt bên trong dir2, tạo ra cấu trúc phân cấp như sau:
~/dir2/dir1/[files]
Một mẹo khác là kiểm tra lại các đối số trước khi thực thi lệnh rsync. Rsync cung cấp tùy chọn -n
hoặc --dry-run
để kiểm tra thử nhằm ngăn ngừa mất mát dữ liệu không mong muốn. Tham số -v
(viết tắt của “verbose”) cũng cần thiết để có được kết quả đầu ra chi tiết. Bạn sẽ kết hợp các tham số -a
, -n
và -v
trong lệnh sau:
rsync -anv dir1/ dir2
Output:
sending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . .
Bây giờ, hãy so sánh kết quả trên với kết quả nhận được khi bỏ dấu gạch chéo ở cuối, như trong lệnh sau:
rsync -anv dir1 dir2
Output:
sending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . .
Kết quả này cho thấy rằng toàn bộ thư mục dir1 đã được chuyển, thay vì chỉ các file bên trong.
Sử Dụng Rsync Để Đồng Bộ Với Hệ Thống Từ Xa
Để sử dụng rsync nhằm đồng bộ với một hệ thống từ xa, bạn chỉ cần có quyền truy cập SSH được cấu hình giữa máy cục bộ và máy từ xa, cũng như cài đặt rsync trên cả hai hệ thống. Khi đã xác nhận quyền truy cập SSH giữa hai máy, bạn có thể đồng bộ thư mục dir1 từ phần trước sang một máy từ xa bằng cú pháp sau. Xin lưu ý rằng trong trường hợp này, bạn muốn chuyển toàn bộ thư mục, do đó bạn sẽ bỏ dấu gạch chéo ở cuối:
rsync -a ~/dir1 username@remote_host:destination_directory
Quá trình này được gọi là thao tác push vì nó “đẩy” một thư mục từ hệ thống cục bộ sang hệ thống từ xa. Thao tác ngược lại là pull, được sử dụng để đồng bộ một thư mục từ xa về hệ thống cục bộ. Nếu thư mục dir1 nằm trên hệ thống từ xa thay vì máy cục bộ của bạn, cú pháp sẽ là:
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
Giống như các công cụ như cp, nguồn (source) luôn là đối số đầu tiên và đích (destination) luôn là đối số thứ hai.
Sử Dụng Các Tùy Chọn Khác của Rsync
Rsync cung cấp rất nhiều tùy chọn để thay đổi hành vi mặc định của công cụ, chẳng hạn như các tham số mà bạn đã tìm hiểu ở phần trước.
Nếu bạn đang chuyển các file chưa được nén, như file văn bản, bạn có thể giảm bớt lượng dữ liệu truyền qua mạng bằng cách thêm nén với tham số -z
:
rsync -az source destination
Tham số -P
cũng rất hữu ích. Nó kết hợp hai tham số --progress
và --partial
. Tham số đầu tiên cung cấp thanh tiến trình cho việc chuyển file, còn tham số thứ hai cho phép bạn tiếp tục các lần chuyển file bị gián đoạn:
rsync -azP source destination
Output:
sending incremental file list created directory destination source/ source/file1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101) sourcefile10 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101) source/file100 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101) source/file11 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101) source/file12 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101) . . .
Nếu bạn chạy lại lệnh này, bạn sẽ nhận được kết quả rút gọn vì không có thay đổi nào được thực hiện. Điều này minh họa khả năng của Rsync trong việc sử dụng thời gian chỉnh sửa để xác định các thay đổi:
rsync -azP source destination
Output:
sending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00
Giả sử bạn cập nhật thời gian chỉnh sửa của một số file bằng lệnh sau:
touch dir1/file{1..10}
Sau đó, nếu bạn chạy lại rsync với tham số -azP
, bạn sẽ nhận thấy trong kết quả đầu ra rằng Rsync thông minh chỉ sao chép lại các file đã thay đổi:
rsync -azP source destination
Output:
sending incremental file list file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101) file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101) file2 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101) file3 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101) . . .
Để giữ cho hai thư mục được đồng bộ hoàn toàn, cần phải xóa các file khỏi thư mục đích nếu chúng bị xóa khỏi nguồn. Theo mặc định, rsync không xóa bất cứ thứ gì khỏi thư mục đích.
Bạn có thể thay đổi hành vi này bằng cách sử dụng tham số --delete
. Trước khi áp dụng tham số này, bạn có thể dùng -n
(hay --dry-run
) để thử nghiệm nhằm ngăn ngừa mất mát dữ liệu không mong muốn:
rsync -an --delete source destination
Nếu bạn muốn loại trừ một số file hoặc thư mục nhất định bên trong thư mục đang đồng bộ, bạn có thể chỉ định chúng trong danh sách cách nhau bằng dấu phẩy sau tùy chọn --exclude=
:
rsync -a --exclude=pattern_to_exclude source destination
Nếu bạn có một mẫu loại trừ cụ thể và muốn ghi đè loại trừ đó cho những file khớp với mẫu khác, hãy sử dụng tùy chọn --include=
:
rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
Cuối cùng, tham số --backup
của Rsync có thể được sử dụng để lưu trữ các bản sao lưu của những file quan trọng. Nó được sử dụng cùng với tham số --backup-dir
, chỉ định thư mục nơi lưu trữ các file sao lưu:
rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
Kết Luận
Rsync có thể đơn giản hóa việc truyền file qua các kết nối mạng và tăng cường độ ổn định cho việc đồng bộ thư mục cục bộ. Sự linh hoạt của Rsync khiến nó trở thành một lựa chọn tuyệt vời cho nhiều thao tác liên quan đến file.
Việc thành thạo Rsync cho phép bạn thiết kế các thao tác sao lưu phức tạp và kiểm soát một cách chi tiết quá trình chuyển giao file.