
Sao lưu Linux tự động với rsync và systemd timers: Hướng dẫn
Tự động hóa sao lưu Linux với rsync và systemd timers được coi là phương pháp đáng tin cậy nhất để bảo vệ dữ liệu trên các hệ thống máy chủ và máy tính cá nhân. Thay vì dựa vào cron jobs truyền thống, systemd timers cung cấp cú pháp cấu hình hiện đại, hỗ trợ dependency và logging chi tiết qua journalctl. Trong bài viết này, chúng ta sẽ hướng dẫn thiết lập quy trình sao lưu tự động, bao gồm cả bản sao lưu tăng dần (incremental) và quay vòng (rotation).
Từ khóa chính: sao lưu Linux, rsync backup, systemd timers, bảo vệ dữ liệu máy chủ, incremental backup.
Tại sao chọn rsync + systemd timers thay vì cron?
rsync là công cụ sao chép và đồng bộ thư mục mạnh nhất trên Linux nhờ thuật toán delta-transfer, chỉ truyền những phần thay đổi. Kết hợp với systemd timers, bạn có được lịch trình chạy dựa trên thời gian thực, hỗ trợ dependencies và có thể log lỗi chi tiết. Khác với cron, systemd timers tích hợp sẵn với systemd-notify và retry logic.
Theo tài liệu chính thức từ rsync documentation, rsync hỗ trợ mã hóa SSH, bảo toàn quyền file, và tùy chọn xóa tệp không còn tồn tại nguồn thông qua cờ --delete.

Chuẩn bị môi trường sao lưu
Trước tiên, tạo thư mục lưu trữ sao lưu và tập lệnh riêng. Kết hợp rsync với SSH để sao lưu từ xa:
# Tạo thư mục sao lưu
mkdir -p /backup/data
mkdir -p /backup/scripts
# Tạo tập lệnh sao lưu
cat > /backup/scripts/backup.sh <&1 | tee -a "$LOGFILE"
# Xoay bản sao lưu: giữ lại 7 bản gần nhất
find "$DEST" -maxdepth 1 -name "incremental-*" -type d -mtime +7 -exec rm -rf {} +
EOF
chmod +x /backup/scripts/backup.sh
Trong tập lệnh trên, chúng ta sử dụng cờ -avz (archive, verbose, compress) để đồng bộ thư mục, đồng thời tạo bản sao lưu tăng dần bằng --backup-dir. Các bản sao lưu cũ hơn 7 ngày sẽ tự động bị xóa để tiết kiệm dung lượng.
Tạo systemd service unit
Tạo một service unit cho phép systemd quản lý và khởi chạy tập lệnh sao lưu:
[Unit]
Description=Auto Backup Script
After=network.target
[Service]
Type=oneshot
ExecStart=/backup/scripts/backup.sh
User=root
Group=root
[Install]
WantedBy=multi-user.target
Lưu tệp này với tên backup.service trong thư mục /etc/systemd/system/, sau đó tải lại cấu hình bằng lệnh systemctl daemon-reload.
Cấu hình systemd timer để chạy định kỳ

Timer unit xác định lịch chạy của service. Bạn có thể dùng OnCalendar để chạy theo lịch cụ thể hoặc OnBootSec/OnUnitActiveSec để chạy theo khoảng thời gian:
[Unit]
Description=Run Backup Daily at 2 AM
Requires=backup.service
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
AccuracySec=1min
[Install]
WantedBy=timers.target
Trong cấu hình trên, timer sẽ chạy service sao lưu hàng ngày lúc 02:00 sáng. Tù chọn Persistent=true đảm bảo rằng nếu máy tắt nguồn trong lúc hẹn giờ, công việc sẽ chạy khi máy khởi động lại. Kích hoạt timer:
sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
sudo systemctl list-timers --all | grep backup
Kiểm tra, giám sát và xử lý lỗi
Sau khi kích hoạt, bạn có thể theo dõi trạng thái và log của quá trình sao lưu bằng các lệnh sau:
# Kiểm tra trạng thái timer
systemctl status backup.timer
# Xem log chi tiết của lần chạy gần nhất
journalctl -u backup.service -b
# Kiểm tra kích thước thư mục sao lưu
du -sh /backup/data/
# Kiểm tra tính toàn vẹn file
rsync -avn --dry-run /home/user/documents/ /backup/data/current/
Bạn cũng có thể cấu hình gửi thông báo qua email khi có lỗi bằng cách thêm OnFailure=backup-failure-notify@%i.service vào unit. Kết hợp rsync với systemd timers mang lại giải pháp sao lưu tự động, có thể mở rộng và dễ quản lý trên bất kỳ môi trường Linux nào.
Mở rộng quy trình sao lợp qua lại (offsite) qua SSH
Để tăng cường bảo mật, nên gửi bản sao lưu đến một máy chủ xa (offsite) thông qua SSH. Cập nhật tập lệnh để đồng bộ đến một địa chỉ máy chủ từ xa:
REMOTE_USER="backupadmin"
REMOTE_HOST="192.168.1.50"
REMOTE_PATH="/mnt/backup-storage/server-$(hostname)"
rsync -avz -e "ssh -i /root/.ssh/backup_key -o StrictHostKeyChecking=no"
--delete --backup
"$SOURCE/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/" 2>&1 | tee -a "$LOGFILE"
Phương pháp này yêu cầu bạn thiết lập SSH key-pair không mật khẩu giữa máy local và remote. Sử dụng cờ -e "ssh -i /path/to/key" để rsync tự động xác thực qua key, tránh việc nhập mật khẩu trong quá trình chạy định kỳ.
Bảo mật quyền truy cập và cách ly môi trường
Các bản sao lưu chứa toàn bộ dữ liệu nhạy cảm, do đó bạn cần thiết lập quyền truy cập hạn chế. Đặt quyền 700 cho thư mục sao lưu và chỉ cho phép user root truy cập:
chmod 700 /backup
chmod 600 /backup/scripts/*.sh
chown root:root /backup -R
Bạn cũng nên mã hóa các bản sao lưu nhạy cảm bằng gpg hoặc luks trước khi lưu trữ. Kết hợp rsnapshot làm giải pháp thay thế cung cấp quản lý bản sao lưu theo thời gian (hourly/daily/weekly/monthly) với hard link để tiết kiệm dung lượng đĩa. Cuối cùng, luôn thực hiện restore test định kỳ để chắc chắn bản sao lưu có thể phục hồi thành công.
Nguồn tài liệu: rsync man page, systemd.timer documentation, ArchWiki – systemd timers
