Skip to main content

Sao lưu với PBS

Sao lưu PVE sẽ chia làm 2 phần.

  • Sao lưu VM/CTs: Được PBS hỗ trợ nên có thể thực hiện đơn giản trên GUI
  • Sao lưu cấu hình PVE: Phần này phải sử dụng script

Sao lưu cấu hình PVE

Vì PVE không có chức năng backup cấu hình nên chúng ta sẽ cần sử dụng script và dùng systemd timer để lên lịch backup tự động.

Backup script

Trước khi bắt đầu với script chúng ta cần chuẩn bị 2 thứ là PBS API Token và Fingerprint

  • Fingerprint
    • PBS Web > Dashboard > Show fingerprint
  • API Token
    • PBS Web > Configuration > Access Control > API Token
    • Nếu chưa có hãy thêm mới. Sau khi nhấn Add bạn sẽ nhận được Token ID và Sceret. Hãy lưu lại để dùng ở bước tiếp theo.
      image.png

Tạo script backup bằng lệnh nano /usr/local/bin/backup.sh với nội dung sau. Điền thông tin đã chuẩn bị vào phần Cấu hình.

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

########################################
# CẤU HÌNH PBS
########################################
# IP/FQDN PBS và Datastore
PBS_HOST='PBS IP'
PBS_DATASTORE='Datastore'

PBS_USER_TOKEN='Token ID'
PBS_TOKEN_SECRET='API Token Sceret'
PBS_FINGERPRINT='Fingerprint'

########################################
# TUỲ CHỌN CHUNG
########################################
BACKUP_ID="${BACKUP_ID:-"$(hostname)-hostcfg"}"
DRY_RUN="${DRY_RUN:-0}"

export PBS_REPOSITORY="${PBS_USER_TOKEN}@${PBS_HOST}:${PBS_DATASTORE}"
export PBS_PASSWORD="${PBS_TOKEN_SECRET}"
export PBS_FINGERPRINT="${PBS_FINGERPRINT}"

########################################
# NGUỒN BACKUP (CHỈ THƯ MỤC, KHÔNG FILE LẺ)
########################################
SOURCES=(
  "pve-etc.pxar:/etc"                           # Bao trọn: pve, network, hosts, resolv.conf, hostname, apt, ssh, default, kernel, modules, modprobe.d, sysc>
  "pve-cron.pxar:/etc/cron.d"                   # Cron.d
  "pve-crontabs.pxar:/var/spool/cron/crontabs"  # Tất cả crontab user (bao gồm root)
  "pve-root-home.pxar:/root"                    # Script & key quản trị (cân nhắc exclude bớt)
  "pve-usrlocal.pxar:/usr/local"                # Script/service tự thêm (nếu có)
)

# Loại trừ cho nhẹ (tuỳ bạn chỉnh)
EXCLUDES=(
  "--exclude=/root/*.iso"
  "--exclude=/root/*.img"
  "--exclude=/root/.cache"
)

########################################
# TIỀN KIỂM TRA
########################################
echo "[*] Checking PBS login..."
proxmox-backup-client login --repository "${PBS_REPOSITORY}"

########################################
# THỰC HIỆN BACKUP
########################################
echo "[*] Starting host-config backup (backup-id=${BACKUP_ID})"
CMD=(proxmox-backup-client backup)
CMD+=("${SOURCES[@]}")
CMD+=("${EXCLUDES[@]}")
CMD+=(--backup-id "${BACKUP_ID}")
CMD+=(--backup-type host)

if [[ "${DRY_RUN}" == "1" ]]; then
  CMD+=(--dry-run)
  echo "[*] DRY RUN enabled"
fi

# In câu lệnh (ẩn secret) rồi chạy
echo "[*] Running: ${CMD[*]/${PBS_TOKEN_SECRET}/***SECRET***}"
"${CMD[@]}"

echo "[✓] Backup finished"

# Dọn biến nhạy cảm
unset PBS_PASSWORD

Cấp quyền thực thi cho script chmod +x /usr/local/bin/backup.sh

Dùng lệnh DRY_RUN=1 /usr/local/bin/backup.sh để kiểm tra. Nếu kết thúc bằng [✓] Backup finished tức là thành công.

Dùng lệnh /usr/local/bin/backup.sh để chạy script

Lập lịch tự động

Thực hiện trên console hoặc ssh của PVE

  • Tạo file .service. Đây là hành vi sẽ được thực hiện bởi .timer
    • nano /etc/systemd/system/backup.service
    • Sử dụng nội dung sau
      [Unit]
      Description=Backup PVE host configuration to PBS
      After=network-online.target
      [Service]
      Type=oneshot
      ExecStart=/usr/local/bin/backup.sh
  • Tạo file .timer. Nó sẽ thực thi .service theo thời gian được chỉ định.
    • nano /etc/systemd/system/backup.timer
    • Sử dụng nội dung sau
      [Unit]
      Description=Schedule PVE host config backup (Tue, Thu, Sat at 2:00)
      [Timer]
      OnCalendar=Tue,Thu,Sat 2:00
      Persistent=true
      AccuracySec=1min
      [Install]
      WantedBy=timers.target
  • Kích hoạt timer
    • Reload systemd systemctl daemon-reload
    • Kích hoạt timer systemctl enable --now pve-host-backup.timer

Kiểm tra systemctl list-timers | grep backup

Kết quả kiểm tra
Mon 2025-11-10 00:00:00 +07 20h Sun 2025-11-09 00:00:43 +07 3h 47min ago dpkg-db-backup.timer dpkg-db-backup.service
Tue 2025-11-11 02:00:00 +07 1 day 22h - - backup.timer backup.service

Tự động Verify sau khi backup

Chuẩn bị ssh key trên PVE

  • Tạo cặp khóa SSH (public/private key) cho tài khoản root trên máy PVE
    ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
  • Sao chép public key (file .pub) từ máy PVE sang máy PBS, để PBS cho phép root@PVE đăng nhập mà không cần mật khẩu.
    ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.104
    Lần đầu chạy sẽ yêu cầu nhập đúng mật khẩu.
  • Để kiểm tra hãy thử truy cập ssh root@192.168.1.104 nếu không yêu cầu mật khẩu là thành công.

Thêm code post-verify vào cuối script backup trên.

# ==== POST: VERIFY DATASTORE TRÊN PBS SAU KHI BACKUP THÀNH CÔNG ====
if [[ "${DRY_RUN}" != "1" ]]; then
  echo "[*] Trigger verify on PBS for datastore '${PBS_DATASTORE}' ..."
  # Chạy verify toàn datastore. Mặc định --ignore-verified=true nên chỉ verify snapshot mới/chưa verified
  # hoặc snapshot đã quá hạn theo --outdated-after
  ssh -o BatchMode=yes root@"${PBS_HOST}" \
    "proxmox-backup-manager verify '${PBS_DATASTORE}' --ignore-verified true --outdated-after 7" \
    && echo '[✓] Verify job started on PBS' \
    || echo '[!] Failed to start verify job on PBS'
fi

Sao lưu VM/CTs

Mục tiêu là lên lịch để PVE tự động chạy backup mỗi thứ 3, 5, 7 vào lúc 4h và thực hiện verify sau đó vào lúc 5h

Lên lịch backup

  • PVE web > Datacenter > Backup > Add
  • Storage: CỌn

tue,thu,sat 03:00


Lưu ý

Với task backup cho DSM. PVE sẽ thực hiện backup tất cả các ổ đĩa được passthrough cho DSM nên dung lượng cần backup là rất lớn, và điều này cũng là không cần thiết vì DSM đã sử dụng Hyper Backup.

Để tắt backup cho 2 ổ cứng này PVE Web > pve > VM DSM > Hardware > Disk. Tick chọn Advanced > Bỏ tích Backup

image.png