安装 Windows 功能角色
1、选择安装源
在 Windows 8.1 系统上不存在重复数据删除功能,需要从对应的服务器版本,即 Windows Server 2012 R2 上提取相关文件。
2、提取文件
安装源中的目录和文件很多,我们只需要要三个目录:
\WINDOWS\servicing\Packages,包文件;
\WINDOWS\winsxs:程序集文件。除了程序集子目录之外,其他的子目录不需要;
\WINDOWS\winsxs\Manifests:清单文件。
把这三个目录中的子目录和文件到复制一个目录下。假设全部文件、目录都复制到 s:\4\Packages 中。
3、增量压缩
增量压缩:Delta Compression
为什么要说到增量压缩呢?是因为复制到 s:\4\Packages 中的文件许多都是经过增量压缩的,如果用记事本打开,能看懂的只有开头的 DCN PA30 之类的内容,其余部分都是些乱码。
再说说文件标识。
DC,应该就是增量压缩的缩写,N 表示某种类型的压缩;除 DCN 外,还有 DCD、DCM。PA30 应该是增量压缩的版本,表示这种压缩是使用 msdelta.dll 作为引擎的,解压缩也使用 msdelta.dll ;还有一种版本 PA19,使用 mspatchc.dll 进行压缩,使用 mspatcha.dll 进行解压缩(解压缩又称为应用,apply)。
4、安装前的准备
禁用 Hash 测试。
因为默认的程序集文件应该是未压缩的,但是,我们从安装光盘中提取的文件是经过压缩的,在安装包时,系统要对程序集文件进行 Hash 测试,肯定无法通过测试。为此,必须关闭 Hash 测试的功能。需要在注册表中添加一个属性 DisableFileHashVerification,类型为 DWORD,值为 1,位置在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Configuration。
5、安装包
安装包使用的命令:Dism
Dism /online /Add-Package /PackagePath:包文件的路径
重复数据删除是文件服务角色中的一项功能,它依赖文件服务的某些基础功能,即 Microsoft-Windows-FileServer-Package 包。
Dism /online /Add-Package /PackagePath:Microsoft-Windows-FileServer-Package~31bf3856ad364e35~amd64~~6.3.9600.16384.mum
Dism /online /Add-Package /PackagePath:Microsoft-Windows-FileServer-Package~31bf3856ad364e35~amd64~zh-CN~6.3.9600.16384.mum
Dism /online /Add-Package /PackagePath:Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~~6.3.9600.16384.mum
Dism /online /Add-Package /PackagePath:Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~zh-CN~6.3.9600.16384.mum
6、启用功能前的准备
这一步非常关键,因为几乎所有的出错都与这里的设置有关。如果提取的文件是未经过压缩的原始文件,这一步可以跳过。
前面说过,重复数据删除功能涉及到十个程序集,其中有三个系统已经安装。
在包的安装过程中,注册表中的内容是应该自动写上的,但不一定。如果功能无法启用,可以参照附表对相关注册表值进行设置。注册表的位置为 HKLM\COMPONENTS\DerivedData\Components,文件为 \Windows\System32\Config\Components。
需要注意的是,通常情况下,HKLM\COMPONENTS 并不加载,需要加载以后,才能进行后续的操作。
7、启用功能
Enable-WindowsOptionalFeature -Online -FeatureName File-Services
Enable-WindowsOptionalFeature -Online -FeatureName CoreFileServer
Enable-WindowsOptionalFeature -Online -FeatureName Dedup-Core
8、验证
如果安装成功完成,下面的命令就可以运行了。
查看有关有关重复数据删除的命令:get-command dedup
启用对磁盘的重复数据删除:Enable-DedupVolume T:
扫描磁盘,计算重复数据删除后的状态:Update-DedupStatus T:
返回重复数据删除后的状态:Get-DedupStatus
我们想要介绍的是如何安装在当前 Windows 版本中没有的功能。
我们知道,同一个版本号(version)的Windows,有不同的版本类型(edition),比如,标准版、专业版、企业版,以及对应的服务器版本类型(到底有多少类型的版本,可以看看\Windows\servicing\editions 下的文件)。如果我们安装了企业版以后,发现还想使用专业版的某些功能,如媒体中心,是重装系统吗?看过本文以后,你可能会多一个选择。本文以Windows 8.1为例,介绍如何安装Windows Server 2012 R2 的重复数据删除功能。
一、系统的组成
Windows 是操作系统,那么,这个完整的体系又是由什么组成的呢?从安装功能角色的角度来看,大体可以分成这样几级:系统、角色、功能、包、程序集和清单。即:
系统是由多个角色组成;
一个角色由一个或多个功能组成;
一个功能由一个或多个包组成,一个包也可能包含多个功能;
一个包由一个或多个程序集和清单组成,一个程序集对应一个清单(这样说,不严谨,但不影响结果)。
这一思想应该是从 Windows Vista开始就有了,只是在不同的版本之间,概念上会有所变化,具体操作的命令也不尽相同。
系统、角色、功能是逻辑上的概念,且功能与角色并无本质区别,真正物理存在的是包、程序集和清单。
包文件,\WINDOWS\servicing\Packages
程序集文件,\WINDOWS\winsxs
清单文件,\WINDOWS\winsxs\Manifests
下面就分别作一点简单介绍。
1、系统是由多个角色组成
这一点不言而喻的。
2、一个角色由一个或多个功能组成
对应于服务器版本上的选择角色界面。
比如 Hyper-V 角色,由这样一些功能组成:
Get-WindowsOptionalFeature-Online -FeatureName *hyper-v* | select FeatureName
Microsoft-Hyper-V
Microsoft-Hyper-V-Offline
Microsoft-Hyper-V-Online
RSAT-Hyper-V-Tools-Feature
Microsoft-Hyper-V-Management-Clients
Microsoft-Hyper-V-Management-PowerShell
前面的命令表明,角色这一层纯粹是逻辑上的;且在非服务器版本的系统上,就没有选择角色的界面。
功能之间有依赖关系。通过下面的命令,可以知道,Dedup-Core 功能要依赖 File-Services 功能。
Get-WindowsOptionalFeature-Online -FeatureName Dedup-Core
Feature Name : Dedup-Core
Display Name : 数据删除重复
Description : 通过应用区块级别删除重复和压缩来减少数据所需的物理存储量。
Restart Required : Possible
State : Enabled
Custom Properties :ServerComponent\Description : 重复数据删除为卷上的相同数据存储单一副本,从而节省了磁盘空间。
ServerComponent\DisplayName:数据删除重复
ServerComponent\Id : 436
ServerComponent\Parent: File-Services
ServerComponent\Type :RoleService
ServerComponent\UniqueName :FS-Data-Deduplication
ServerComponent\NonAncestorDependencies\ServerComponent\UniqueName :FS-FileServer
ServerComponent\Deploys\Update\Name : Dedup-Core
ServerComponent\SystemServices\SystemService\DefaultMonitoring: false
ServerComponent\SystemServices\SystemService\Name : ddpsvc
3、一个功能由一个或多个包组成,一个包中也可能包含多个功能
重复数据删除(Dedup-Core)是文件和存储服务角色中的一个功能,是由两个功能包和对应的语言包组成:
Microsoft-Windows-Dedup-ChunkLibrary-Package~31bf3856ad364e35~amd64~~6.3.9600.16384.mum
Microsoft-Windows-Dedup-ChunkLibrary-Package~31bf3856ad364e35~amd64~zh-CN~6.3.9600.16384.mum
Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~~6.3.9600.16384.mum
Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~zh-CN~6.3.9600.16384.mum
文件名太长,是看这种文章(或日志文件)的困难之处,一会儿眼就花了。
每一个包文件,还有一个对应的证书文件,扩展名为 .cat。因为包文件是纯文本文件,有了证书文件,可以保证在图形界面下,包文件是不能修改的;在非图形界面(即WinRE环境)下是可以修改的。
为什么选择用这个功能进行演示呢?大体有这样几个原因,一是实用,启用重复数据删除以后,可以节省大量的磁盘空间。有了虚拟机以后,我们会发现,再大的磁盘也不够用,启用了重复数据删除功能以后,节省磁盘空间的效果非常明显;二是这个功能具有代表性,三是相对简单。
现在就说说它的代表性,重复数据删除功能有两个包:
这两个包是两种类型,第一个包Microsoft-Windows-Dedup-ChunkLibrary-Package,是系统自动安装的,在客户机和服务器版本上都有;第二个包Microsoft-Windows-Dedup-Package,只在服务器版本上才有。另外,从 Windows8.1 开始,增加了组件的增量压缩功能。
4、一个包由一个或多个程序集和清单组成,一个程序集对应一个清单
程序集也称为组件。
Microsoft-Windows-Dedup-ChunkLibrary-Package包对应了三个程序集:
amd64_microsoft-windows-dedup-chunklibrary_31bf3856ad364e35_6.3.9600.16384_none_b739226fcac7b86b
amd64_microsoft-windows-dedup-common_31bf3856ad364e35_6.3.9600.16384_none_24924b7b049f1064
amd64_microsoft-windows-dedup-common.resources_31bf3856ad364e35_6.3.9600.16384_zh-cn_735de6f4f3c9bf01
Microsoft-Windows-Dedup-Package包对应了七个程序集:
amd64_microsoft-windows-dedup-service_31bf3856ad364e35_6.3.9600.16384_none_bfb8b8d13d6b64ec
amd64_microsoft-windows-dedup-pipeline_31bf3856ad364e35_6.3.9600.16384_none_4a1a2e1b94c17293
amd64_microsoft-windows-dedup-backup_31bf3856ad364e35_6.3.9600.16384_none_082618006d52d13d
amd64_microsoft-windows-dedup-vsswriter_31bf3856ad364e35_6.3.9600.16384_none_6a34e1622afa6abc
amd64_microsoft-windows-d..p-service.resources_31bf3856ad364e35_6.3.9600.16384_zh-cn_ef122ebc772ca755
amd64_microsoft-windows-dedup-filter_31bf3856ad364e35_6.3.9600.16384_none_f8cff29f2baf02c3
amd64_microsoft-windows-fsdm-hostprocess_31bf3856ad364e35_6.3.9600.16384_none_1dcf65c39dce3a7c
每个程序集对应于磁盘上的一个目录,在目录下有若干文件,还可能有子目录,包安装时,会从安装源复制到\Windows\Winsxs目录下;每个程序集还有一个清单文件,名字与目录名相同,扩展名为manifest,复制到\Windows\Winsxs\Manifests目录下。启用功能时,组件对应的文件会复制到系统目录,必要时,还会创建服务等。从 Vista 开始,管理系统是以组件为单位了,不再基于 INF 了。
两个包对应的分发清单文件:
amd64_microsoft-windows-d..klibrary-deployment_31bf3856ad364e35_6.3.9600.16384_none_586b9e5d057f82e3.manifest
amd64_microsoft-windows-dedup-deployment_31bf3856ad364e35_6.3.9600.16384_none_417674c644d0189e.manifest
二、提取文件与增量压缩
1、选择安装源
在 Windows 8.1 系统上不存在重复数据删除功能,需要从对应的服务器版本,即 Windows Server 2012 R2 上提取相关文件。
客户机与服务器对应表
客户机 |
服务器 |
主版本号 |
Windows 8.1 |
Windows 2012 R2 |
6.3 |
Windows 8 |
Windows 2012 |
6.2 |
Windows 7 |
Windows 2008 R2 |
6.1 |
Windows Vista |
Windows 2008 |
6.0 |
在 Windows Server 2012 R2光盘上的 Soures 目录下找到 install.wim 文件,用新版本的压缩软件打开,会看到有1、2、3、4这样的目录,分别对应标准版核心、标准版、数据中心版核心、数据中心版。其中数据中心版的功能最全,但对于我们演示的重复数据删除功能来说,这四个版本没有区别。没有正式版本的光盘也不要紧,完全可以从微软站点上下载试用版本;另外,不要用新版本的光盘,最好用最原始版本,因为新版本上会有更多的文件被压缩,给操作带来不必要的麻烦。
如果从正常运行的系统中提取文件,应该使用启用了相关功能,且未打过补丁的系统。
2、提取文件
安装源中的目录和文件很多,我们只需要要三个目录:
\WINDOWS\servicing\Packages,包文件;
\WINDOWS\winsxs:程序集文件。除了程序集子目录之外,其他的子目录不需要;
\WINDOWS\winsxs\Manifests:清单文件。
把这三个目录中的子目录和文件到复制一个目录下。由于文件和目录有几万个,复制的过程很漫长而无聊。以前在DOS年代,有一个命令 append可以把目录拼接在一起,相当于在一个目录中操作,现在反而没有了;另外,安装包的命令 dism只能指定一个安装源,因此,再无聊也得复制了。
假设全部文件、目录都复制到 s:\4\Packages中。
3、增量压缩
增量压缩:Delta Compression
远程差分压缩:Remote Differential Compression
单实例存储:Single Instance Store
重复数据删除:Data Deduplication
尽管这些概念都提到了压缩,但是,其核心思想不在于压缩,而在于单实例存储,即,相同的部分只保存一份,只是有的在文件级别,有的在磁盘级别。
为什么要说到增量压缩呢?是因为复制到s:\4\Packages 中的文件许多都是经过增量压缩的,如果用记事本打开,能看懂的只有开头的 DCN PA30 之类的内容,其余部分都是些乱码。
增量压缩,是根据两个文件的差进行的,以其中的一个版本(通常为最新版本)为基准,暂时不需要的版本(通常为老版本)就保存了相对基准文件的差。
同一个文件不版本之间的差别通常不大,有的甚至完全相同,因此,增量压缩可以显著节省磁盘空间。
有两种情况下会发生增量压缩:一是功能尚未启用,暂时用不到的文件就以压缩的形式保存(但不是立即进行压缩),一旦启用某个功能,与之相关的文件会自动解压;二是安装了某个程序集的新版本补丁,新版本文件以未压缩的形式保存,被取代的版本以增量压缩的形式保存,如果卸载了新版本,老版本的文件会自动解压缩。
执行任务计划,会强制进行压缩。
schtasks.exe /Run /TN"\Microsoft\Windows\Servicing\StartComponentCleanup"
再说说文件标识。
DC,应该就是增量压缩的缩写,N表示某种类型的压缩;除 DCN外,还有 DCD、DCM。PA30应该是增量压缩的版本,表示这种压缩是使用 msdelta.dll作为引擎的,解压缩也使用 msdelta.dll;还有一种版本 PA19,使用mspatchc.dll进行压缩,使用 mspatcha.dll进行解压缩(解压缩又称为应用,apply)。
压缩类型 |
文件标识 |
注册表值 |
有基准的压缩 |
DCD |
CF:10;f!XXX:3 有 CTS 和 DV |
无基准的压缩 |
DCN |
CF:200 f!XXX:21 |
清单文件的压缩 |
DCM |
CF:c |
未压缩 |
CF:0;f!XXX:1 |
由于这方面的资料太少,上面内容猜测成分较多,不足全信。想详细了解文件标识的内容,可参考 Windows SDK中的 msdelta.h 文件。
三、安装包
1、安装前的准备
禁用 Hash 测试。
因为默认的程序集文件应该是未压缩的,但是,我们从安装光盘中提取的文件是经过压缩的,在安装包时,系统要对程序集文件进行Hash测试,肯定无法通过测试。为此,必须关闭 Hash 测试的功能。需要在注册表中添加一个属性 DisableFileHashVerification,类型为 DWORD,值为 1,位置在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Configuration。
2、安装包
安装包使用的命令:Dism
Dism /online /Add-Package/PackagePath:包文件的路径
前面说过,重复数据删除是文件服务角色中的一项功能,它还依赖文件服务的某些基础功能,即 Microsoft-Windows-FileServer-Package包。
Dism /online /Add-Package /PackagePath:Microsoft-Windows-FileServer-Package~31bf3856ad364e35~amd64~~6.3.9600.16384.mum
Dism /online /Add-Package /PackagePath:Microsoft-Windows-FileServer-Package~31bf3856ad364e35~amd64~zh-CN~6.3.9600.16384.mum
Dism /online /Add-Package /PackagePath:Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~~6.3.9600.16384.mum
Dism /online /Add-Package /PackagePath:Microsoft-Windows-Dedup-Package~31bf3856ad364e35~amd64~zh-CN~6.3.9600.16384.mum
3、启用功能前的准备
这一步非常关键,因为几乎所有的出错都与这里的设置有关。如果提取的文件是未经过压缩的原始文件,这一步可以跳过。
前面说过,重复数据删除功能涉及到十个程序集,其中有三个系统已经安装。
在包的安装过程中,注册表中的内容是应该自动写上的,但是,安装了若干次,只有一两次是正确的,大部分都是不成功的,具体原因不详。如果注册表中的设置不正确,就不能正常解压缩,功能就无法启用。
如果功能无法启用,可以参照附表对相关注册表值进行设置。注册表的位置为HKLM\COMPONENTS\DerivedData\Components,文件为\Windows\System32\Config\Components。
需要注意的是,通常情况下,HKLM\COMPONENTS并不加载,需要加载以后,才能进行后续的操作。
4、启用功能
Enable-WindowsOptionalFeature-Online -FeatureName File-Services
Enable-WindowsOptionalFeature-Online -FeatureName CoreFileServer
Enable-WindowsOptionalFeature-Online -FeatureName Dedup-Core
前面两条命令说明,一个包(FileServer)包含了两个功能,后面一条命令说明,两个包组成一个功能。
5、验证
如果安装成功完成,下面的命令就可以运行了。
查看有关有关重复数据删除的命令:get-command *dedup*
启用对磁盘的重复数据删除:Enable-DedupVolumeT:
扫描磁盘,计算重复数据删除后的状态:Update-DedupStatusT:
返回重复数据删除后的状态:Get-DedupStatus
这可能是系统最慢的命令了,执行以后不会立即看到效果,看到效果一般要等到两天之后。
四、排错
常见的错误有以下几个:
1、无法读取配置注册表项
enable-WindowsOptionalFeature: 无法读取配置注册表项。
这是由于没有正确安装并启用 FileServer,参见前面的内容。
2、组件的文件跟组件清单中的验证信息不匹配
这是由于没有禁用Hash 测试,参见前面的内容。
3、0x800f0922
Enable-WindowsOptionalFeature: Enable-WindowsOptionalFeature失败。错误代码 = 0x800f0922
这是由于在启用重复数据删除功能时,没有正确设置注册表中相关增量压缩的值,参见前面的内容。
但需要注意的是,如果已经启用过重复数据删除功能,虽然没有成功,那么,有可能部分文件已经成功解压缩了。这时,已经解压缩的文件就不能再设置为21了;如果设置为 21,就表示还需要解压缩,肯定要出错。
4、0x8056530b、0x80565306
Enable-DedupVolume :MSFT_DedupVolume.Volume=‘c:‘ - HRESULT 0x8056530b,不支持指定的卷类型。固定的、支持写入的NTFS数据卷以及由NTFS 数据卷提供支持的CSV 支持重复数据删除。
这是由于不能对系统卷、网络路径进行重复数据删除。
5、0x800f0830
指定的映像不再可用,可能已损坏。
请放弃修改后的映像。然后重新开始。
这个错误真的很小,找到注册表HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ComponentBased Servicing,删除属性Unserviceable,或改成 0 即可,但微软居然就让我们放弃,不知是何原因。
另外,还有几个错误有必要提一下,但限于篇幅,只略作提示。如果不能理解,就说明没有碰到,直接忽略。
1、找不到引用的汇编
缺少 HKLM\Components\DerivedData\Components\Identity
2、参照的程序没有安装在系统上
缺少 HKLM\Components\DerivedData\VersionedIndex\XXX (winblue_rXXX)\ComponentFamilies\ComponentsFamily中的V!XXX
缺少HKLM\Components\DerivedData\Components\Identity
3、组件存储已损坏
缺少程序集或清单文件
缺少 HKLM\Components\DerivedData\VersionedIndex\XXX (winblue_rXXX)\ComponentFamilies\ComponentsFamily
4、一个或多个事务不存在
缺少 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners\Winners
错误是列举不完的,最终还需要自己看日志。主要有两个:
1、\Windows\Logs\CBS\CBS.log
这个文件的内容非常丰富,只是刚开始可能不容易看得懂,可以参考微软的一篇文章《可选组件安装日志诊断程序》。
尽管 dism 命令提示出错要看DISM 日志文件,\WINDOWS\Logs\DISM\dism.log。但这个文件在图形界面下几乎没有用处,可以不看,只有在 WinRE 环境下才需要看这个文件。
2、\Windows\Inf\setupapi.dev.log
涉及到安装驱动程序,提示不能完成更新的,一定要看看这个文件。
最后要说的,看到本文,微软会不会不高兴?
附表:重复数据删除组件的注册表值
amd64_microsoft-windows-dedup-common_31bf3856ad364e35_6.3.9600.16384_none_24924b7b049f1064
CF = 200
f!ddp_ps.dll_549a992a3c8616e4= 21
f!ddputils.dll = 21
f!ddptrace.dll = 21
f!ddp.mof = 21
amd64_microsoft-windows-dedup-common.resources_31bf3856ad364e35_6.3.9600.16384_zh-cn_735de6f4f3c9bf01
CF = 200
f!ddp.mfl = 1
f!ddputils.dll.mui = 21
amd64_microsoft-windows-dedup-vsswriter_31bf3856ad364e35_6.3.9600.16384_none_6a34e1622afa6abc
CF = 200
f!ddpvssvc.dll = 21
amd64_microsoft-windows-dedup-service_31bf3856ad364e35_6.3.9600.16384_none_bfb8b8d13d6b64ec
f!dedupfilemetadata.cdxml= 1
f!ddpsvc.dll = 21
f!deduplication.psd1 = 1
f!ddpeval.exe = 21
f!dedupjob.cdxml = 21
f!ddpwmi.dll = 21
f!ddpcli.exe = 21
f!dedupmetadata.cdxml = 1
f!deduplication.types.ps1xm_9ba49f296646713d= 21
f!dedupstatus.cdxml = 1
f!dedupschedule.cdxml = 21
f!dedupvolume.cdxml = 21
f!deduplication.format.ps1x_74de558af5a08661= 21
f!deduplicationprovider.mof= 21
CF = 200
amd64_microsoft-windows-dedup-pipeline_31bf3856ad364e35_6.3.9600.16384_none_4a1a2e1b94c17293
CF = 200
f!ddppipeline.dll = 21
f!ddpscan.dll = 21
f!ddpstore.dll = 21
amd64_microsoft-windows-dedup-backup_31bf3856ad364e35_6.3.9600.16384_none_082618006d52d13d
CF = 200
f!ddpbackup.dll = 21
amd64_microsoft-windows-d..p-service.resources_31bf3856ad364e35_6.3.9600.16384_zh-cn_ef122ebc772ca755
CF = 200
f!ddpsvc.dll.mui = 21
f!deduplicationprovider.mfl= 21
f!ddpwmi.dll.mui = 21
amd64_microsoft-windows-dedup-filter_31bf3856ad364e35_6.3.9600.16384_none_f8cff29f2baf02c3
CF = 200
f!dedup.sys = 21
amd64_microsoft-windows-dedup-chunklibrary_31bf3856ad364e35_6.3.9600.16384_none_b739226fcac7b86b
CF = 200
f!ddpchunk.dll = 21
amd64_microsoft-windows-fsdm-hostprocess_31bf3856ad364e35_6.3.9600.16384_none_1dcf65c39dce3a7c
CF = 200
f!fsdmhost.exe = 21
注:这是以从光盘中提取文件为基准的设置值。