vcenter 虚机共享盘笔记
在 VMware vSphere 中配置多写入器共享磁盘(Multi-Writer Shared Disks)时,需注意以下关键点:
1. 磁盘控制器类型的要求
-
必须使用
VirtualLsiLogicSASController
多写入器共享磁盘要求控制器支持 SCSI-3 Persistent Reservations(PR),而VirtualLsiLogicSASController
(LSI Logic SAS)控制器是 VMware 官方唯一支持此功能的控制器类型。
VirtualLsiLogicController
(标准 LSI Logic)不支持多写入器模式,可能导致集群不稳定或数据损坏。
2.磁盘模式(diskMode)
磁盘模式定义了虚拟机磁盘与快照的交互行为,以及数据的持久性:
diskMode | 描述 | 数据持久性 | 适用场景 |
---|---|---|---|
独立 - 持久 (Independent - Persistent) | - 磁盘数据永久保存,不受快照影响。 - 快照操作不会包含此磁盘的更改。 | 数据永久保存 | 关键数据磁盘(如数据库文件),需确保数据独立于快照生命周期。 |
独立 - 非持久 (Independent - Nonpersistent) | - 磁盘数据在虚拟机重启后重置为初始状态。 - 所有写入操作在关机后丢失(类似临时磁盘)。 | 数据不保存(临时性) | 测试环境、临时操作(如软件安装测试),或需要恢复初始状态的场景。 |
依赖(默认) (Dependent) | - 磁盘数据与快照关联。 - 快照会捕获磁盘的更改,并允许回滚到快照状态。 | 数据受快照管理 | 常规用途,需要利用快照功能的环境(如开发、备份恢复)。 |
独享盘一般用VirtualDiskModePersistent(即Dependent),共享盘用VirtualDiskModeIndependent_persistent
3. 控制器SharedBus
属性的区别
在虚拟机磁盘控制器的高级参数中,SharedBus
定义了共享磁盘的访问模式:
-
noSharing
(默认)
禁用共享,仅允许单个虚拟机独占访问磁盘。 -
virtualSharing
同一 ESXi 主机内的虚拟机共享磁盘:-
多个虚拟机(位于同一主机)可同时挂载同一磁盘(如
.vmdk
文件)。 -
适用于测试或开发环境(例如同一主机内的集群节点)。
-
要求所有虚拟机均启用多写入器模式(
disk.EnableUUID=TRUE
且diskLib.dataCacheMaxSize=0
)。
-
-
physicalSharing
跨 ESXi 主机的虚拟机共享磁盘:-
允许多个虚拟机(位于不同主机)通过共享存储(如 SAN/NFS)访问同一磁盘(通常为 RDM 或 VMFS 上的
.vmdk
)。 -
用于生产环境跨主机集群(如跨节点的 Windows 故障转移集群、Oracle RAC)。
-
存储必须支持 SCSI PR 且配置正确(如启用原子测试单元(ATS))。
-
4. 配置注意事项
-
多写入器模式必须显式启用:
在虚拟机高级配置中添加scsiX:Y.sharedBus = "virtual"
或"physical"
(X=控制器编号,Y=磁盘编号)。 -
存储兼容性:
确保存储后端(如 VMFS、NFS、vSAN)支持多写入器操作,并遵循 VMware 的兼容性指南。 -
性能与稳定性:
多写入器模式可能导致 SCSI 预留冲突,影响性能。建议仅在集群软件明确要求时使用。
总结
-
控制器类型:必须为
VirtualLsiLogicSASController
。 -
virtualSharing
:同一主机内多虚拟机共享。 -
physicalSharing
:跨主机共享,需依赖共享存储和集群文件系统。
代码片段:
func AddDisksExt(devices object.VirtualDeviceList, disks []model.Disk) (object.VirtualDeviceList, []types.BaseVirtualDeviceConfigSpec, error) {
var (
deviceChange []types.BaseVirtualDeviceConfigSpec
controller *types.VirtualLsiLogicSASController = nil
newController bool = false
)
ctrls := devices.SelectByType((*types.VirtualController)(nil))
for _, ctrl := range ctrls {
if devices.Type(ctrl) == "lsilogic-sas" {
controller = ctrl.(*types.VirtualLsiLogicSASController)
break
}
}
if controller == nil {
scsi, err := devices.CreateSCSIController("lsilogic-sas")
if err != nil {
return nil, nil, err
}
newController = true
controller = scsi.(*types.VirtualLsiLogicSASController)
config := NewDeviceConfigSpec(scsi, types.VirtualDeviceConfigSpecOperationAdd)
deviceChange = append(deviceChange, config)
}
shared := false
for _, d := range disks {
file := ""
sharing := string(types.VirtualDiskSharingSharingNone)
diskMode := string(types.VirtualDiskModePersistent)
if d.Shared {
shared = true
file = d.File
sharing = string(types.VirtualDiskSharingSharingMultiWriter)
diskMode = string(types.VirtualDiskModeIndependent_persistent)
}
disk := &types.VirtualDisk{
CapacityInKB: int64(d.Size) * 1024 * 1024,
VirtualDevice: types.VirtualDevice{
Backing: &types.VirtualDiskFlatVer2BackingInfo{ // 通过ThinProvisioned来控制是否为精简模式
DiskMode: diskMode,
ThinProvisioned: types.NewBool(d.Thin),
Sharing: sharing,
},
},
}
devices.AssignController(disk, controller)
devices = append(devices, disk)
config := &types.VirtualDeviceConfigSpec{
Device: disk,
Operation: types.VirtualDeviceConfigSpecOperationAdd,
}
if len(file) == 0 { // 支持使用现有硬盘,现有硬盘不需要创建
config.FileOperation = types.VirtualDeviceConfigSpecFileOperationCreate
} else if d.Shared {
backing, _ := disk.VirtualDevice.Backing.(*types.VirtualDiskFlatVer2BackingInfo)
backing.VirtualDeviceFileBackingInfo.FileName = file
}
deviceChange = append(deviceChange, config)
}
if shared { // 共享盘需要设置控制器ShareBus为物理共享
controller.SharedBus = types.VirtualSCSISharingPhysicalSharing
if !newController {
config := NewDeviceConfigSpec(controller, types.VirtualDeviceConfigSpecOperationEdit)
deviceChange = append(deviceChange, config)
}
}
return devices, deviceChange, nil