Inside the Volume Shadow Copy Service Exploring the Internals of VSS
卷影复制服务(Volume Shadow Copy Service,VSS)是 Windows 的一项功能,它可以在应用程序运行并对文件进行更改时创建备份。它通过创建影子副本(shadow copies)来实现这一点,这些副本是在特定时间点对卷进行的只读快照。这些快照使您可以在不锁定或中断正在运行的进程的情况下备份数据。
VSS 使用 C++ 和 COM(组件对象模型)接口的组合来管理这个过程。COM 是一种 Windows 技术,它允许不同的软件组件通过一组通用规则协同工作。它通常用于需要与操作系统多个部分协调的系统级服务。
当备份开始时,VSS 协调三个关键组件:写入器(来自被备份的应用程序)、请求者(备份软件)和提供者(存储系统)。这种协调确保了被备份的数据处于一致的状态,即使原始文件仍在使用中。
在 C++ 中,VSS 接口就像组件之间的契约。它们定义了必须提供的功能,而不强制规定如何实现。这种结构使 VSS 具有灵活性,可以支持广泛的应用程序和存储解决方案,而无需为每个解决方案硬编码特定逻辑。
VSS 组件解析
要真正理解卷影复制服务的工作原理,了解构成它的关键部分是很有用的。VSS 不仅仅是在后台运行的单一服务。它是一组协同工作以安全创建数据快照的组件。
-
VSS 服务这是协调整个影子复制过程的核心 Windows 服务。它管理备份工具(请求者)、被备份的应用程序(通过写入器)和存储系统(通过提供者)之间的通信。VSS 服务默认不会持续运行。当备份应用程序创建 IVssBackupComponents
接口的实例时,它会自动启动。
-
请求者请求者是启动备份过程的组件。它通常是通过 IVssBackupComponents
接口与 VSS 交互的备份应用程序。通过使用此接口,请求者告诉 VSS 服务创建卷的影子副本。
IVssBackupComponents
接口以开始快照过程。-
写入器写入器来自需要确保其数据在备份前处于一致状态的应用程序或服务。每个写入器都是使用 CVssWriter
类构建的,并与 VSS 服务协同工作,在影子复制操作期间准备数据。例如,SQL Server 写入器在快照之前刷新事务并确保数据库稳定。其他常见的写入器包括 Exchange Server 和 Active Directory 的写入器。
一些写入器直接内置于 VSS 服务本身。这些被称为进程内写入器,它们存在于与 VSS 服务相同的进程中。它们在 VSS 服务启动时创建,并在服务停止时清理。
由于这些写入器需要在服务完全进入"运行"状态之前初始化,因此启动它们的任何延迟都可能使 VSS 服务看起来启动缓慢。同样,如果服务在停止时似乎卡住,可能是在等待一个或多个进程内写入器正确关闭。在这些情况下,问题可能与写入器内的性能瓶颈或挂起有关。
如果您使用进程内写入器,请记住,每次 VSS 服务启动时它们都会重新启动。因此,如果运行vssadmin list writers
时没有看到特定的写入器列出,很可能是在初始化过程中出现了问题。
这通常有两个常见原因。写入器未能使用CVssWriter::Subscribe
函数订阅 VSS 事件,或者写入器在CVssWriter::OnIdentify
阶段遇到错误并未正确注册。
与进程内写入器不同,外部写入器在它们所属应用程序的服务内运行。它们不与 VSS 服务的启动或关闭绑定。相反,它们由自己的主机服务初始化和控制。这些写入器只要其父服务在运行,就会保持活动状态,只有当该服务停止或重新启动时才会停止。
如果运行vssadmin list writers
时外部写入器没有出现,可能有几个原因。应用程序的服务可能没有运行、可能启动失败或可能被完全禁用。也可能是写入器未能通过CVssWriter::Initialize
正确初始化,没有通过CVssWriter::Subscribe
订阅 VSS 事件通知,或在由CVssWriter::OnIdentify
处理的识别阶段返回了错误。
-
提供者提供者处理影子副本的实际创建。Windows 包含一个内置的软件提供者,但存储供应商也可以提供在存储级别执行相同功能的硬件提供者。
软件提供者的工作方式类似于驱动程序或文件系统过滤器。它们位于文件系统和卷管理器之间,在软件级别拦截 I/O 以创建和管理影子副本,而硬件提供者直接在存储级别处理影子副本,与系统的硬件控制器或存储适配器协同工作,以更高效地管理快照。
-
COM+ 事件系统COM+ 事件系统充当 VSS 组件之间的消息传递层。它允许写入器、提供者和请求者在影子复制操作期间相互通信。没有它,这些部分就没有标准的方式来协调它们的行动。
每个组件都有特定的工作,它们都需要协同工作,VSS 才能成功创建可用的影子副本。如果即使一个部分失败,快照可能无法正确完成或可能导致数据不一致。
事件发布者和订阅者
发布者是通过 COM+ 事件系统发送消息的任何进程。其他进程或服务可以订阅接收来自特定发布者的这些消息。每条消息都遵循定义的接口,这有助于在组件之间传递数据时保持一致性。
大部分 COM+ 事件发布和订阅工作由 VSS API 自动处理。然而,为了让写入器积极参与 VSS 备份,它需要通过调用CVssWriter::Subscribe
来订阅它应该处理的事件。
每个 VSS 事件都与特定的写入器回调函数相关联,当收到该事件时触发。如果您正在运行 VSS 跟踪,可以在消息成功传递给写入器时看到这些回调的运行。
影子副本和影子副本集
影子副本是在单一特定时间点对卷进行的快照。它捕获了该卷在那一刻的确切数据状态。每个影子副本都被分配一个持久的 GUID,允许系统稍后识别和访问它。
当同时捕获多个卷时,它们形成一个影子副本集。这确保了跨卷的数据保持一致,这对于备份多卷应用程序特别重要。与单个影子副本一样,影子副本集也有自己的 GUID。
影子副本的实现方式可能因软件或硬件供应商而异。一旦创建,系统可以看到数据的两个视图:继续正常运行的实时卷,以及通过 VSS API 提供只读视图的影子副本。
备份状态
当开始备份操作时,请求者通过调用IVssBackupComponents::SetBackupState
来定义该备份应如何行为。这告诉 VSS 正在执行什么类型的备份,并帮助确定如何选择和处理文件。
SetBackupState
来定义备份应如何行为,包括备份类型和数据处理方式。每个 VSS 写入器可能支持不同类型的备份操作,因此请求者在继续之前检查哪些备份类型可用很重要。备份类型的选择影响数据的收集方式和以后的恢复执行方式。
VSS 支持几种备份类型:
-
完全备份( VSS_BT_FULL
)完全备份复制所有文件,无论它们上次备份的时间。它更新每个文件的备份历史,并可以作为未来增量或差异备份的基线。从完全备份恢复只需要一个备份映像。 -
复制备份( VSS_BT_COPY
)这种类型类似于完全备份,因为所有文件都被复制。但是,它不更新备份历史。复制备份通常用于需要一次性备份而不影响常规备份周期的情况。它们不能用作增量或差异备份的基础。 -
增量备份( VSS_BT_INCREMENTAL
)只包括自上次完全或增量备份以来发生变化的文件。VSS API 帮助识别哪些文件满足该条件。要执行完整恢复,您需要原始完全备份和之后创建的所有增量备份。 -
差异备份( VSS_BT_DIFFERENTIAL
)此选项备份自上次完全备份以来发生变化的所有文件,忽略任何先前的差异或增量备份。要恢复,您只需要最后一次完全备份和最近的差异备份。 -
日志备份( VSS_BT_LOG
)这种类型只备份由写入器定义的日志文件,如数据库事务日志。它主要用于管理基于日志的数据恢复的应用程序,如 SQL Server。写入器使用IVssCreateWriterMetadata::AddDatabaseLogFiles
方法指定这些日志。
快照上下文
在创建影子副本之前,备份应用程序需要定义快照上下文。这是通过IVssBackupComponents::SetContext
方法完成的。设置上下文告诉 VSS 正在创建什么类型的影子副本以及它应该如何行为。
SetContext
来定义快照行为,包括备份期间使用的复制类型和执行上下文。上下文必须匹配您正在使用的快照类型的支持值之一。要微调行为,您可以使用按位 OR 将一个或多个VSS_VOLUME_SNAPSHOT_ATTRIBUTES
值与适当的VSS_SNAPSHOT_CONTEXT
标志组合。这允许备份软件根据用例请求特定的快照功能或行为。
以下是设置上下文时可以使用的VSS_SNAPSHOT_CONTEXT
枚举中的有效常量列表。
参考资料
-
卷影复制服务:卷影复制服务 — Win32 应用 | Microsoft Learn -
IVssBackupComponents 类:IVssBackupComponents (vsbackup.h) — Win32 应用 | Microsoft Learn -
IVssBackupComponents::SetContext 方法:IVssBackupComponents::SetContext (vsbackup.h) — Win32 应用 | Microsoft Learn -
VSS_SNAPSHOT_CONTEXT 枚举:VSS_SNAPSHOT_CONTEXT (vss.h) — Win32 应用 | Microsoft Learn -
影子复制上下文配置:影子复制上下文配置 — Win32 应用 | Microsoft Learn
原文始发于微信公众号(securitainment):揭秘 Windows 卷影复制服务(VSS):核心机制解析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论