Skip to content
VDS · Sao lưu và ổ đĩa

Sao lưu với rsync

Cách thiết lập sao chép tệp sang máy chủ khác qua SSH, tạo lịch sử phiên bản bằng hard link, và tránh xóa quá nhiều với tùy chọn --delete nguy hiểm.

Cập nhật 23 tháng 8, 2026

rsync là cách đơn giản nhất để tạo bản sao: nó có sẵn ở mọi nơi, chỉ truyền phần thay đổi của tệp và hoạt động qua SSH. Với tập dữ liệu nhỏ, thế là đủ.

Lệnh cơ bản

rsync -avz --delete \
  -e "ssh -i /root/.ssh/backup_key -p 22" \
  /var/www/ backup@backup.example.com:/srv/backup/vds/www/

Giải thích các cờ:

  • -a — giữ nguyên quyền, chủ sở hữu, thời gian và liên kết;
  • -v — hiển thị những gì đang diễn ra;
  • -z — nén trong khi truyền (hữu ích với băng thông tới 500 Mbps nếu có nhiều dữ liệu);
  • --delete — xóa ở phía nhận những gì không còn tồn tại ở phía nguồn.

Dấu gạch chéo ở cuối đường dẫn nguồn có nghĩa là "nội dung của thư mục"; không có nó thì chính thư mục được sao chép. /var/www/ và /var/www cho kết quả khác nhau, và khi đi kèm --delete, sự khác biệt đó sẽ xóa nhầm thứ. Luôn chạy với --dry-run trước.

rsync -avzn --delete /var/www/ backup@backup.example.com:/srv/backup/vds/www/

Cờ -n là chế độ chạy thử.

Khóa truy cập không cần mật khẩu

Sao chép theo lịch cần đăng nhập mà không nhập mật khẩu:

ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com

Ở phía nhận, hãy giới hạn khóa này cho một lệnh duy nhất — khi đó khóa bị đánh cắp cũng không cho được shell. Trong ~/.ssh/authorized_keys của phía nhận:

command="rrsync -wo /srv/backup",restrict ssh-ed25519 AAAA... backup

rsync thông thường chỉ giữ trạng thái hiện tại: nếu bạn xóa một tệp hôm qua và hôm nay mới nhận ra, thì không có chỗ nào để khôi phục. --link-dest cho bạn lịch sử: các tệp không thay đổi không được sao chép lại mà được liên kết, nên ba mươi bản sao chỉ chiếm hơn một bản một chút.

#!/bin/bash
set -euo pipefail
DEST=/srv/backup/vds
TODAY=$(date +%F)
rsync -a --delete \
  --link-dest="$DEST/latest" \
  /var/www/ "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 -name "20*" -exec rm -rf {} +

Chạy script theo lịch vào ban đêm, và luôn ghi log.

Loại trừ

rsync -avz --exclude-from=/root/backup-exclude.txt / backup@host:/srv/backup/vds/root/
/proc/
/sys/
/dev/
/run/
/tmp/
/var/lib/docker/
/var/cache/
*.log

Sao chép toàn bộ thư mục gốc hiếm khi cần thiết: hữu ích hơn là lập một danh sách chính xác từ bài viết cần sao lưu chính xác những gì.

Khi rsync không phù hợp

  • Nếu bạn cần mã hóa lưu trữ và khử trùng lặp, hãy dùng Restic.
  • Nếu dữ liệu thay đổi liên tục và tính toàn vẹn quan trọng, hãy dump cơ sở dữ liệu trước, rồi rsync tệp kết quả.
  • Phía nhận là lưu trữ của người khác mà bạn không tin tưởng: rsync ghi tệp nguyên trạng, không mã hóa phía máy khách.

Những lỗi thường gặp

  • --delete với đường dẫn nguồn sai. Một thư mục nguồn rỗng sẽ xóa sạch phía nhận. Chạy thử là bắt buộc.
  • Bản sao trên cùng một đĩa. Đó không phải bản sao lưu mà là đích thứ hai cho cùng một sự cố. Xem bản sao ngoài site.
  • Nén dữ liệu vốn đã được nén. -z chỉ làm chậm các tệp lưu trữ và hình ảnh.
  • Lần chạy ban đêm gặp nút thắt cổ chai ở đĩa. Giới hạn tốc độ ghi phụ thuộc vào tier: xem tốc độ đĩa. --bwlimit=20000 và chạy vào giờ thấp điểm sẽ giúp ích.
  • Không ai kiểm tra kết quả. Ghi log mã trả về và giám sát nó: rsync ... || echo "backup failed" | mail -s alert you@example.com.