Hướng dẫn cài đặt và cấu hình BorgBackup trên Fedora Server: Tự động hóa sao lưu dữ liệu qua SSH

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

1. Vấn đề thực tế gặp phải: Thảm họa ổ cứng và sự bất lực của rsync truyền thống

Hồi mới nhận việc sysadmin, mình từng nếm quả đắng nhớ đời. Cụm server chạy MySQL kết hợp thư mục uploads chứa ảnh khách hàng phình nhanh lên hơn 320GB. Để an tâm, mình viết script gom tar.gz rồi dùng rsync đẩy sang backup server lúc 2 giờ sáng mỗi ngày.

Hai tuần sau, chuông alert hú liên tục. Ổ cứng 2TB trên backup server chạm mốc 100% (Disk Full). Chưa dừng lại ở đó, ransomware tấn công máy chủ chính. Toàn bộ file .tar.gz để trần trên backup server cũng dính đòn vì thiếu cơ chế snapshot cô lập (append-only). Quá trình phục hồi kéo dài hơn 18 tiếng do file nén quá cồng kềnh, nghẽn sạch đường truyền 1Gbps nội bộ.

2. Phân tích nguyên nhân: Vì sao các giải pháp backup cổ điển hụt hơi?

Mổ xẻ lại sự cố, mình nhận thấy 3 tử huyệt khiến hệ thống sụp đổ:

  • Lãng phí ổ cứng vì thiếu Deduplication: Mỗi ngày mã nguồn hay database dump chỉ đổi khoảng 3-5%. Thế nhưng tar.gz lại nén và lưu nguyên 100% dung lượng đó. 10 bản backup coi như nhân dung lượng lên gấp 10 lần.
  • Bảo mật sơ hở: Dữ liệu truyền đi lẫn file lưu kho đều ở dạng plaintext. Kẻ xấu chiếm được backup server là lấy sạch database khách hàng.
  • Rsync ngốn tải khi gặp file khổng lồ: Với các file dump SQL dung lượng 50-80GB bị sửa một phần, rsync mất cả tiếng đồng hồ chỉ để quét block checksum, ép CPU máy nguồn chạm đỉnh 100%.

3. So sánh các hướng giải quyết backup trên Linux

Đứng trước bài toán này, dân infra thường cân nhắc giữa 3 phương án:

  • Cách 1: Gửi snapshot Btrfs hoặc ZFS qua SSH. Tốc độ truyền cực nhanh ở tầng block. Điểm trừ là cả máy nguồn và máy đích phải format chung filesystem Btrfs/ZFS, rất bất tiện nếu bạn dùng VPS hoặc cloud storage giá rẻ.
  • Cách 2: Dùng Restic hoặc Duplicity. Restic hỗ trợ backend đa dạng như S3 hay MinIO. Tuy nhiên, khi repo phình to tới hàng triệu chunks trên server vật lý, Restic ngốn RAM rất mạnh (dễ chạm mốc 4-8GB RAM khi prune).
  • Cách 3: Triển khai BorgBackup (Borg). Công cụ này chuyên trị deduplication, viết bằng C và Python. Borg cắt file thành từng chunk nhỏ, băm hash, mã hóa ngay tại client rồi mới đẩy qua SSH. Chunk nào đã có trên đích sẽ được bỏ qua tức thì.

4. Cách tốt nhất: Thiết lập BorgBackup trên Fedora Server và tự động hóa qua SSH

Trên Fedora Server, BorgBackup là lựa chọn sáng giá nhất: tiết kiệm RAM, ổn định và repo package luôn cập nhật bản mới nhất từ upstream.

Bước 1: Cài đặt BorgBackup trên cả hai máy

Borg cần chạy ở cả hai đầu: Fedora Server (nguồn) và Backup Storage Server (đích). Trên Fedora, cài đặt qua DNF:

sudo dnf install -y borgbackup

Tại Backup Server (Ubuntu, Debian hoặc CentOS/Fedora), bạn cài gói tương ứng:

# Nếu backup server chạy Ubuntu/Debian
sudo apt update && sudo apt install -y borgbackup

Bước 2: Cấu hình SSH Key chuyên dụng cho backup

Để tiến trình tự chạy không hỏi password, hãy tạo riêng một cặp SSH Key trên Fedora Server:

# Tạo key ed25519 không passphrase cho user root
sudo ssh-keygen -t ed25519 -f /root/.ssh/id_borg_ed25519 -N ""

# Chép public key sang Backup Server
sudo ssh-copy-id -i /root/.ssh/id_borg_ed25519.pub [email protected]

Kiểm tra kết nối thử bằng lệnh:

sudo ssh -i /root/.ssh/id_borg_ed25519 [email protected] "echo 'SSH kết nối thành công!'"

Bước 3: Khởi tạo Repository mã hóa (Borg Init)

Chế độ mã hóa repokey-blake2 được ưu tiên hàng đầu nhờ tốc độ tính hash siêu nhanh và bảo vệ dữ liệu bằng thuật toán AES-256. Đứng từ Fedora Server, chạy lệnh init repo:

export BORG_RSH="ssh -i /root/.ssh/id_borg_ed25519"
export BORG_PASSPHRASE="MatKhauCucKyBaoMatCuaBan123@#"

# Khởi tạo repo tại /data/backups/fedora-app trên máy đích
borg init --encryption=repokey-blake2 [email protected]:/data/backups/fedora-app

Cực kỳ quan trọng: Hãy backup key ra file riêng và cất vào Bitwarden hoặc USB rời. Mất key đồng nghĩa vĩnh viễn không mở được backup:

borg key export [email protected]:/data/backups/fedora-app /root/borg-key-backup.txt

Bước 4: Viết script sao lưu và dọn dẹp snapshot cũ (Prune)

Tạo file shell script tại /usr/local/bin/borg-backup.sh:

sudo nano /usr/local/bin/borg-backup.sh

Nội dung script nén bằng thuật toán lz4 để giữ tốc độ cao, giữ lại bản backup của 7 ngày, 4 tuần và 6 tháng gần nhất:

#!/usr/bin/env bash
set -euo pipefail

# Cấu hình môi trường
export BORG_REPO="[email protected]:/data/backups/fedora-app"
export BORG_PASSPHRASE="MatKhauCucKyBaoMatCuaBan123@#"
export BORG_RSH="ssh -i /root/.ssh/id_borg_ed25519 -o BatchMode=yes"

ARCHIVE_NAME="::fedora-backup-$(date +'%Y-%m-%d_%H%M%S')"

echo "[$(date)] Bắt đầu tiến trình BorgBackup..."

# Sao lưu thư mục quan trọng, loại trừ cache rác
borg create \
    --verbose \
    --stats \
    --compression lz4 \
    --exclude-caches \
    "$BORG_REPO$ARCHIVE_NAME" \
    /etc \
    /var/www \
    /home

echo "[$(date)] Dọn dẹp snapshot theo chính sách retention..."

# Giữ: 7 ngày, 4 tuần, 6 tháng
borg prune \
    --list \
    --keep-daily=7 \
    --keep-weekly=4 \
    --keep-monthly=6 \
    "$BORG_REPO"

echo "[$(date)] Hoàn tất backup an toàn!"

Phân quyền nghiêm ngặt để chỉ root mới xem được file chứa passphrase:

sudo chmod 700 /usr/local/bin/borg-backup.sh

Bước 5: Lập lịch tự động bằng Systemd Timer thay vì Crontab

Systemd timer theo dõi log chuẩn xác qua journalctl và tránh tình trạng chạy đè job nếu backup hôm trước chưa xong.

Tạo service unit tại /etc/systemd/system/borg-backup.service:

[Unit]
Description=BorgBackup Automated Job
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/borg-backup.sh
StandardOutput=journal
StandardError=journal

Tạo tiếp timer unit tại /etc/systemd/system/borg-backup.timer để kích hoạt vào 02:00 sáng mỗi ngày:

[Unit]
Description=Run BorgBackup Daily at 02:00 AM

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

Nạp lại cấu hình và kích hoạt:

sudo systemctl daemon-reload
sudo systemctl enable --now borg-backup.timer

# Kiểm tra lịch chạy sắp tới
sudo systemctl list-timers borg-backup.timer

Bước 6: Kiểm tra snapshot và diễn tập khôi phục (Restore)

Chưa diễn tập restore thì chưa thể yên tâm. Để liệt kê các bản snapshot đã lưu trong repo:

export BORG_RSH="ssh -i /root/.ssh/id_borg_ed25519"
export BORG_PASSPHRASE="MatKhauCucKyBaoMatCuaBan123@#"

borg list [email protected]:/data/backups/fedora-app

Thử trích xuất riêng thư mục /etc từ một bản snapshot bất kỳ để kiểm tra tính toàn vẹn:

mkdir -p /mnt/recovery && cd /mnt/recovery

# Restore riêng /etc (lưu ý: bỏ dấu gạch chéo đầu)
borg extract [email protected]:/data/backups/fedora-app::fedora-backup-2026-10-20_020000 etc

Thực tế tại hệ thống của mình, 30 ngày backup liên tục cho 320GB dữ liệu gốc chỉ tốn vỏn vẹn 48GB dung lượng lưu trữ trên backup server. Nhờ Borg, bạn vừa tiết kiệm tới 85% chi phí ổ cứng, vừa tự tin đối phó với sự cố phần cứng hay mã độc tấn công.

Share: