锁定文件复制——如何同步被占用的文件
什么是「锁定文件」问题
在 Windows 上,当一个文件被其他程序打开时(如 Outlook 的 .pst 文件、SQL Server 的数据库文件、Word 正在编辑的文档),操作系统会给文件加上「排他锁」。其他程序此时尝试读取或复制这个文件,会收到「Access Denied」或「文件正在使用」的错误。
普通文件复制工具在遇到锁定文件时会跳过并报错。这导致一个严重的问题——最需要备份的数据恰恰是那些正在被使用的文件,如果复制不了,备份就白做了。
GoodSync 的解决方案:卷影复制服务(VSS)
GoodSync 在 Windows 上利用 Microsoft 的卷影复制服务(Volume Shadow Copy Service, VSS)来解决这个问题。VSS 的原理是:
- 请求操作系统为目标卷创建一个时间点快照(Shadow Copy)
- 快照创建后,文件系统状态被冻结在创建那一刻
- 所有文件(包括当时被锁定的)在快照中都表现为「正常可读取」
- GoodSync 从快照中读取文件内容,复制到目标位置
- 复制完成后,删除快照
这个过程对用户完全透明——你在 GoodSync 界面上看不到快照的创建和销毁,只看到同步正常进行。
VSS 的前提条件
VSS 技术在以下条件下可用:
- 操作系统:Windows 7+(桌面版)、Windows Server 2008+(服务器版)
- 文件系统:NTFS 和 ReFS 都支持;FAT32 不支持 VSS
- 快照存储:卷上需要有至少几十 MB 的空闲空间用于存储快照元数据
- VSS 服务状态:Windows 的「Volume Shadow Copy」服务必须处于启动状态(默认是手动启动,GoodSync 会自动按需启动)
在 GoodSync 中的配置
VSS 相关选项位于作业 Options → Advanced 标签:
| 选项 | 说明 | 建议 |
|---|---|---|
| Copy Locked Files | 开启锁定文件复制 | 开启(默认) |
| Do Not Copy Locked Files | 跳过锁定文件 | 关闭,除非遇到兼容性问题 |
| Safe Copy | 安全复制模式 | 开启(先复制到临时文件,确认完整后再替换目标) |
Safe Copy 的作用:即使复制过程中断,目标端也不会出现损坏的不完整文件——GoodSync 先把新文件复制到 .tmp 临时文件中,确认 MD5 校验通过后再把目标文件重命名为临时文件,然后把临时文件重命名为正式文件名。如果断电或崩溃,目标端要么是旧文件(安全),要么是新文件(校验过),不会是半拉子文件。
Linux 和 macOS 上的对应方案
VSS 是 Windows 独有的技术。在其他平台上,GoodSync 使用平台各自的替代方案:
Linux
- LVM Snapshot:如果数据卷用 LVM 管理,GoodSync 可以触发 LVM 快照
- file system snapshot:btrfs、ZFS 等支持快照的文件系统可以被 GoodSync 利用
- fallback copy:没有快照支持时,GoodSync 直接读取文件(Linux 上即使文件被打开,通常也可以从另一个进程读取,只要不是以排他锁方式打开)
macOS
- Time Machine snapshot:macOS APFS 文件系统内置的快照机制
- 直接读取:macOS 上的文件锁语义与 Linux 类似,大多数被打开的文件可以被读取
常见的 VSS 问题
快照创建失败
如果 GoodSync 报「VSS snapshot creation failed」:
- 检查 Volume Shadow Copy 服务是否运行:
services.msc→ 找到「Volume Shadow Copy」 → 启动 - 检查目标卷是否有足够空间(至少 100MB)
- 检查磁盘是否有错误:
chkdsk X: /f(X: 是目标盘符) - 某些磁盘加密软件(如 BitLocker)可能干扰 VSS,确保加密状态正常
快照过期导致复制中断
VSS 快照有默认的存活时间(Windows 通常是 24 小时)。如果同步大量文件耗时过长,快照可能过期。GoodSync 处理这种情况的方式是——快照过期时重新创建并从断点继续。
Safe Copy 与云存储的兼容性
Safe Copy 需要目标端支持「先写临时文件再重命名」的操作序列。某些云存储(特别是 S3)的对象存储模型不支持重命名。GoodSync 会根据目标端点类型自动调整 Safe Copy 行为——S3 端点会直接写入新对象并覆盖旧对象。