Sao lưu Linux tự động với rsync và systemd timers: Hướng dẫn

Giao diện Grsync cấu hình sao lưu rsync

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.

Screenshot terminal hiển thị lệnh rsync sao lưu với tiến độ và thống kê

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ỳ

Screenshot lệnh rsync chạy từ Grsync GUI với danh sách tệp

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

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Tối ưu phím tắt macOS

Tối ưu phím tắt macOS đang trở thành một chủ đề nóng trong giới công nghệ, đặc biệt là trong lĩnh vực Thủ thuật. Với sự phát triển nhanh chóng…

Xem thêm

Tối ưu workflow GitHub Actions: Mẹo CI/CD nhanh hơn để triển khai ứng dụng hiệu quả

Tối ưu workflow GitHub Actions: Mẹo CI/CD nhanh hơn để triển khai ứng dụng hiệu quả GitHub Actions đã trở thành công cụ không thể thiếu trong phát triển phần…

Xem thêm
Theme Oh My Zsh robbyrussell: giao diện terminal đẹp mắt với git status

Zsh + Oh My Zsh: Cấu hình terminal hiệu quả cho developer

Zsh + Oh My Zsh: Cấu hình terminal hiệu quả cho developer Terminal là công cụ không thể thiếu đối với mọi nhà phát triển. Tuy nhiên, terminal mặc định…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất