​ SID是个很久远的东西了,最早去了解这个东西,还是第一次尝试迁移Windows NT 4的域到Windows 2000…开始是知道SID相同加域会报错,后来迁移项目做多了,也就熟悉了SID History…然后是在SCCM/OSD的时候了解Client ID…后来,我给微软发布Windows 2012做全国TTT的时候,开始深入 VDI,再后来,莫名其妙就做了Citrix和VMware的VDI……

​ 扯的有点远了……写段简历,其实是为了后面分不同角度来讨论SID在今天的环境中关联的一些问题。之所以把SID和VDI两件事情扯到一起,是因为长期以来对于VDI都会有挺多的有意思的细节,当然也因为我经常和伙伴及客户所强调的,VDI的出现,改变了 整个PC桌面管理的方式。所以接下来会讨论一点技术细节,同时也尝试讨论带来技术细节所带来的背景和方向。

为什么主流VDI的制备方式默认都不使用Sysprep了?

​ 所谓天下大势,分久必合,合久必分,从主机时代走来的PC,带来的是计算的革命。从集中到分散,坐在数据中心维护机器变成了到处帮用户装机器…因而出现了一大批“终端管理”的解决方案,例如AD/GPO,SCCM,Landesk…而到了“近现代”,由于移动互联网的兴起,终端更加的离散,更多的终端节点意味着更多数据失控的可能,所以基于远程访问的VDI突然就站到风口了。

​ 如VDI的全称Virtual Desktop Infrastructure所昭示的,VDI是基于Windows虚拟机、通过远程协议访问虚拟机中的Agent,实现“数据不落地”的桌面使用的架构。由于操作系统和应用程序以及核心的数据不再位于终端上,而是运行在数据中心,因此带来了安全边界的收缩以实现更高的安全性。正是这样的架构,决定了桌面从以前的分散管理,又变成了集中管理的模式。可以说,从根本上也解决了PCLM类终端管理无法保证覆盖全部终端,维持100%全面配置基线、安全基线的问题。

​ 因此,VDI的桌面天生就是集中化的管理模式。那么问题就来了,我们应该“安装”或完整克隆一堆的VM当成PC来管理,还是应该通过标准化的制备方式快速获得呢?

​ 从VDI本身的意义来说,一方面实现了小而完整的安全边界,另一方面就是通过虚拟化、云化实现了资源的动态调度,从而提高硬件利用率。实际上由于很多场景下考虑到用户并发上线使用数量,按照接近峰值的资源计算VDI硬件,再加上服务器硬件组件的可靠性及使用强度和寿命的因素,并不会比现在越来越便宜的PC便宜多少。如果再使用传统PC的管理模式管理,将会使得原本分散的终端管理问题集中起来并且显得更加尖锐。因此,除非不得已,以我多年的经验,是强烈不建议使用全克隆方式制备出一堆虚拟机,用以往的PC管理方式进行管理的。上VDI项目之前,就应该考虑是否对PC管理进行标准化,并对支持的PC配置标准进行合并裁撤。只有这样,才能够通过VDI项目收获最大的管理效益。至此,前面提出的问题的答案也就呼之欲出了,除非满足特定需求,我们应该尽可能通过标准化来实现对虚拟桌面的批量制备。

​ 如果您是一位曾经部署过大量桌面的工程师,或者曾经将通过ghost类似软件复制的桌面加入到AD域中,肯定会知道,如果一个桌面的SID和其他桌面相同,加域要么不成功,要么会出现一些奇奇怪怪的问题。所以,有经验的管理员,会使用微软的一个自带的工具,Sysprep来重新为计算机生成新的SID。这个工具是微软官方认可的,解决SID重复当然没有问题。可是放在VDI场景里,问题就来了——Sysprep需要完成后,系统进行一次重新启动方才全面生效。而当我们启动“复制”标准虚拟机镜像的时候,是不希望每个最终用户花费几分钟去完成大家熟悉的、Windows第一次启动时需要好几分钟的那个初始化过程的。更别说,不保留系统变更的“无状态”虚拟桌面“每一次”进入虚拟桌面都要完成这个过程……

​ 所以,除了保留系统更改的“有状态”桌面,目前已经很少在VDI部署中看到使用Sysprep进行SID重置初始化的做法了。

VDI架构真的都不生成或更新SID了吗?

​ 关于这一点,我们可以找到如下的KB文章或者材料进行确认。首先看看VMware的官方知识库文章:

​ Differences between VMware ClonePrep, QuickPrep and Microsoft Sysprep (2003797)

​ 在这篇KB中,主要针对不同的VDI桌面预备方式,介绍了不同的系统准备方式(Sysprep、QuickPrep、ClonePrep)。对于全克隆桌面,比较推荐使用Sysprep;而链接克隆桌面,可以视需要选择QuickPrep或者Sysprep;对于即时克隆,则建议使用ClonePrep为制备大量桌面进行准备。为了便于理解这几个比较陌生的词,我们对批量制备桌面最为关键的一些要求进行比较:

功能 ClonePrep QuickPrep Sysprep
修改计算机名 Yes Yes Yes
使用新实例加域 Yes Yes Yes
变更安全标识 (SID) No No Yes
生成新安全标识 SID No No Yes
重启次数 0 0 1

​ 在这个表格里,我们关心的几个功能都有直接的对比。首先大量制备桌面虚拟机时,肯定都要给每个虚拟机进行命名,并且加入到AD活动目录域中,便于集中管理和提供全局登录。表中可以看到这个要求三种预备方式都能够支持。那么那些功能对于三种预备方式是有区别的呢?主要在于是否变更SID/生成新的SID以及需要重启的次数。如表格所示,Sysprep能够”严格“按照微软要求,为每一个桌面生成新的SID,但是无法避免需要进行一次额外的重启,因此在很多时候我们会选择非Sysprep的方式来预备桌面。

​ 除了制备阶段,在这篇KB中其实还介绍了整个桌面虚拟机生命周期中不同阶段对SID的处理方式。对于 链接克隆方式,实际上可以同时支持标准的Sysprep和快速的QuickPrep:

Creation Refresh Recompose Rebalance
Sysprep New SIDs are generated for the Desktops SIDs are preserved New SIDs are generated for the Desktops New SIDs are generated for the Desktops
QuickPrep Master Image's SID are used for the Desktops SIDs are preserved SIDs are preserved unlessMaster Image is changed SIDs are preserved unless Master Image is changed

​ 随着产品发展,链接克隆将逐步退出历史舞台,在新的Horizon版本中,即时克隆已经下沉到更低版本,成为批量制备的优先选择。即时克隆与链接克隆机制上有所区别,因此其虚机的生命周期环节也稍有不同:

Creation Push Image On User Logout
ClonePrep Master Image's SID are used for the Desktops SIDs are preserved unless Master Image is changed SIDs are preserved unless Master Image is changed

​ 从以上两种不同的预备方式,都能够看到,实际批量制备桌面时,并没有生成新的SID,跟我们所熟悉 的“每一个加域的计算机都需要使用不同的的SID”的认知貌似有所不同。

​ 实际上,不仅VMware是这样处理虚拟机的,Citrix也是这样处理的。可以参考Citrix的官方支持文章:

​ MCS Provisioned VMs Share an Identical Machine SID (CTX226711)

​ 我没有找到关于PVS制备方式对SID处理的官方KB,但是以我对PVS制备方式的了解以及社区文章的描述,PVS也是不会生成和更新桌面虚拟机的SID的。而这篇描述MCS制备方式的KB对与SID问题的描述非常简单:重复的SID不是个问题……不信你去看微软的介绍……

​ 而微软自己其实从Windows Server 2008开始也提供了基于RDS架构的VDI,可是我并没有找到有关制备时SID的处理的介绍……

​ Recommended settings for VDI desktops

​ 到底VDI中使用重复SID是不是问题呢?下一篇我们用微软的文章来说明。