Cách sử dụng Rsync để đồng bộ thư mục Local và từ xa

Rsync

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, scpcp.

Đầ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 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.

rsync local to remote

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--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.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *