资讯动态

KVM虚拟机备份实战:virtnbdbackup热备份与增量备份方案详解

发布时间:2026/10/5 2:29:59 来源:尧图企业网站定制
1. 这个工具到底是什么为什么我们需要它聊到虚拟化备份做过生产环境运维的朋友应该都有同感KVM/QEMU 虚拟机一多备份就成了最让人头疼的问题之一。传统的做法无外乎几种要么在虚拟机内部装 agent走文件级备份但这要求每台虚拟机都得预留账号、装客户端Windows 和 Linux 还得分别适配要么用 dd 直接整盘拷贝但几十 GB 甚至上百 GB 的虚拟磁盘全量拷贝一次要等半天存储空间也吃得厉害。还有很多人会想到用 qemu-img 做快照备份但 QEMU 的 internal snapshot 机制对 qcow2 格式支持还行碰到 raw 格式就抓瞎而且快照链一长虚拟机性能肉眼可见地下降。virtnbdbackup 这个工具我从第一次接触到现在用了快两年可以负责任地说它解决的就是上面这一堆痛点。它本质上是一个基于 libvirt 和 NBDNetwork Block Device协议 的 KVM/QEMU 虚拟机磁盘备份工具。它利用 QEMU 自带的块设备镜像机制在虚拟机不停机的状态下对磁盘进行热备份。最关键的是它支持全量备份、差异备份和增量备份三种模式增量备份基于 QEMU 的 dirty bitmap 机制备份速度极快对宿主机 I/O 的影响也控制得相当好。什么人适合用这个工具如果你是运维工程师、虚拟化平台管理员或者自己在家里的服务器上跑了一堆 KVM 虚拟机手上又没有商业备份软件比如 Veeam、Commvault的预算那 virtnbdbackup 几乎是最优解。它开源、免费工具本体是用 Python 写的依赖很少对宿主机性能的占用远低于传统方案。我身边有不少同行在 Proxmox VE 和纯 KVM 环境下都用它来做虚拟机备份反馈都很稳。这篇文章我不会给你堆一堆官网文档里已经写清楚的东西而是结合我实际使用的经验把 virtnbdbackup 的备份原理、安装部署、常见操作、恢复流程以及我在生产环境里踩过的一些坑全部整理出来。如果你正在为 KVM 虚拟机的备份方案发愁这篇文章值得你收藏起来慢慢看。2. 核心原理拆解virtnbdbackup 能实现快速热备份的关键机制2.1 NBD 与 qemu-nbd 在备份链路中扮演的角色要搞明白 virtnbdbackup 为什么能做到热备份得先理解 NBD 的工作方式。NBD 是一种网络块设备协议它允许一台机器通过网络访问另一台机器上的块设备。但在 virtnbdbackup 的场景里大部分情况下 NBD 并不是跨机器使用的而是通过 qemu-nbd 在宿主机本地将虚拟磁盘导出为一个块设备。这里需要解释一个很多人会混淆的点。virtnbdbackup 的命名中带有 nbd但在较新版本的实现中它已经不再仅仅依赖 qemu-nbd 导出整个磁盘而是通过 libvirt 的块拷贝block copy能力和 QEMU 的块设备交互接口来完成备份。底层的核心思路是利用 QEMU 的 backup 功能把虚拟机正在写入的磁盘状态实时拷贝到一个备份目标中。说白一点就是让 QEMU 自己来做一致性快照virtnbdbackup 负责调度和传输。我用一个生活化的类比来解释传统 dd 备份相当于你把一栋正在住人的房子里的家具全部搬出去复印一份搬的时候主人还在用这些家具所以你永远拷贝不到一个完全一致的状态。而 virtnbdbackup 的做法是在备份开始的那一刻让 QEMU 给这栋房子拍一张瞬间定格照之后住户继续正常生活但你拷走的是定格照里的内容备份数据和虚拟机运行状态完全一致这就是一致性热备份的底层逻辑。2.2 持久化脏页位图Dirty Bitmap如何支撑增量备份virtnbdbackup 最吸引人的能力是增量备份。增量备份的实现依赖于 QEMU 的 dirty bitmap 机制。简单来说QEMU 会在内存中维护一张位图记录哪些磁盘块在某个时间点之后被写过。当 virtnbdbackup 执行增量备份时它只需要读取这张位图中标记为 dirty 的块将其拷贝到备份文件中而不是扫描整个磁盘。这个机制让我想起了纸质地图和 GPS 导航的区别。全量备份像是对整个城市绘制了一幅完整地图而增量备份则是只记录你走过的街道以及这些街道的最新状况。虚拟机的写入操作在时间轴上往往是稀疏的大多数磁盘块在短时间内并不会发生变化因此增量备份的数据量通常只有全量备份的几个百分点。需要注意的是dirty bitmap 需要持久化存储。virtnbdbackup 在使用增量备份功能时会对 qcow2 磁盘的 bitmaps 做持久化配置确保虚拟机重启、迁移等操作后位图信息不会丢失。如果 bitmap 丢失增量备份链就会断裂接下来必须重新做一次全量备份。这个坑我在生产环境里踩过后面我会专门讲怎么规避。2.3 备份文件结构与格式选择virtnbdbackup 的备份输出格式和传统的一个镜像文件不太一样。它会把备份数据分割为多个文件主文件是 qcow2 格式的完整/增量数据文件同时会生成若干 .txt / .log 等元数据文件和一个 .conf 配置文件。配置文件里记录了虚拟机的原始磁盘路径、格式、备份类型等关键信息这使得后续的恢复操作可以完全自动化进行。这个设计我觉得非常实用。大多数备份工具生成的是一个巨大的单体文件恢复时你得手动指定目标磁盘的格式、大小、路径一旦搞错就恢复失败。而 virtnbdbackup 把虚拟机的硬件描述信息、磁盘配置信息都固化在了备份目录中恢复时工具可以直接读取配置文件自动推断出该创建的虚拟机 XML、磁盘格式和容量降低人工干预出错的概率。还有一点备份文件默认采用 qcow2 格式即使源磁盘是 raw 格式也没关系。qcow2 本身支持稀疏文件所以备份出来的文件体积通常远小于实际磁盘消费量这对存储空间的利用非常友好。如果备份的是 qcow2 源盘且带 dirty bitmap那备份文件也会继承位图信息后续在备份目标上还能继续做增量这为某些在副本上再开备份的场景提供了可能。3. 安装部署与前置准备把坑提前填平3.1 依赖组件清单测以及版本注意事项在安装 virtnbdbackup 之前宿主机上必须有以下组件正常工作libvirt 3.0 以上版本推荐使用发行版自带的 libvirt-daemon 和 libvirt-clientQEMU/KVM 3.0 以上版本需要支持 QMPQEMU Machine Protocol能力Python 3.6 以上virtnbdbackup 本身是 Python 写的qemu-img、qemu-nbd 工具链这些通常随 qemu-utils 或 qemu-block-extra 包安装备份目标目录建议使用独立挂载点比如单独的数据盘或者 NFS 共享存储版本兼容性这点要特别强调。我在初期使用 virtnbdbackup 时曾在 CentOS 7 自带的 QEMU 1.5 版本环境上折腾了很久结果发现老版本 QEMU 的 QMP 接口与新版本差异很大很多备份选项无法使用。如果你的宿主机还在跑比较老的系统建议先升级 QEMU 和 libvirt 再上 virtnbdbackup。用官方的话说越新的 QEMU 版本对 dirty bitmap 的支持越完善备份性能也越好。3.2 通过 pip 安装 virtnbdbackup 全流程virtnbdbackup 的安装很简单它已经发布到了 PyPI 所以直接在宿主机上执行 pip 安装即可。如果你的系统区分了 Python 2 和 Python 3务必使用 pip3pip3 install virtnbdbackupAI写代码bash1安装完成后可以用以下命令确认安装是否成功virtnbdbackup --versionAI写代码bash1我在 Ubuntu 20.04 和 Debian 11 上测试过安装过程没有遇到任何编译障碍所有依赖项都会自动从 PyPI 拉取。不过在 CentOS 8 上我遇到过一个情况系统默认的 pip3 指向的是 Python 3.6而系统自带的 libvirt-python 版本偏旧导致 virtnbdbackup 在连接 libvirt 时报告 API 版本不匹配。解决办法是升级 libvirt-pythonpip3 install --upgrade libvirt-pythonAI写代码bash1如果宿主机上有多个 Python 环境比如用了 Anaconda 或 pyenv建议把 virtnbdbackup 安装到系统 Python 环境中并确保 virtnbdbackup 命令所在的目录在 PATH 中。否则在 crontab 里执行备份脚本时容易遇到找不到命令的问题。3.3 备份工具的系统权限与用户权限规划这一步很多人会忽略但恰恰是最容易出问题的环节。virtnbdbackup 需要与 libvirt 通信还需要对虚拟机的磁盘文件做 read 操作。如果你直接用 root 用户运行当然一切顺利但安全上不够优雅。如果你的备份脚本跑在 crontab 里又不想用 root可以创建一个专门用于备份的系统用户并将其加入到 kvm 和 libvirt 用户组。useradd -r -m -s /bin/bash backupuserusermod -aG kvm,libvirt backupuserAI写代码bash12还需要在 /etc/polkit-1/rules.d/ 下添加一条规则允许 backupuser 无密码访问 libvirt 的系统总线。以 50-virtnbdbackup.rules 为例polkit.addRule(function(action, subject) {if (action.id org.libvirt.unix.manage subject.user backupuser) {return polkit.Result.YES;}});AI写代码123456配置完重启 polkit 服务或者直接重启宿主机再用 backupuser 执行 virtnbdbackup 测试一下连接。这条规则只放行了 libvirt 管理权限并没有开放 shell 登录之类的额外权限安全边界是清晰的。我建议每个使用 virtnbdbackup 的团队都走这一步别嫌麻烦。生产环境一旦出现权限事故代价远大于这点配置成本。4. 实操环节全量备份、增量备份与恢复演练全流程4.1 对单台虚拟机执行全量备份的完整命令假设宿主机上有一台名为 vm01 的虚拟机磁盘是 qcow2 格式我们要把它备份到 /backup/vm01 目录下。全量备份的命令如下virtnbdbackup -d vm01 -l full -o /backup/vm01AI写代码bash1其中 -d 指定虚拟机的 libvirt 域名称-l 指定备份级别为 full-o 指定备份输出目录。执行过程中virtnbdbackup 会输出日志包括连接虚拟机、处理磁盘位图、启动QEMU备份任务等步骤。备份完成后查看 /backup/vm01 目录你会看到类似以下的文件结构ls -lh /backup/vm01total 1.4G-rw-r--r-- 1 root root 1.4G Mar 25 02:00 vm01.qcow2-rw-r--r-- 1 root root 623 Mar 25 02:00 vm01.a1.sda.conf-rw-r--r-- 1 root root 124 Mar 25 02:00 vm01.a1.sda.txtAI写代码bash12345这里 .conf 文件保存了备份时虚拟机磁盘的原始信息和备份类型.txt 文件是增量链信息记录文件用于后期恢复时的链式推导。有一点需要说明全量备份输出的 qcow2 文件其虚拟大小和源盘一致但占用空间取决于源盘数据量。如果源盘数据远小于磁盘容量备份文件也会很小这正是 qcow2 稀疏特性带来的福利。如果你希望备份多个磁盘的虚拟机比如系统盘数据盘virtnbdbackup 默认会处理该虚拟机所有直连的磁盘设备你不需要额外指定。但如果虚拟机有未使用的 IDE/软驱设备之类的可以在创建虚拟机时避免挂载或者在备份时通过参数指定需要备份的磁盘。4.2 增量备份与差异备份背后是位图在起作用增量备份是 virtnbdbackup 的王牌功能。在已经有一次全量备份的基础上执行增量备份的命令是virtnbdbackup -d vm01 -l incr -o /backup/vm01AI写代码bash1执行完成后在备份目录里会多出一个新的 qcow2 文件比如 vm01.a2.sda.qcow2这个文件只包含自上次备份以来变化的磁盘数据块。这个文件可以叠加在全量备份文件之上形成一个完整的备份链。如果要执行差异备份原理上有点类似增量之上再增量命令为virtnbdbackup -d vm01 -l diff -o /backup/vm01AI写代码bash1增量备份和差异备份在备份集组织方式上略有差异增量备份每次在前一次备份的基础上记录变化而差异备份则记录自最近一次全量备份以来的所有变化。选择哪种模式取决于你的恢复策略增量的备份速度快、占用空间小但恢复时你需要将全量及后续所有增量按顺序合并差异的备份文件比增量大但恢复时只需要全量最新一次差异即可。我个人的生产习惯是每周日凌晨做一次全量备份每周一至周六晚上做增量备份。这样既保证了长期保留多个恢复点又避免了每天全量带来的存储开销。对于数据量在几百 GB 级别的虚拟机增量备份通常只需要几十秒到几分钟就能完成。4.3 备份脚本的自动化设计定时任务与日志切割光会手动敲命令还不够生产环境必须自动化。我分享一下我的备份脚本设计思路按虚拟机组分批备份避免同一时间所有虚拟机同时启动备份任务造成宿主机 I/O 雪崩。假设有三台虚拟机 vm01、vm02、vm03我可以写一个简单的 shell 脚本#!/bin/bashBACKUP_DIR/backupDOW$(date %u) # 1-77 表示周日if [ $DOW -eq 7 ]; thenLEVELfullelseLEVELincrfifor VM in vm01 vm02 vm03; dovirtnbdbackup -d $VM -l $LEVEL -o $BACKUP_DIR/$VM \--log-level info /var/log/virtnbdbackup/$VM.log 21doneAI写代码bash1234567891011121314在 crontab 中添加定时任务0 23 * * * /usr/local/bin/vm-backup.shAI写代码cron1脚本中通过日期判断全量还是增量逻辑简单但有效。日志要单独按虚拟机切分否则多台虚拟机的备份日志混在一起排查问题时想死的心都有。另外建议备份脚本返回非 0 退出码时通过 simple 的通知渠道比如邮件或钉钉机器人通知运维人员。备份失败不可怕可怕的是你过了一周才发现备份集是坏的。4.4 从备份恢复单文件恢复场景怎么做恢复操作分为两类一类是恢复单个虚拟磁盘文件另一类是恢复到新的虚拟机并启动运行。先讲单文件恢复。如果你只需要把某个备份点的磁盘文件提取出来可以用 qemu-img 针对备份目录进行处理。因为 virtnbdbackup 生成的主要数据文件本身就是 qcow2 格式可以直接用 qemu-img 转换。比如把全量备份的 qcow2 文件转换成 raw 格式qemu-img convert -O raw /backup/vm01/vm01.qcow2 /restore/vm01.rawAI写代码bash1这种方式适合你只需要挂载磁盘查看、提取某个目录文件等场景。不过要注意增量备份的文件不能单独用 qemu-img 读取必须合并到全量或上一层增量之上。你可以使用以下命令在恢复目标上重建完整磁盘virtnbdbackup -R -D /backup/vm01 -o /restore/vm01.qcow2AI写代码bash1这个命令会自动读取备份目录里的 .conf 和 .txt 链文件把全量备份和所有增量备份合并为一个完整的 qcow2 磁盘文件输出到指定目录。4.5 从备份恢复重建虚拟机并启动的完整演练如果要彻底还原一台虚拟机到某个备份时间点virtnbdbackup 提供了一条龙式的恢复操作。假设我们要把 vm01 恢复到新虚拟机 vm01-restorevirtnbdbackup -R -D /backup/vm01 -o /restore/vm01AI写代码bash1注意这里 -o 指定的是一个目录virtnbdbackup 会结合备份时的虚拟机 XML 信息自动生成新的虚拟机配置文件和磁盘镜像。恢复完成后你会发现 /restore/vm01 目录下有一个 .xml 文件。你可以用 virsh 重新定义这台虚拟机virsh define /restore/vm01/vm01.xmlAI写代码bash1如果原虚拟机还在运行建议先修改 XML 文件中的虚拟机名称、VNC 端口等冲突参数再执行 define。否则可能出现 MAC 地址冲突或者名称冲突。恢复后的数据一致性是有保证的因为备份时 QEMU dirty bitmap 帮我们做了数据块一致性追踪。但数据库类应用比如 MySQL、PostgreSQL最好还是在恢复完成后进行一次表级一致性校验毕竟应用层面的缓存机制是 QEMU 无法感知的。5. 进阶玩法备份任务的监控、清理与大批量虚拟机调度5.1 备份集保留策略如何避免备份把磁盘塞爆备份文件占用的空间如果不管不顾很快就会把存储盘塞满。我习惯的保留策略是全量备份保留 4 份增量备份保留最近 28 天。这个量级可以让我轻松应对一个月内任意时间点的恢复需求。virtnbdbackup 本身没有提供自动清理备份集的功能但备份目录的结构是有规律的可以用 find 命令结合目录名的日期信息做清理。比如find /backup -maxdepth 2 -type d -name *.a1.* -mtime 28 -exec rm -rf {} \;AI写代码bash1上面这条命令会把 28 天前的全量备份集目录删掉。不过删除备份集必须非常小心如果误删了全量备份所有依赖它的增量备份都会失效。所以我建议清理操作前先给备份目录做一次磁盘占用统计并把清理脚本单独加一个dry-run模式确认无误再真正执行删除。另外我不建议只在一个存储设备上保留备份。如果条件允许把备份文件定期同步到另一台机器或者对象存储。数据备份的本质是应对单点故障备份不能成为新的单点。5.2 用 virtnbdbackup 的返回值做备份状态监测virtnbdbackup 命令执行成功后返回 0失败时返回非 0并输出错误信息到 stderr。因此在 shell 脚本中可以很方便地捕获失败状态。配合 systemd timer 或者 cron 时建议把标准输出和错误输出分别重定向到日志文件脚本末尾用 $? 变量判断执行情况。更细致地我还会在备份完成后做两步校验第一步是检查备份目录中最新 qcow2 文件的修改时间是否在最近 N 分钟内第二步是用 qemu-img check 对全量备份文件做一致性检查发现异常立刻告警。这个双检查机制虽然会多花一点时间但对于确保备份可用性来说非常值得。qemu-img check /backup/vm01/vm01.qcow2AI写代码bash1如果输出中有 No errors were found 之类的信息说明文件结构正常。如果出现 error 或 leak 类提示就要考虑备份是否可信了。有些时候qemu-img check 报错并不代表备份完全不可用但至少说明磁盘镜像内部存在异常这种备份集在恢复时成功率会打折扣。5.3 大批量虚拟机备份时的宿主机并发度调优当宿主机上虚拟机数量较多时如果所有备份任务同时启动NBD 传输和磁盘读取会争抢宿主机的 I/O 和网络带宽可能导致业务虚拟机出现卡顿。我给生产环境设置的规则是同一时刻最多允许 2 个备份任务并发且这两个任务尽量分配到不同的存储池上。可以通过一个简单的并发控制脚本实现PIDS()for VM in $VM_LIST; dowhile [ ${#PIDS[]} -ge 2 ]; dosleep 30# 清理已结束的进程donevirtnbdbackup -d $VM -l $LEVEL -o $BACKUP_DIR/$VM PIDS($!)donewaitAI写代码bash12345678910这段逻辑的思路是维护一个 PID 列表只要正在执行的任务数达到上限就等待。这套并发控制模型我已经在 30 台虚拟机上稳定运行了一整年。需要强调一点如果你使用的是机械硬盘阵列并发度更要保守因为机械盘的随机读写性能本身就有限如果是全闪存储并发 2-4 个备份任务通常压力不大但具体情况还需要用 iostat 观察。6. 常见问题与排查技巧实录6.1 备份目录中缺少 bitmaps 导致增量备份失效之前提到过增量备份依赖 QEMU 的 dirty bitmap。在有些场景下比如虚拟机在两次备份之间执行了迁移或者 qemu-img commit 操作位图信息可能丢失。当你尝试执行增量备份时virtnbdbackup 会报类似 no bitmaps available 的错误这时需要先重新执行一次全量备份来重置备份链。如何判断虚拟机当前是否拥有持久化 bitmap可以用 qemu-img info 查看磁盘的 bitmaps 段落qemu-img info /var/lib/libvirt/images/vm01.qcow2AI写代码bash1输出中如果包含 bitmaps 相关字段说明位图存在如果没有说明增量备份基础不成立。为了避免这种情况可以开启 QEMU 的 persistent bitmapvirtnbdbackup 在备份时通常会自动配置但你也可以手动给磁盘添加持久化位图。不过手动操作对命令参数的准确性要求较高我一般不建议普通用户手动搞先跑一次全量备份让工具自动配置即可。6.2 备份时提示 qemu-nbd 权限不足或占用的处理在备份过程中virtnbdbackup 可能会通过 qemu-nbd 把磁盘导出为一个临时块设备。如果宿主机上已经有其他进程占用了 nbd 设备或者当前用户没有 /dev/nbd* 的访问权限就会报 permissions 相关错误。排查方法先看哪些 nbd 设备已被占用ls -l /dev/nbd*cat /sys/class/block/nbd*/pidAI写代码bash12如果有 nbd 设备被 qemu-nbd 进程占用可以先用 qemu-nbd --disconnect 断开。如果确认无进程占用但设备文件还残留可以用 rmnbd 或者重启宿主机的方式清理。我自己遇到过一次诡异现象系统重启后 /dev/nbd0 到 /dev/nbd15 的权限变成 root:disk 660导致 backupuser 无法访问最终是在 /etc/udev/rules.d/ 下加了规则将 nbd 设备组修改为 kvm 才解决。6.3 备份速度异常缓慢时如何定位瓶颈备份速度慢通常可以从两个维度排查第一是源虚拟机的磁盘 I/O 负载第二是备份目标存储的写入能力。用 iostat -x 1 观察宿主机整体 I/O如果 %util 长期在 90% 以上说明存储已经成为瓶颈。这时候应该限制并发备份任务数或者把备份时间调整到业务低峰期。还有一种容易被忽略的情况备份目标存储是 NFS 网络挂载且网络链路是千兆甚至百兆。此时传输速率上限取决于网络而不是磁盘。我遇到过 300GB 的虚拟机全量备份花了将近 7 个小时最后发现 NFS 挂载协商速率只有 100Mbps。换成万兆链路同样数据量只需 40 分钟。所以在配置备份存储时务必确认网络带宽和 NFS 协议参数比如 rsize 和 wsize是合理的。6.4 备份文件恢复了但虚拟机无法启动的常见原因恢复后的虚拟机无法启动是运维最怕遇到的事。排查思路我记得很清晰首先看 virtnbdbackup 恢复时生成的 XML 中磁盘路径是否正确其次看 QEMU 进程的日志报错。最常见的问题是恢复后的 qcow2 文件所依赖的 backing file 路径不存在。因为备份文件可能会继承源盘的 backing file 信息但恢复环境中该 backing file 不存在导致启动失败。处理方式有两种要么把 backing file 一并拷贝到恢复环境要么恢复完成后将 qcow2 文件重新 base 成独立镜像qemu-img rebase -u -b /dev/null /restore/vm01/vm01.qcow2AI写代码bash1这条命令会将镜像的 backing file 信息清空使其成为一个顶层独立镜像。执行后再用 qemu-img info 确认 backing file 字段为空。如果你恢复的目标机上没有这个依赖文件就一定要做这一步。另外还要检查 XML 里引用的 UEFI 固件路径、设备总线类型等是否和原虚拟环境一致。有些自定义参数比如 CPU 型号、host-passthrough在新环境上可能不被支持启动时报错就非常正常需要根据实际 CPU 特性做调整。7. 备份链路数据安全与存储规划经验7.1 备份数据在传输和存储中的完整性保障备份数据的完整性是第一优先级。virtnbdbackup 本身就是从 QEMU 的块设备级读取数据理论上保证了磁盘写入的一致性但网络传输或目标存储的硬件故障可能引入数据损坏。我建议在备份完成后立即对结果目录生成校验值文件find /backup/vm01 -type f -exec sha256sum {} \; /backup/vm01/checksums.sha256AI写代码bash1下次备份前可以先用 sha256sum -c 校验上一次备份的完整性这能提前发现磁盘静默损坏的情况。如果存储设备本身支持快照或 ZFS/Btrfs 文件系统还可以在备份目录所在文件系统上启用定期快照给备份数据再加一层保险。7.2 存储池容量规划给备份留多少余量备份存储的容量规划我有一套自己的预算公式。假设虚拟机总量为 T单位 GB全量备份保留数量为 F增量备份保留天数为 I平均每日变化率为 D单位百分比那么备份存储总容量 C 预估为C T × F T × D × I举个例子10 台虚拟机每台 200GB全量保留 4 份平均每日变化率 5%增量保留 28 天C 2000 × 4 2000 × 0.05 × 28 8000 2800 10800 GB也就是大约 10.8TB。这是理论值实际还要加 20%-30% 的缓冲防止日志、元数据和其他临时文件占用。如果你的虚拟机上跑的是数据库等写入频繁的应用每日变化率可能要按 10% 甚至更高来算容量预留就得更宽裕。7.3 远程备份场景将 virtnbdbackup 备份集同步到异地按 3-2-1 备份原则本地保留一份备份还不够异地必须再保留一份。最简单的方式是使用 rsync 把备份目录同步到远程服务器rsync -avz --delete /backup/vm01 backup-server:/nas-backup/vm01AI写代码bash1rsync 的优势是增量传输每次同步只上传变化的文件对带宽消耗友好。不过要注意备份集本身是分层的 qcow2 文件如果用 rsync 做镜像同步要保证远程目录中的文件结构和本地完全一致特别是增量链的 .conf/.txt 文件不能丢失。恢复时你只需要把远程备份目录拷贝回本地virtnbdbackup 依然能够识别完整的备份链。如果是公网传输强烈建议通过 SSH 隧道或加密文件系统来保护数据安全。毕竟虚拟机磁盘里很可能包含业务敏感数据裸奔传输是不合适的。8. 从实际运维视角做一个总结性评价virtnbdbackup 是我目前用过的 KVM 备份工具中综合体验最适合中小型虚拟化环境的。它的全量/增量备份能力、与 libvirt 生态的原生集成、自动生成恢复配置文件的设计让我可以把备份体系搭建得很省心。相比商业备份软件动辄十几万的授权费virtnbdbackup 零成本、源码开放遇到 bug 还能自己上手修这一点对技术人员来说很友好。但我也必须诚实指出它的局限。它不是一个跨平台的集中管理平台没有 Web UI没有集群功能如果业务规模发展到几十台宿主机、几百台虚拟机你仍然需要一个更上层的编排调度系统来管理所有虚拟机的备份任务。另外它对虚拟机的内部一致性只保证到文件系统崩溃一致性级别如果应用没有做数据刷盘某些数据库场景下恢复后可能还需要 WAL 日志回放等操作。最后再分享一个小技巧。virtnbdbackup 源码里其实还有不少隐藏参数比如可以限制备份速度的 --rate-limit可以在备份时排除空闲块的功能。这些参数未必都在文档里写得清楚但用 virtnbdbackup --help 可以查看到全部选项。建议你在测试环境里多翻一翻很多参数能在关键时刻帮上大忙。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑