启用或禁用更改块跟踪 (Changed Block Tracking, CBT) 的两种方式
由于VMware提供了方便的数据块修改追踪(Changed Block Tracking,CBT)技术,为虚拟机增量备份提供了基础,除第一次备份必须完整备份与传输整个VM数据外,后续备份都只需通过查询 CBT 记录,获取哪些异动过区块,然后只备份这些异动区块即可,既节省了扫描磁盘、判定异动区块的时间,所需传输的数据量也大幅缩小。
默认情况下 CBT 这个功能是禁用的,因为它会引起一个很小但是可测的性能降低。通常需要在第一个快照之前启用CBT,通过请求虚拟机配置,就可以判断修改块跟踪是否启用。
CBT 这个功能不是一开始 VMware 公司就有提供的,所以要使用 CBT 功能需满足如下先决条件:
- ESX/ESXi 主机必须是 4.0 及以上版本;
- VM 硬件版本必须是 7 或更新;
支持所有的虚拟磁盘类型(Thick、thin 及 RDM 虚拟兼容模式),除了 RDM 物理兼容模式;
RDM (Raw Device Mapping)是VMware 服务器虚拟化环境中,用以允许一个虚拟机直接访问SAN(Storage Area Networking)中的一个存储LUN(Logical Unit Number)。
RDM也可以叫做裸设备映射(Raw Device Mapping ),虚拟机直接使用存储中的LUN,而不经过虚拟化层。虚拟机上没有可用的快照;
- 虚拟机必须处于断电状态。
如果备份时,没开启 CBT,会出现下面的错误:
■ 更改块跟踪配置不正确
■ 磁盘“Hard disk #”的更改块跟踪配置不正确
■ 一个或多个虚拟机磁盘的更改块跟踪配置不正确
启用块修改跟踪 (CBT)
在虚拟机上启用块修改跟踪 (CBT) ,有两种方式,第一种是通过 vSphere client 客户端进行配置;第二种是通过程序设置。
通过 vSphere client 客户端进行配置 CBT 步骤
要在虚拟机上启用 CBT,操作步骤如下:
- 关闭虚拟机电源;
- 右键单击虚拟机,然后单击编辑设置;
- 单击选项选项卡;
单击“高级”区域下方的常规,然后单击配置参数
此时将打开“配置参数”对话框
单击添加行,添加 ctkEnabled 参数,然后将其值设置为 true;
单击添加行,添加 scsi0:0.ctkEnabled,然后将其值设置为 true;
注意:scsi0:0.ctkEnabled 中的 scsi0:0 指示 SCSI 设备已分配给添加到虚拟机的硬盘。向每个添加到虚拟机的硬盘提供了一个 SCSI 设备,该设备如 scsi0:0、scsi0:1 或 scsi 1:1 所示。已分别在每个磁盘上启用(或禁用)CBT。
打开虚拟机电源;
- 在虚拟机的主目录中,验证启用 CBT 的每个磁盘还具有vmname-ctk.vmdk文件。
要禁用 CBT,首先也要关闭虚拟机,同样打开配置窗口,将所需禁用的 SCSI 磁盘的 ctkEnabled 参数设置为 false 即可。
通过程序设置启动 CBT
使用 PropertyCollector 从 VirutalMachine 托管对象中获取这个属性域,如果这个域包含 changeTrackingSupported 标志,就可以进行相关操作。
如果支持的话,可以使用一个简单的 VirtualMachineConfigSpec 来启用修改块跟踪,并调用 ReconfigVM_Task 方法来重新配置虚拟机:
判断虚拟机修改跟踪的状态(先获取虚拟机的配置信息 VirtualMachineConfigInfo,根据其方法 isChangeTrackingEnabled() 来判断),如果是false,激活修改块跟踪,并调用ReconfigVM_Task方法来重新配置虚拟机,程序如下:
VirtualMachineConfigSpec configSpec = new VirtualMachineConfigSpec();
// 获取虚拟机信息, VirtualMachine 为自定义的一个实体对象,获取虚拟机信息的方法也为自定义方法
VirtualMachine vm = getVirtualMachineInfoByVmMor(targetVmMoRef);
if(!vm.getConfig().isChangeTrackingEnabled()){configSpec.setChangeTrackingEnabled(new Boolean(true));
}ManagedObjectReference taskMoRef = serviceConnection.getService().ReconfigVM_Task(targetVmMoRef,configSpec);public void setChangeTrackingEnabled(Boolean value) {this.changeTrackingEnabled = value;
}
参考:
Enabling or disabling Changed Block Tracking (CBT) on virtual machines (1031873)
Enable Change Block Tracking (CBT) for VMware Virtual Machine