HỌC BẰNG THỰC HÀNH
← Lộ trình học
01 · Linux Administration

Truyền và đồng bộ file bằng scp, rsync

Thực hiện trên server của bạn, rồi kiểm tra từng tiêu chí.

Cốt lõi

Vì sao cần học

Đưa file cấu hình lên server, sao lưu thư mục sang máy khác, đồng bộ bản build: những việc này lặp lại hằng ngày. scp copy nhanh từng file. rsync chỉ gửi phần thay đổi, giữ quyền và owner, xóa file thừa, nên được dùng cho backup và deploy đơn giản.

Mục tiêu

  • Copy file hai chiều giữa máy của bạn và server bằng scp với SSH key.
  • Đồng bộ thư mục bằng rsync -a, hiểu ý nghĩa dấu / cuối đường dẫn nguồn.
  • Dùng --dry-run để xem trước và --delete để xóa file thừa một cách có kiểm soát.

Điều kiện tiên quyết

  • Bài SSH key và hardening sshd: key ~/.ssh/kdc_lab trên máy của bạn.

Mental model

scp và rsync đều chạy qua SSH, nên dùng chung xác thực, key và firewall với SSH.

rsync -a (archive) giữ quyền, thời gian sửa, symlink, và owner nếu chạy bằng root. rsync so sánh kích thước và thời gian sửa để bỏ qua file không đổi.

Dấu / cuối nguồn rất quan trọng:

LệnhKết quả
rsync -a site/ dest/Copy nội dung của site vào dest
rsync -a site dest/Tạo dest/site/

--delete xóa ở đích những file không còn ở nguồn. Sai đường dẫn cùng --delete có thể xóa sạch đích, vì vậy luôn chạy --dry-run trước.

Thực hành (Guided Lab)

1. scp từ máy của bạn lên server

Trên VM, tạo thư mục mà tài khoản quản trị của bạn ghi được:

sudo install -d -o "$USER" -g "$USER" -m 755 /srv/kdc-transfer
Giải thích lệnh và tham số

"$USER" được shell VM thay bằng tên tài khoản đang dùng; nháy kép giữ kết quả thành một đối số. install -o ... -g ... cấp thư mục cho user/group đó; -m 755 cho owner ghi và mọi người đọc/truy cập.

Trên máy của bạn:

echo "Gửi từ laptop lúc $(date)" > from-laptop.txt
scp -i ~/.ssh/kdc_lab from-laptop.txt <user>@<ip-của-vm>:/srv/kdc-transfer/
scp -i ~/.ssh/kdc_lab <user>@<ip-của-vm>:/etc/os-release ./vm-os-release.txt
Giải thích lệnh và tham số

scp -i ~/.ssh/kdc_lab dùng private key này khi copy qua SSH. Cú pháp là scp [tùy-chọn] <nguồn> <đích>: nguồn local → đích có user@host: là upload; nguồn có user@host: → đích local là download. ./vm-os-release.txt là file trong thư mục hiện tại trên laptop. $(date) chèn thời điểm hiện tại vào file mẫu.

Trong user@host:/đường/dẫn, dấu : phân cách máy từ xa với đường dẫn trên máy đó; đường dẫn không có user@host: là trên máy bạn đang chạy lệnh. scp chỉ copy file, không tự chạy file hay liên kết agent.

Lệnh thứ hai copy theo chiều ngược lại, từ server về máy của bạn.

2. Chuẩn bị nguồn

Trên VM:

mkdir -p /srv/kdc-transfer/site
echo '<h1>Trang chủ</h1>' > /srv/kdc-transfer/site/index.html
echo '<h1>Trang cũ</h1>' > /srv/kdc-transfer/site/old.html
echo 'token=demo' > /srv/kdc-transfer/site/secret.conf
chmod 640 /srv/kdc-transfer/site/secret.conf
ls -l /srv/kdc-transfer/site
Giải thích lệnh và tham số

chmod 640 cho owner đọc/ghi (6), group chỉ đọc (4), other không có quyền (0). Không áp dụng quyền file này cho thư mục cần đi vào.

3. Đồng bộ lần đầu

sudo dnf install -y rsync
sudo install -d /srv/kdc-mirror/site
sudo rsync -av --dry-run /srv/kdc-transfer/site/ /srv/kdc-mirror/site/
sudo rsync -av /srv/kdc-transfer/site/ /srv/kdc-mirror/site/
ls -l /srv/kdc-mirror/site
Giải thích lệnh và tham số

rsync -av gộp -a (archive: giữ symlink, quyền, thời gian, owner/group khi được phép, và đồng bộ đệ quy) với -v (in việc đang làm). --dry-run chỉ xem trước, chưa copy/xóa. Hai đối số cuối là nguồn và đích; dấu / cuối nguồn nghĩa là đồng bộ nội dung bên trong nguồn. Bỏ --dry-run mới thực hiện thật.

--dry-run liệt kê việc sẽ làm mà không thay đổi gì. So sánh quyền của secret.conf ở hai nơi.

4. Thay đổi nguồn rồi đồng bộ lại

echo '<h1>Trang mới</h1>' > /srv/kdc-transfer/site/new.html
rm /srv/kdc-transfer/site/old.html
sudo rsync -av /srv/kdc-transfer/site/ /srv/kdc-mirror/site/
ls /srv/kdc-mirror/site
Giải thích lệnh và tham số

rsync -av gộp chế độ archive (-a, đồng bộ đệ quy và giữ metadata khi được phép) và in chi tiết (-v). Lệnh không có --delete, nên file dư ở đích vẫn còn dù đã xóa ở nguồn.

new.html đã được copy, nhưng old.html vẫn còn ở mirror. Xem trước rồi đồng bộ với --delete:

sudo rsync -av --delete --dry-run /srv/kdc-transfer/site/ /srv/kdc-mirror/site/
sudo rsync -av --delete /srv/kdc-transfer/site/ /srv/kdc-mirror/site/
Giải thích lệnh và tham số

--delete xóa file dư ở đích khi file tương ứng không còn ở nguồn. --dry-run chỉ hiển thị việc sẽ làm, chưa thay đổi file; bỏ tùy chọn này để thực hiện. -av giữ chế độ archive và in chi tiết; dấu / cuối nguồn chọn nội dung bên trong thư mục.

5. rsync qua SSH (tham khảo)

Từ máy của bạn, cùng cú pháp có thể đồng bộ qua mạng:

rsync -av -e "ssh -i ~/.ssh/kdc_lab" ./my-folder/ <user>@<ip-của-vm>:/srv/kdc-transfer/my-folder/
Giải thích lệnh và tham số

rsync -e "ssh -i ~/.ssh/kdc_lab" chọn lệnh kết nối tới máy đích. -e nhận cả chuỗi lệnh SSH nhờ dấu nháy kép. --delete ở bước trước chỉ xóa file dư ở đích; luôn đọc kết quả --dry-run trước khi chạy thật.

Tự kiểm tra (Verification)

ls -l /srv/kdc-transfer /srv/kdc-mirror/site
Giải thích lệnh và tham số

ls -l <thư-mục> liệt kê chi tiết các file bên trong để đối chiếu quyền và nội dung đã đồng bộ.

Chọn server và bấm Kiểm tra kết quả.

Lỗi thường gặp

  • Thiếu dấu / cuối nguồn: dữ liệu nằm ở /srv/kdc-mirror/site/site/.
  • scp báo Permission denied khi ghi: tài khoản đích không có quyền ghi thư mục, không phải lỗi SSH.
  • rsync không giữ owner khi không chạy bằng root ở đích.

Ghi chú production

  • rsync là backup "một bản": file bị xóa nhầm ở nguồn sẽ bị xóa ở đích sau lần đồng bộ --delete tiếp theo. Backup thật cần nhiều phiên bản (snapshot, --link-dest, hoặc công cụ backup chuyên dụng).
  • scp hiện dùng giao thức SFTP bên dưới. Với nhiều file hoặc file lớn, rsync hiệu quả hơn vì chỉ gửi phần thay đổi và tiếp tục được khi bị ngắt.

Dọn dẹp

sudo rm -rf /srv/kdc-transfer /srv/kdc-mirror
Giải thích lệnh và tham số

rm -f xóa file và không hỏi xác nhận; -r thêm xóa đệ quy thư mục cùng nội dung, nên -rf gộp hai tùy chọn này.

Tài liệu chính thức