16.备份与恢复Backup and Restore
备份是任何合理 IT 部署的必需。 Proxmox VE 提供完整集成方案 , 利用各存储与客户机类型的能力 —— 管理员可用 mode 在一致性与停机之间精调。 PVE 备份 总是完整备份 —— 含 VM/CT 配置与全部数据。可经 GUI 或 vzdump CLI 触发。
备份存储
开始备份前需定义备份存储(见存储章节)—— 可以是 Proxmox Backup Server 存储(去重分块与元数据), 也可以是文件级存储(作普通文件存)。建议用独立主机上的 Proxmox Backup Server —— 它有进阶特性;或用 NFS 作替代。两种情况下都可再存到磁带做离线归档。
计划备份
可为指定节点 / 客户机配置按日按时自动执行的备份 job —— 详见 §16.5。
16.1.备份模式Backup Modes
VM 的备份模式
stop- 一致性最高 , 代价是短时停机 —— 有序关停 VM , 然后用后台 QEMU 进程做备份;备份启动后若 VM 原本在跑则恢复运行。由 live backup 特性保证一致性。
suspend- 兼容性保留 —— 先挂起 VM 再调用 snapshot 模式。停机更长且不一定提升数据一致性 —— 推荐直接用 snapshot。
snapshot- 停机最少 , 有小的一致性风险 —— VM 运行时边备份边复制数据块;若启用并运行 guest agent(
agent: 1), 会调guest-fsfreeze-freeze/guest-fsfreeze-thaw提升一致性。
Windows 客户机中若还使用了其他备份软件 , 必须配置 guest agent。详见 guest agent 章节的 Freeze & Thaw。
PVE live backup 在任何存储类型上都提供类快照语义 —— 底层存储不需要支持快照。也注意 :备份由后台 QEMU 进程做 , 一台已停的 VM 在 QEMU 读盘期间可能 短时 显示为「正在运行」—— 但 VM 本身未启动 , 只是盘被读。
容器的备份模式
stop- 备份期间停机 —— 可能停很久。
suspend- 先 rsync 到临时位置(见
--tmpdir), 挂起容器 , 再次 rsync 增量 , 然后恢复容器 —— 停机最少 , 但需额外空间。容器在本地 FS 而备份目标是 NFS / CIFS 时 ,--tmpdir应设在本地 FS , 性能会提升数倍;使用 ACL 的本地容器在 suspend 模式备份到 NFS 时也必须用本地 tmpdir。 snapshot- 用底层存储的快照能力 —— 先挂起容器保一致 , 建临时快照 , 将其内容归档为 tar , 最后删快照。
snapshot 模式要求所有被备份的卷 均位于支持快照的存储。用挂载点选项 backup=no 可把某卷排除(从而免除此要求)。
默认 , Root Disk 之外的附加挂载点 不 纳入备份。卷型挂载点可设 Backup 选项纳入;设备 / bind 挂载永不备份 —— 其内容不由 PVE 存储库管理。
16.1.1.VM 备份 Fleecing
VM 开始备份时 , QEMU 会在块层插入「copy-before-write」过滤器 —— 新的客户机写操作发生时 , 被覆盖的、备份仍需要的旧数据会 先 发到备份目标;客户机的写入会阻塞 , 未备份区域的 IO 被备份目标速度拖累。
启用 fleecing 后 , 这些旧数据先缓存到 fleecing image , 而非直接送到备份目标 —— 可改善客户机 IO 性能并在某些场景避免挂起 , 代价是额外存储空间。手动启动 VM 123 的带 fleecing 备份:
vzdump 123 --fleecing enabled=1,storage=local-lvm
也可按 job 设置或在节点级作全局回退(见 §16.10 配置项), UI 中在编辑备份 job 的 Advanced 页可配。
fleecing 存储应为本地快存储 , 具备瘦配置与 discard —— 如 LVM-thin、 RBD、 ZFS with sparse 1、多数文件型存储。最好是专用存储 —— 满了只会让该次备份失败 , 不影响其他客户机。已备份完的 fleecing 区段会被 discard 以保持空间占用低。
文件型存储不支持 discard 时(如 NFS 4.2 之前), 在存储配置关掉 preallocation;配合 qcow2(该存储支持时自动选作 fleecing 格式), 镜像中已分配区段可被后续重复利用 , 仍可节省空间。
非瘦配置存储(如裸 LVM / 未开 sparse 的 ZFS)上 , fleecing 镜像需 预留 等于原盘大小的空间。瘦配置存储上 , 只有当 guest 在另一个盘备份时全量重写整个盘时 , fleecing 镜像才会长到与原盘等大。
16.1.2.CT Change Detection 模式
针对目标为 Proxmox Backup Server 的容器备份 , 该选项决定 pxar 归档的编码格式 , 以及对已变 / 未变文件的处理方式。可在编辑 job 的 Advanced 页配置 , 或在 §16.10 配置项里设为节点级回退。三种模式:
| 模式 | 说明 |
|---|---|
Default | 将所有文件读取并编码到单归档 , 使用 pxar 格式 v1。 |
Data | 读取并编码全部文件 , 但数据与元数据分成独立流 , 使用 pxar 格式 v2。 |
Metadata | 分流 + v2 格式 , 但用上一个快照的元数据归档检测未变文件 , 尽可能重用其数据块 —— 不再从盘读文件内容。 |
用 metadata 模式手动备份 VM 123:
vzdump 123 --storage pbs-storage --pbs-change-detection-mode metadata
VM 备份或目标不是 PBS 的存储 不 受该设置影响。
16.2.备份文件名Backup File Names
较新版 vzdump 把客户机类型与备份时间编入文件名 , 例如:
vzdump-lxc-105-2009_10_09-11_04_43.tar
这样可在同目录存多份备份。用下文 §16.6 的保留选项限制保留份数。
16.3.备份压缩Backup File Compression
备份文件可用 lzo、 gzip 或 zstd 压缩。目前 Zstandard 最快 , 还支持多线程;lzo / gzip 更通用且常默认预装。可装 pigz 作 gzip 的替代(多线程)。 pigz 与 zstd 的线程 / 核心数可调(见 §16.10 配置项)。通过备份文件扩展名通常即可判定压缩算法:
| 扩展名 | 压缩 |
|---|---|
.zst | Zstandard(zstd) |
.gz 或 .tgz | gzip |
.lzo | lzo |
若文件名不以上述扩展名结束 , 则未经 vzdump 压缩。
16.4.备份加密Backup Encryption
针对 Proxmox Backup Server 存储 , 可选配 客户端加密 —— 详见相应 PBS 章节。
16.5.备份 JobBackup Jobs
除手动触发 , 还可设置周期 job , 对所有 / 选定客户机备份到某存储。可在 Datacenter → Backup 或经 /cluster/backup API 管 —— 都会写入 /etc/pve/jobs.cfg, 由 pvescheduler 守护进程解析执行。
一个 job 绑定到全集群或指定节点 , 按给定 schedule 执行 —— 格式与 systemd calendar 事件非常相似(详见 calendar events 章节)。 UI 中 Schedule 可自由编辑 , 下拉提供若干示例作起点。
可设 job 级 保留选项(覆盖存储 / 节点配置), 以及 备注模板(让备份附带额外信息)。计划备份若因主机离线或 pvescheduler 被禁而错过了执行 , 可开 Repeat missed(UI Advanced / 配置 repeat-missed)让调度器尽快补跑。
性能调优(部分暴露在 UI Advanced):bwlimit 限 IO 带宽 , 压缩线程用 pigz(替 gzip)或 zstd 控制 , 还有 ionice(BFQ 调度器下)和 performance 里的 max-workers(仅 VM)、 pbs-entries-max(仅容器), 详见 §16.10。
16.6.备份保留Backup Retention
用 prune-backups 灵活指定保留策略:
keep-all <boolean>- 保留全部 —— 为 true 时其他选项不可用。
keep-last <N>- 保留最近 N 个。
keep-hourly <N>- 保留最近 N 小时的备份 —— 同一小时内有多个则只留最新。
keep-daily <N>- 最近 N 天 —— 同一天多个只留最新。
keep-weekly <N>- 最近 N 周 —— 同一周多个只留最新。
keep-monthly <N>- 最近 N 月 —— 同一月多个只留最新。
keep-yearly <N>- 最近 N 年 —— 同一年多个只留最新。
周从周一开始、周日结束 —— 基于 ISO week date, 可正确处理年末跨周。
保留选项按上列顺序处理 —— 每个选项只覆盖其时段内的备份 , 下一选项不再处理已覆盖的备份 , 仅考虑更旧的备份。逗号分隔列表:
# vzdump 777 --prune-backups keep-last=3,keep-daily=13,keep-yearly=9
虽可直接在 vzdump 命令传 prune-backups , 但通常把它配在存储级更合理 —— Web 界面即可。
16.6.1.Prune Simulator
Proxmox Backup Server 文档里提供 prune 模拟器 —— 可探索不同保留选项与备份计划的效果。
16.6.2.保留策略示例
备份频率与老备份保留期取决于数据变化频率、较老状态的重要性 —— 若备份作为公司文档归档 , 还可能有法规要求。本例假设 :每日备份 , 保留期 10 年 , 备份之间的间隔逐渐加大。
keep-last=3—— 即便只做日备 , 管理员可能在大升级前后额外做一次。keep-hourly不设 —— 日备中不相关 , 额外手动备份已被 keep-last 覆盖。keep-daily=13—— 与 keep-last 合计至少覆盖两周日备。keep-weekly=8—— 确保至少两个月的周备。keep-monthly=11—— 与上面合计至少一年月备。keep-yearly=9—— 长期归档 —— 加上当前年份共覆盖至少 10 年。
建议比最低需求保留更长 —— 觉得多了可再调低 , 已删备份无法再生。
16.7.备份保护Backup Protection
可把备份标记为 protected 防误删 —— 在 PVE UI / CLI / API 上删除被拒。但这由 PVE 强制 , 不是 文件系统层面 —— 对底层备份存储有写权限者仍可手动删文件。
被保护的备份会被 prune 忽略 , 不计入保留设置。
文件系统型存储用 sentinel 文件 <backup-name>.protected 实现;PBS 则由服务端处理(自 PBS 2.1 起)。用存储选项 max-protected-backups 控制每客户机允许的受保护份数 , -1 为无上限;默认 :有 Datastore.Allocate 特权者无上限 , 其他用户 5 份。
16.8.备份备注Backup Notes
可在 UI 用 Edit Notes 或经存储内容 API 给备份加备注。也可指定 模板 为备份 job / 手动备份动态生成备注 —— 用 {{}} 包围变量 , 执行时替换。当前支持:
{{cluster}}:集群名(若有){{guestname}}:虚拟客户机分配的名字{{node}}:执行备份节点的主机名{{vmid}}:客户机数字 VMID
API / CLI 传入时须单行 —— 换行与反斜杠需转义为字面 \n 与 \\。
16.9.恢复Restore
可经 Web GUI 或以下 CLI 恢复:
pct restore:容器恢复工具qmrestore:VM 恢复工具
详见对应 man 页。
16.9.1.带宽限制
恢复多个大备份可能耗大量资源 —— 读备份存储 + 写目标存储都占带宽 , 可能影响其他客户机。 PVE 实现两种限制:
- per-restore 限制:从备份归档读取的最大带宽
- per-storage 写入限制:写到某存储的最大带宽
读限制会间接影响写入 —— 毕竟写不会超过读。较小 per-job 限制 覆盖 较大 per-storage 限制;较大 per-job 仅当对相关存储有 Data.Allocate 权限时才能覆盖 per-storage。 CLI 用 --bwlimit <整数>(单位 KiB/s)设置 —— 例如 10240 限到 10 MiB/s。
把 bwlimit 设为 0 可为某次恢复禁用所有限制 —— 恢复关键 VM 时有用(需存储上有 Data.Allocate)。
为某存储设默认恢复带宽:
# pvesm set STORAGEID --bwlimit restore=KIBs
16.9.2.Live-Restore
大备份恢复需要时间 , 其间客户机不可用。备份在 PBS 上的 VM 可用 live-restore 缩短不可用 —— 经 GUI 勾选或 qmrestore --live-restore, 恢复一开始 VM 即启动 , 数据在后台拷贝 , 优先拷 VM 当前访问的 chunk。
两点注意:
- Live-restore 期间 VM 的磁盘读速受限 —— 数据要从备份服务器拿(一次加载后立刻落到目标存储 , 再访问同数据无惩罚);写速几乎不受影响。
- Live-restore 因任何原因失败 , VM 处于未定义状态 —— 并非所有数据都已复制 , 期间失败恢复中写入的数据基本无法保留。
此模式对启动只需少量数据的大 VM 特别有用(如 Web 服务器)—— OS 与关键服务起来后 VM 即可用 , 后台继续拷贝少用数据。
16.9.3.单文件恢复
存储 GUI Backups 页的 File Restore 按钮可直接打开备份数据的文件浏览器 —— 仅限 PBS 备份。容器的第一层显示所含 pxar 归档 , 可自由浏览;VM 的第一层是盘镜像 , 打开后显示该盘上可识别的存储技术 , 最基本情况是 part(分区表), 每个分区可继续进入。 VM 情形下并非所有数据都可访问(不支持的 guest FS / 存储技术等)。
文件与目录可用 Download 按钮下载 —— 目录会即时打成 zip。
为安全访问可能含不可信数据的 VM 镜像 , 启动一个临时 VM(对用户不可见作客户机)承担该任务。这并不代表下载的数据就安全 , 但避免把 hypervisor 暴露于危险;该 VM 有超时后自动停止 —— 整个过程对用户透明。
故障排查 :每个临时 VM 实例会在 /var/log/proxmox-backup/file-restore/ 产生日志;尝试恢复单个文件或访问备份中文件系统失败时 , 日志可能有额外信息。
16.10.配置Configuration
全局配置存于 /etc/vzdump.conf —— 冒号分隔 key/value , 每行 OPTION: value;空行忽略 , # 开头为注释。文件值作默认 , 命令行可覆盖。支持:
bwlimit: <0 - N>(默认 0)- IO 带宽限制(KiB/s)。
compress: <0 | 1 | gzip | lzo | zstd>(默认 0)- 压缩 dump。
dumpdir: <string>- 把产物存到指定目录。
exclude-path: <array>- 排除(shell glob)——
/开头的路径锚定到容器根 , 其他路径相对每个子目录。 fleecing: [enabled=<1|0>][,storage=<storage ID>]- VM fleecing ——
enabled默认 0;storage应是支持 discard 且瘦配置 / 稀疏文件的本地存储。 ionice: <0 - 8>(默认 7)- BFQ 调度器下的 IO 优先级 —— 8 = idle,其它 = best-effort 加该值。 VM 的 snapshot / suspend 备份仅作用于压缩器。
lockwait: <0 - N>(默认 180)- 等全局锁的最长分钟数。
mailnotification: <always | failure>(默认 always)- 已弃用 —— 改用通知目标 / 匹配器。
mailto: <string>- 已弃用 —— 逗号分隔的收件地址 / 用户。
maxfiles: <1 - N>- 已弃用 —— 改用
prune-backups。每客户机最多保留份数。 mode: <snapshot | stop | suspend>(默认 snapshot)- 备份模式。
notes-template: <string>- 备注模板 —— 支持变量
{{cluster}}/{{guestname}}/{{node}}/{{vmid}}(未来可能增加)。单行 , 换行与反斜杠需转义为\n与\\。需联用storage选项。 notification-mode: <auto | legacy-sendmail | notification-system>(默认 auto)legacy-sendmail:用mailto/mailnotification并经sendmail发信。notification-system:经 PVE 通知系统发 , 忽略上述两项。auto:设了mailto就发邮件 , 否则用通知系统。pbs-change-detection-mode: <data | legacy | metadata>- PBS 容器备份的变更检测与编码模式(见 §16.1.2)。
performance: [max-workers=<integer>][,pbs-entries-max=<integer>]- 其他性能设置:
max-workers(默认 16, 1 – 256):仅 VM —— 同时并发 IO worker 上限。pbs-entries-max(默认 1048576, 1 – N):仅 PBS 容器备份 —— 内存中同时允许的条目上限 , 防 OOM。含大量文件的容器可增大。
pigz: <integer>(默认 0)- N > 0 时用
pigz替gzip。 N = 1 用半数核 , N > 1 作线程数。 pool: <string>- 备份指定池里已知的全部客户机。
protected: <boolean>- true 时把备份标为 protected。需联用
storage。 prune-backups: [keep-...=N][...](默认keep-all=1)- 覆盖存储的保留策略;子键包括
keep-all/keep-daily/keep-hourly/keep-last/keep-monthly/keep-weekly/keep-yearly(含义见 §16.6)。 remove: <boolean>(默认 1)- 按
prune-backups清理旧备份。 script: <string>- 指定钩子脚本。
stdexcludes: <boolean>(默认 1)- 排除临时文件与日志。
stopwait: <0 - N>(默认 10)- 等待客户机停止的最长分钟数。
storage: <storage ID>- 把产物存到此存储。
tmpdir: <string>- 临时文件目录。
zstd: <integer>(默认 1)- Zstd 线程数 —— N = 0 用半数核 , N > 0 作线程数。
vzdump.conf 示例:
tmpdir: /mnt/fast_local_disk storage: my_backup_storage mode: snapshot bwlimit: 10000
16.11.钩子脚本Hook Scripts
用 --script 指定钩子脚本 —— 它会在备份过程的多个阶段被调用 , 参数随阶段而定。文档目录下有示例 vzdump-hook-script.pl。
16.12.文件排除File Exclusions
该选项 仅 作用于容器备份。
vzdump 默认跳过下列文件(--stdexcludes 0 关闭):
/tmp/?* /var/tmp/?* /var/run/?*pid
也可手动指定额外排除:
# vzdump 777 --exclude-path /tmp/ --exclude-path '/var/foo*'
上面排除 /tmp/ 目录和名为 /var/foo、 /var/foobar…… 的所有文件 / 目录。
备份到 PBS 以及 suspend 模式的备份中 , 尾随斜杠的模式匹配目录但不匹配文件;非 PBS 的 snapshot / stop 模式备份中 , 尾随斜杠的模式 当前根本不匹配 —— 因 tar 命令不支持。
不以 / 开头的路径不锚定到容器根 , 而是对任意子目录匹配。例如:
# vzdump 777 --exclude-path bar
排除名为 /bar、 /var/bar、 /var/foo/bar 等的文件 / 目录 , 但 不排 /bar2。配置文件也会放入归档(./etc/vzdump/ 下), 恢复时能正确还原。
16.13.示例Examples
备份客户机 777 —— 无快照 , 仅把私有区 + 配置归档到默认 dump 目录(通常 /var/lib/vz/dump/):
# vzdump 777
用 rsync + suspend/resume 做快照(最小停机):
# vzdump 777 --mode suspend
备份所有客户机 , 给 root 与 admin 发通知邮件(mailto 已设且 notification-mode 默认 auto —— 经系统 sendmail 发 , 不走通知系统):
# vzdump --all --mode suspend --mailto root --mailto admin
snapshot 模式(无停机)到非默认 dump 目录:
# vzdump 777 --dumpdir /mnt/backup --mode snapshot
选择性备份多个客户机:
# vzdump 101 102 103 --mailto root
备份除 101 与 102 外所有客户机:
# vzdump --mode suspend --exclude 101,102
把容器恢复为新 CT 600:
# pct restore 600 /mnt/backup/vzdump-lxc-777.tar
把 QEMU VM 恢复为 VM 601:
# qmrestore /mnt/backup/vzdump-qemu-888.vma 601
用管道把容器 101 克隆为新容器 300(rootfs 4 GB):
# vzdump 101 --stdout | pct restore --rootfs 4 300 -