备份是任何明智的IT部署所必需的,而{pve}提供了一个完全集成的解决方案,利用每个存储和每种客户系统类型的能力。这使系统管理员可以通过`mode`选项,在备份的一致性和客户系统的停机时间之间进行微调。

{pve}的备份始终是完整备份 - 包含VM/CT配置和所有数据。备份可以通过GUI或通过`vzdump`命令行工具启动。

备份存储

在备份能够执行之前,必须定义一个备份存储。请参考章节"存储文档"了解如何添加存储。它可以是Proxmox Backup Server存储,其中备份以去重后的数据块和元数据形式存储,或者是文件级存储,其中备份以普通文件形式存储。建议在专用主机上使用Proxmox Backup Server,因为其具有先进的功能。使用NFS服务器是一个不错的替代方案。在这两种情况下,您可能会想要稍后将这些备份保存到磁带驱动器,以进行异地存档。

计划备份

备份任务可以被安排在特定的日期和时间自动执行,可选节点和客户系统。更多信息请参见备份作业部分。

备份模式

有几种方法可以提供一致性(选项`mode`),这取决于访客类型。

虚拟机的备份模式:
"stop 模式"

这种模式以虚拟机操作短暂的停机为代价,提供了备份的最高一致性。它通过执行虚拟机的有序关机,然后运行一个后台QEMU进程来备份虚拟机数据。备份开始后,如果虚拟机之前在运行,那么虚拟机将进入全操作模式。通过使用实时备份功能保证了一致性。

暂停模式

这个模式是出于兼容性原因提供的,在调用`snapshot`模式前会暂停VM(虚拟机)。因为暂停VM会导致较长时间的停机,并且不一定能改善数据一致性,因此推荐使用`snapshot`模式。

快照模式

这种模式提供了最低的操作停机时间,但要付出一点不一致性的风险。它通过执行{pve}实时备份来工作,在此过程中,数据块会在虚拟机运行时被复制。如果启用了宾客代理(agent: 1)并且正在运行,它会调用`guest-fsfreeze-freeze`和`guest-fsfreeze-thaw`来提高一致性。

关于{pve}的QemuServer实时备份的技术概览可以在线找到 这里

Note
{pve}实时备份提供了对任何存储类型的快照式语义。它不要求底层存储支持快照。另请注意,由于备份是通过后台QEMU进程进行的,因此当VM磁盘被QEMU读取时,已停止的VM将暂时显示为运行状态。然而,VM本身并没有启动,只是读取了它的磁盘。
容器的备份模式:
"stop 模式"

在备份期间停止容器。这可能会导致非常长时间的停机。

暂停模式

这种模式使用rsync将容器数据复制到一个临时位置(参见选项`--tmpdir`)。然后,容器被挂起,第二次rsync复制已更改的文件。之后,容器重新启动(恢复)。这样导致的停机时间最少,但需要额外的空间来存放容器副本。

当容器位于本地文件系统上且备份的目标存储是NFS/CIFS服务器时,你应该也将`--tmpdir`设置为位于本地文件系统上,因为这将导致性能大幅提升。如果你想要在备份存储为NFS服务器的情况下,使用ACLs在挂起模式下备份本地容器,使用本地`tmpdir`也是必需的。

快照模式

这种模式利用了底层存储的快照功能。首先,容器将被暂停以确保数据一致性。然后,会创建容器卷的临时快照,并将快照内容存档在tar文件中。最后,临时快照将被删除。

Note
snapshot` 模式要求所有备份的卷必须位于支持快照的存储上。使用 backup=no 挂载点选项,可以将单个卷从备份中排除(因此也不必满足此要求)。
Note
默认情况下,除根磁盘挂载点之外的其他挂载点不包括在备份中。对于卷挂载点,您可以设置 备份 选项以将挂载点包括在备份中。设备和绑定挂载永远不会被备份,因为它们的内容是在 {pve} 存储库之外管理的。

备份文件名称

vzdump的新版本将客户类型和备份时间编码到文件名中,例如

vzdump-lxc-105-2009_10_09-11_04_43.tar

这样就可以在同一个目录中存储多个备份。您可以通过各种保留选项限制保留的备份数量,请参见下面的备份保留部分。

备份文件压缩

备份文件可以使用以下算法之一进行压缩:lzo 脚注:[Lempel-Ziv-Oberhumer 一种无损数据压缩算法 https://en.wikipedia.org/wiki/Lempel-Ziv-Oberhumer],gzip 脚注:[gzip - 基于DEFLATE算法 https://en.wikipedia.org/wiki/Gzip] 或 zstd 脚注:[Zstandard 一种无损数据压缩算法 https://en.wikipedia.org/wiki/Zstandard]。

目前,Zstandard (zstd) 是这三种算法中最快的。多线程是zstd相对于lzo和gzip的另一个优势。Lzo和gzip使用更广泛,通常会被默认安装。

您可以安装 pigz 脚注:[pigz - 并行实现的 gzip https://zlib.net/pigz/] 作为 gzip 的替代品,由于多线程的原因,能够提供更好的性能。对于 pigz 和 zstd,可以调整线程/核心的数量。请参阅下面的 配置选项

备份文件名的扩展名通常可以用来确定使用了哪种压缩算法来创建备份。

.zst

Zstandard (zstd) 压缩

.gz 或 .tgz

gzip 压缩

.lzo

lzo 压缩

如果备份文件的名称不以上述任一文件扩展名结束,则表示它没有被vzdump压缩。

备份加密

对于Proxmox Backup Server存储,你可以选择设置备份的客户端加密,请参见相应章节。

备份任务

除了手动触发备份外,您还可以设置定期任务,备份所有或选择的虚拟客户端到存储中。您可以在“Datacenter”→“Backup”下的用户界面中管理这些任务,或通过`/cluster/backup` API终点进行管理。这两种方式都会在`/etc/pve/jobs.cfg`中生成作业条目,这些条目随后由`pvescheduler`守护进程解析和执行。

一个任务可以配置给所有集群节点或特定节点,并根据给定的时间表执行。时间表的格式与`systemd`日历事件非常相似,详细信息请参见日历事件部分。UI中的’Schedule’字段可以自由编辑,它的下拉列表中包含了几个可以作为起点的示例。

您可以配置作业特定的 保留选项,以覆盖存储或节点配置中的选项,同时还可以配置一个 笔记模板,用于保存与备份一起的额外信息。

由于计划备份在主机处于离线状态或者在计划时间内pvescheduler被禁用时会错过执行,因此可以配置补救措施的行为。通过启用`Repeat missed`选项(配置中的`repeat-missed`),您可以告诉调度器应尽快运行错过的任务。

有几个用于调优备份性能的设置在用户界面中并未暴露。最值得注意的是`bwlimit`,用于限制IO带宽。可以分别通过`pigz`(替代`gzip`)和`zstd`设置控制压缩器使用的线程数量。此外,还有`ionice`,以及在`performance`设置中的`max-workers`(只影响虚拟机备份)和`pbs-entries-max`(只影响容器备份)。有关详情,请参阅配置选项

备份保留

通过`prune-backups`选项,您可以灵活指定想要保留哪些备份。以下保留选项可用:

keep-all <boolean>

保留所有备份。如果这是`true`,则不能设置其他任何选项。

保留最后 <N> 项

保留最后的`<N>`份备份。

keep-hourly <N>

保留最近`<N>`小时的备份。如果一个小时内有多个备份,只保留最新的备份。

keep-daily <N>

保留最近`<N>`天的备份。如果一天中有多个备份,则只保留最新的一个。

保留每周<N>次

保留最近`<N>`周的备份。如果一周内有多于一份备份,则只保留最新的那一份。

Note
周从周一开始,到周日结束。该软件使用`ISO周日期`系统,并且能够正确处理年末的周数问题。
保持每月 <N> 次

保留最近`<N>`个月的备份。如果一个月内有多个备份,只保留最新的那一个。

保留每年的<N>次

保留最近`<N>`年的备份。如果一年内有多个备份,则只保留最新的一个。

保留选项按照上述顺序处理。每个选项只覆盖其时间段内的备份。下一个选项不会处理已经覆盖的备份。它只会考虑更旧的备份。

指定您希望使用的保留选项,作为以逗号分隔的列表,例如:

vzdump 777 --prune-backups keep-last=3,keep-daily=13,keep-yearly=9

尽管你可以直接将`prune-backups`传递给`vzdump`,但在存储级别配置该设置通常更为合理,这可以通过Web界面完成。

Note
旧的 maxfiles 选项已被弃用,应当用 keep-last 替换,或者,在 maxfiles 被设为 0 以实现无限保留的情况下,用 keep-all 替换。

修剪模拟器

保留设置示例

备份频率和旧备份的保留时间可能取决于数据变化的频率,以及在特定工作负载中较旧状态的重要性。当备份充当公司的文件档案时,还可能有法律要求规定必须保留备份的时间长度。

在这个例子中,我们假设你进行日常备份,保留期限为10年,且备份之间存储的间隔时间会逐渐增长。

keep-last=3` - 即使只进行每日备份,管理员可能也希望在进行大型升级前后创建一个额外的备份。设置keep-last可以确保这一点。

"`keep-hourly`未设置 - 对于每日备份,这并不相关。你已经通过keep-last覆盖了额外的手动备份。"

keep-daily=13` - 与至少覆盖一天的keep-last一起使用,这确保了你至少有两周的备份。

keep-weekly=8` - 确保你至少拥有两个完整月份的每周备份。

keep-monthly=11` - 与之前的保持设置一起,这确保你至少拥有一年的月度备份。

keep-yearly=9` - 这是用于长期归档的。因为你已经用之前的选项覆盖了当前年份,所以你会将其设置为9,为剩余的年份,这样总共至少可以提供10年的覆盖。

我们建议您使用比环境最低要求更长的保留期限;如果您发现这个时间确实过长,您可以随时减少它,但一旦备份被移除,您就无法重新创建了。

备份保护

您可以将备份标记为`protected`以防止其被删除。通过{pve}的用户界面(UI)、命令行界面(CLI)或应用程序编程接口(API)尝试删除受保护的备份将失败。然而,这是由{pve}而不是文件系统强制执行的,这意味着对于任何有权访问底层备份存储的人仍然可以手动删除备份文件本身。

Note
受保护的备份将被修剪操作忽视,并且不会计入保留设置中。

对于基于文件系统的存储,通过一个名为`<backup-name>.protected`的哨兵文件实现保护。对于Proxmox Backup Server,则在服务器端处理(自Proxmox Backup Server版本2.1起提供)。

使用存储选项`max-protected-backups`来控制每个客户端在存储上允许的受保护备份的数量。使用`-1`表示不限。默认情况下,拥有`Datastore.Allocate`权限的用户为不限制,其他用户为`5`。

备份笔记

您可以通过界面中的“编辑备注”按钮或通过存储内容API来为备份添加备注。

也可以为备份作业和手动备份动态生成笔记指定一个模板。模板字符串可以包含变量,变量用两个花括号包围,当执行备份时,这些变量将被相应的值替换。

目前支持的有:

  • {{cluster}}` 集群名称(如果有的话)

  • {{guestname}}` 虚拟客人被分配的名字

  • {{node}}`节点的主机名,正在创建备份的节点

  • {{vmid}}` 是客户的数值 VMID

当通过API或CLI指定时,它需要是单行的,其中换行符和反斜杠需要分别以字面量`\n` 和 \\ 进行转义。

恢复

备份存档可以通过 {pve} 网页 GUI 或以下 CLI 工具恢复。

pct restore

容器恢复工具

qmrestore

虚拟机还原工具

有关详细信息,请参阅相应的手册页面。

带宽限制

恢复一个或多个大型备份可能需要大量资源,特别是对于从备份存储读取以及写入目标存储的存储带宽。这可能会对其他虚拟客户端产生负面影响,因为存储访问可能会变得拥塞。

为了避免这一点,你可以为备份任务设置带宽限制。{pve}为恢复和存档实现了两种限制。

  • 每次还原限额:表示从备份存档读取时的最大带宽量。

  • 每存储写入限制:表示用于向特定存储写入的最大带宽量

读取限制间接地影响了写入限制,因为我们不能写入的数量超过我们读取的数量。一个较小的每作业限制将会覆盖一个较大的每存储限制。一个较大的每作业限制只在你对受影响的存储有`Data.Allocate`权限时才会覆盖每存储限制。

您可以使用恢复CLI命令中的 --bwlimit <integer> 选项来设置特定恢复作业的带宽限制。限制的单位为KiB/s,这意味着传递 10240 将限制备份的读取速度为10 MiB/s,确保其余可能的存储带宽可供已经运行的虚拟客户端使用,从而确保备份操作不会影响它们的运行。

Note
您可以将`bwlimit`参数设置为`0`,以便为特定的恢复任务禁用所有限制。如果您需要尽可能快地恢复一个非常重要的虚拟访客,这会很有帮助。(需要对存储具有`Data.Allocate`权限)

大多数情况下,您的存储的一般可用带宽随时间保持不变,因此我们实现了为每个配置的存储设置默认带宽限制的可能性,这可以通过以下方式完成:

# pvesm set STORAGEID --bwlimit restore=KIBs

实时恢复

恢复大型备份可能需要很长时间,在此期间,客户机仍然不可用。对于存储在Proxmox Backup Server上的VM备份,可以通过使用live-restore选项来减少等待时间。

通过GUI中的复选框或`qmrestore`的`--live-restore`参数启用实时还原,会导致虚拟机在恢复开始时立即启动。数据将在后台复制,优先考虑虚拟机正在积极访问的数据块。

请注意,这有两个警告:

  • 在实时还原期间,虚拟机将以有限的磁盘读取速度运作,因为数据必须从备份服务器加载(一旦加载,数据将立即在目标存储上可用,因此,两次访问数据只在第一次时会遇到延迟)。写入速度基本不受影响。

  • 如果实时恢复因任何原因失败,虚拟机将处于未定义状态 - 也就是说,并非所有数据都可能已经从备份中复制过来,并且很可能无法保留在失败的恢复操作期间写入的任何数据。

这种操作模式对于大型虚拟机尤其有用,在这种情况下,只需要少量数据就能进行初始操作,例如,网络服务器 - 一旦操作系统和必要的服务启动后,虚拟机就可以运行,而背景任务继续复制不常用的数据。

单文件恢复

存储GUI的“备份”选项卡中的“文件还原”按钮可以用来直接在备份中包含的数据上打开文件浏览器。此功能仅适用于Proxmox备份服务器上的备份。

对于容器,文件树的第一层展示了所有包含的’pxar’归档文件,这些归档文件可以被自由打开和浏览。对于虚拟机(VMs),第一层显示包含的磁盘映像文件,可以被打开以展示驱动器上发现的支持的存储技术列表。在最基本的情况下,这将是一个名为’part’的条目,代表一个分区表,它包含了驱动器上每个分区的条目。请注意,对于虚拟机,可能不是所有数据都可以访问(不支持的客户端文件系统、存储技术等)。

文件和目录可以使用’下载’按钮下载,后者会即时被压缩成zip存档。

为了启用对可能包含不可信数据的虚拟机镜像的安全访问,会启动一个临时虚拟机(作为客户端不可见)。这并不意味着从这样的存档下载的数据本质上是安全的,但它避免了将虚拟机监控系统暴露于危险之中。虚拟机将在超时后自行停止。从用户的角度来看,整个过程是透明的。

Note
为了故障排查,每个临时的VM实例都会在`/var/log/proxmox-backup/file-restore/`生成一个日志文件。如果尝试恢复单个文件或访问备份归档中包含的文件系统失败,日志文件中可能包含额外的信息。

配置

全局配置存储在`/etc/vzdump.conf`中。该文件使用简单的冒号分隔键/值格式。每行的格式如下:

选项:值

文件中的空白行将被忽略,以`#`字符开头的行被视为注释也同样被忽略。此文件中的值被用作默认值,并且可以在命令行上被覆盖。

我们目前支持以下选项:

bwlimit`:<整数> (0 - N)默认值= 0

限制 I/O 带宽(以 KiB/s 计)。

compress`:<0 | 1 | gzip | lzo | zstd>(默认值=0

压缩转储文件。

dumpdir`: `<string>

将结果文件存储到指定目录。

exclude-path`: `<array>

排除特定的文件/目录(shell 通配符)。以 / 开头的路径锚定于容器的根目录,其他路径相对于每个子目录匹配。

ionice`: <integer> (0 - 8) (default = 7)

在使用BFQ调度器时设置IO优先级。对于虚拟机的快照和挂起模式备份,这只影响压缩器。值为8意味着使用空闲优先级,否则使用指定值的最佳努力优先级。

lockwait`: <integer> (0 - N) (default = 180)

等待全局锁的最长时间(分钟)。

mailnotification`:<always | failure>(默认值=always

已弃用:请改用通知目标/匹配器。指定何时发送通知邮件。

mailto`: `<string>

不推荐使用:请改用通知目标/匹配器。应接收电子邮件通知的电子邮件地址或用户的逗号分隔列表。

maxfiles`: `<integer> (1 - N)

已弃用:请改用 prune-backups。每个客户系统的备份文件的最大数量。

mode`: <snapshot | stop | suspend> (default = snapshot)

备份模式。

notes-template`: `<string>

用于生成备份笔记的模板字符串。它可以包含将被替换为相应值的变量。目前支持的变量有 \{{cluster}\}, \{{guestname}\}, \{{node}\}, 和 \{{vmid}\},但将来可能会增加更多。需要是单行,换行符和反斜杠需分别使用 \n\\ 来转义。

Note
需要选项: `storage
notification-mode`: <auto | legacy-sendmail | notification-system> (default = auto)

确定要使用哪个通知系统。如果设置为’legacy-sendmail',vzdump将考虑mailto/mailnotification参数,并通过’sendmail’命令将电子邮件发送到指定的地址。如果设置为’notification-system',将通过PVE的通知系统发送通知,并且将忽略mailto和mailnotification。如果设置为’auto'(默认设置),如果设置了mailto,将发送电子邮件,如果没有设置,将使用通知系统。

notification-policy`: <always | failure | never> (default = always)

过时的:不要使用

notification-target`: `<string>

过时的:不要使用

performance`: `[max-workers=<integer>] [,pbs-entries-max=<integer>]

其他性能相关的设置。

max-workers`=<integer> (1 - 256) (default = 16)

适用于虚拟机。允许同时有这么多的IO工作者。

pbs-entries-max`=<integer> (1 - N) (default = 1048576)

适用于发送到 PBS 的容器备份。限制在给定时间内内存中允许的条目数量,以避免意外的 OOM(内存不足)情况。增加此值以支持备份文件数量较多的容器。

pigz`: <integer> (default = 0)

当N>0时,使用pigz代替gzip。N=1时使用一半的核心数,N>1时使用N作为线程数。

pool`: `<string>

备份指定池中包含的所有已知的客户系统。

protected`: `<boolean>

如果为真,则将备份标记为受保护的。

Note
需要选项: `storage
prune-backups`: [keep-all=<1|0>] [,keep-daily=<N>] [,keep-hourly=<N>] [,keep-last=<N>] [,keep-monthly=<N>] [,keep-weekly=<N>] [,keep-yearly=<N>] (default = keep-all=1)

使用这些保留选项而不是存储配置中的那些。

keep-all`=`<boolean>

保留所有备份。当为真时与其他选项冲突。

keep-daily`=`<N>

保留最近<N>天内的备份。如果一天中有多个备份,则只保留最新的一个。

keep-hourly`=`<N>

保留过去<N>个小时的备份。如果一个小时内有多个备份,只保留最新的一个。

keep-last`=`<N>

保留最后的<N>个备份。

保持每月=\<N\>

为最近的<N>个不同月份保留备份。如果一个月内有多个备份,则只保留最新的一个。

keep-weekly`=`<N>

为最近的<N>周保留备份。如果一周内有多个备份,只保留最新的一个。

keep-yearly`=`<N>

保留最近<N>年的备份。如果一年内有多个备份,则只保留最新的一个。

remove`:<boolean>(默认值 = 1

根据’prune-backups’策略删除较旧的备份。

script`: `<string>

使用指定的钩子脚本。

stdexcludes`: <boolean> (default = 1)

排除临时文件和日志。

stopwait`: <integer> (0 - N) (default = 10)

等待客户系统停止的最大时间(分钟)。

storage`: `<string>

将结果文件存储到此存储中。

tmpdir`: `<string>

将临时文件存储到指定目录。

zstd`: <integer> (default = 1)

Zstd线程。N=0时使用可用核心的一半,如果N设置为大于0的值,则N用作线程数。

示例 vzdump.conf 配置
tmpdir: /mnt/fast_local_disk
storage: my_backup_storage
mode: snapshot
bwlimit: 10000

钩子脚本

您可以使用选项 --script 指定一个钩子脚本。在备份过程的不同阶段,将根据相应设置的参数调用此脚本。您可以在文档目录(vzdump-hook-script.pl)中找到一个示例。

文件排除

Note
这个选项仅适用于容器备份。

vzdump` 默认跳过以下文件(使用选项 --stdexcludes 0 可以禁用此行为)

/tmp/?* /var/tmp/?* /var/run/?*pid

您也可以手动指定(额外的)排除路径,例如:

# vzdump 777 --exclude-path /tmp/ --exclude-path '/var/foo*'

排除目录 /tmp/ 以及任何名为 /var/foo/var/foobar 等的文件或目录。

不以 / 开头的路径不会锚定到容器的根目录,而是会相对于任何子目录进行匹配。例如:

vzdump 777 --exclude-path bar

排除任何名为`/bar`、/var/bar/var/foo/bar`等的文件或目录,但不包括/bar2`。

配置文件也存储在备份存档内(位于`./etc/vzdump/`),并将被正确恢复。

示例

简单地导出访客777 - 不创建快照,只需将访客的私有区域和配置文件归档到默认的导出目录中(通常是`/var/lib/vz/dump/`)。

vzdump 777

使用rsync和暂停/恢复来创建快照(最小化停机时间)。

vzdump 777 --mode suspend

备份所有客户系统并发送通知邮件给root和admin。因为`mailto`被设置和`notification-mode`默认设置为`auto`,所以通知邮件是通过系统的`sendmail`命令发送的,而不是通过通知系统发送的。

vzdump --all --mode suspend --mailto root --mailto admin

使用快照模式(无停机时间)和非默认导出目录。

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

将QemuServer虚拟机恢复到虚拟机601

qmrestore /mnt/backup/vzdump-qemu-888.vma 601

使用管道,将一个现有的容器101克隆到一个新的容器300,并且新容器具有4GB的根文件系统。

vzdump 101 --stdout | pct restore --rootfs 4 300 -