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
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.timernano /etc/systemd/system/backup.service- Sử dụng nội dung sau
[Unit]Description=Backup PVE host configuration to PBSAfter=network-online.target[Service]Type=oneshotExecStart=/usr/local/bin/backup.sh
- Tạo file
.timer. Nó sẽ thực thi.servicetheo 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:00Persistent=trueAccuracySec=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
- Reload systemd
Kiểm tra systemctl list-timers | grep backup
Kết quả kiểm traMon 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.serviceTue 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
roottrên máy PVEssh-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.104nế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: Chọn PBS đã thêm ở bước cài đặt
- Schedule: Điền tue,thu,sat 04:00 để chọn thứ 3, 5, 7 vào lúc 4h. Thay đổi tùy ý
- Selection mode: All (hoặc các lựa chọn khác nếu muốn)
- Mode: Snapshot
- Enable: true
- Add

Lên lịch verify
- PBS web > Datastore > Verify Jobs > Add
- Local Datastore: chọn datastore đã tạo khi cài đặt
- Schedule: tue,thu,sat 05:00 để lên lịch verify lúc 5h, sau khi backup
- Skip Verified: chọn để bỏ qua những file đã verified. tiết kiệm tài nguyên
- Re-Verify After: 7 ngày. Verify lại những file đã verify quá 7 ngày
- Add

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

