在完成本专题的上一篇文章《怀念Windows XP经典之文件管理器篇》后我一直在想,一个用户日常使用的基本工具在某种程度上居然能有如此大程度的退化,到底是什么原因呢?对于这个问题的答案我的猜测是,这是Longhorn后遗症的典型表现。
也就是说,当年Windows团队在开发Longhorn时,应该对文件管理器有着不少不错的改进,可惜因为后来的重来,赶工和代码迁移这些折腾的过程,许多原有的功能丢失了,并且其中因为软件开发层面的因素(开发人员普遍都有这种感觉:看懂以前的他人写的项目代码有时候还不如自己从头搞,更何况是这么一个复杂度堪比登月的操作系统),其后果就是目前为止整个NT 6在某些体验上感觉都不如XP。这或许算是一种断层吧,也难怪Jim Allchin在那段时期有着迷失的感觉。
不瞎猜测了,既然都是已经发生了的事情,就尽量吸取其中的教训,某种程度上我强烈地感觉Longhorn和Vista简直就是软件工程领域的经典著作《人月神话》中的桌面版的IBM System/360,因为书中所提出的"第二系统效应"恰好简洁扼要地概括了Longhorn和Vista的整个开发过程。
本文就从这个"第二系统效应"谈起,来瞧瞧相比NT 5的XP,为什么NT 6时代的系统所占用的硬盘容量那么多,而且某种程度上说变得不必要地复杂。
相比上一篇基本只关注图形界面上的表面功夫,本文更关心的是底层细节的阐述,因此专业性方面有所增强,于是先友情提醒一下:前方高能!
不过即使你是毫不关心技术方面的普通用户,也能够从本文中学到有用的东西,特别是你曾经遇到过下列一个或多个问题并为之烦恼的话:
在控制面板中关闭了某些系统功能后重启,却发现可用空间不是更多而是更少了
准备好了吗?Let's rock!
许多用户和Vista, 7和8这几个NT 6系统的初次邂逅,除了最容易发现的界面上的变化外,就是另一个同样不难发现的现象:它们所占用的磁盘空间明显增多了,比如根据本人的经验,全新安装7之后的系统分区,32位系统可占用大约10 GB,64位系统则占用十多个GB,并且随着使用时间的增加,特别是经过多次的系统更新之后,系统文件所占用的空间会更多,而XP也就长期占用几个GB而已。为什么这差别会这么大呢?
其中的原因是多方面的,本文主要想从WinSxS这个特殊且重要的文件夹入手,通过解释其背后的服务机制(servicing)来说明上述现象发生的主要原因。
许多用户都有这么一个看法,认为新版本的系统很吃硬盘空间的原因是由于要考虑到向后兼容性,以及多年来积累的各种包袱。确实有这方面的因素,然而却不是造成系统臃肿的主要原因。实际上微软在处理兼容性时做的工作所带来的影响,远远没有当初Vista发布时表现得那么糟糕。真正的主要原因还是由于从NT 6开始引入了重新设计的服务机制,这种机制的典型应用场景之一是系统更新和打补丁。因此理解了这种新的服务机制的原理,也就明白了为什么新系统随着使用时间的增加和补丁数量的增多,系统分区的可用空间会越来越少,而且整个更新过程所用的时间比较长。
作为对比,先看一下在XP中是如何处理系统更新以及打补丁这些过程的。XP使用的是热补丁安装程序(Update.exe),这种机制在安装更新时所花费的时间较少。如果用户想进一步减少更新所占用的时间,可以选择关闭系统还原功能。(Vista和7也可以这么做,同时值得注意的是,在8中默认就关闭了系统还原。有关8在这方面的改进,后面会提到)
需要特别强调的是,系统还原的存在有其意义,一般并不建议缺乏经验的用户随意关闭系统还原,却可以选择经常清理早期的不需要的还原点。原因在于系统还原提供了一个后悔药,使得在安装了某次更新后若出现问题可以选择以前的还原点以撤销当前的更改。
而实际情况却是,使用这个系统还原功能的用户少得可怜,自己少有的几次还原尝试基本都失败了,甚至许多用户都不知道有这个功能,更别说在天朝这个盗版"狗屎特一贱还原"横行的大环境下,用户遇到点儿麻烦问题就想着通过盗版盘来重装系统或者还原gho文件的意识倒是比较强,这使得系统还原这个本身很有用的功能逐渐被边缘化,其原因值得深思。
因此伴随着这种使用习惯,用户撤销更新的几率也不大。于是XP的这种热补丁安装程序机制就体现出其较大的优势,因为其简单易行且快速有效。在执行系统更新时,此机制在%windir%system32和%windir%system32dllcache (Windows文件保护缓存)这两个目录下安装新版本的文件。对于系统中正在使用的文件,此机制为在dllcache中的相应文件备份一份到system32文件夹中,并且标记重启记号以要求重启后生效。
这就是XP中的热补丁安装程序机制,一种基于文件的服务机制(file-based servicing),可以看到在基本不考虑撤销更新的使用习惯下(一般当某个更新出现问题时才会撤销它,而这种情况发生的概率并不是很大),这种机制的优势大于劣势,这样可以节省大量的更新备份文件所占用的磁盘空间。
更加灵活的是,如果在安装更新后没有出现什么稳定性问题,并且在使用一段时间后系统表现正常的话,那么用户甚至可以考虑清空更新备份目录,此目录位于C:Windows$Uninstall$KBxxxxxx。(我自己就经常这么做,感觉很爽)
而在开发Vista时,因为考虑到各种系统组件的交叉依赖问题,微软引入了基于组件的服务机制(Component Based Servicing, CBS)。因此相比之下,XP的服务机制的原子单位是文件,Vista以后是组件。对于相关技术细节感兴趣的用户,可以去这里涨姿势。
CBS可以说涉及到整个操作系统的所有文件的安装,甚至包括在WinSxS目录下的语言包,并且从此处建立一个到C:Windowssystem32的硬链接(hard link)。这种机制的优势在于,在添加和删除系统功能和组件以及系统文件检查(sfc.exe)时不需要插入系统安装介质,而在XP中当执行相应操作时则会提示需要插入安装介质,显然这种做法很大程度上提高了系统的健壮性和稳定性。
然而这种设计机制同时也带来了显著的负面影响:占用大量的磁盘空间,特别对于容量本身就比较捉襟见肘的固态硬盘。当系统执行更新操作时,不像XP的热补丁安装程序那样将更新文件写入C:Windowssystem32和C:Windowssystem32dllcache,CBS的更新目录就是WinSxS目录。在此WinSxS目录下,对于某个被多个系统组件所使用的文件,系统为该文件保存多个副本并标注不同的版本号(以及处理器架构等其他信息)。版本数量越多,相应的副本数目也越多。
因此当Vista和7进行系统更新操作时,相应的更新文件(MSU文件)被逐个安装,最终得到更新的是各个组件而不是各个文件。 最让人抓狂的是,在老版本的组件被新版本的取代后仍存在于WinSxS目录下以方便用户卸载相应的更新也就是撤销更新操作,而有关撤销更新的情景前面已经说过了,其实这么做的用户并不多,频率也不高,或许服务器版的系统更需要这种可恢复性,那也可以将此功能在Server系中默认开启,毕竟服务器的硬盘通常更大,可惜普通用户对于硬盘的可用空间往往是比较敏感的。
对于普通用户来说,当越来越多的更新被安装,系统分区的可用空间也越来越少,这就是许多人认为Vista, 7和8如此臃肿的背后真凶。(对于8,情况有所好转,后面会提到)
现在来详细地看一看这个WinSxS目录。WinSxS目录位于C:WindowsWinSxS,意思是"Windows Side By Side",可简单理解为系统组件存储文件的缓存区域。
在我的64位的7上,WinSxS文件夹大约占7 GB,有11111个项目(注定孤独一生的节奏T.T),占据整个C:Windows系统文件夹大小的46%。 下图是一个形象的说明:
相比之下,XP中的WinSxS文件夹只有大约25-50MB。
如果对此目录进行文件类型的分析,可以发现其主要由imd,ngr,csd,dll,mui,exe等文件组成。
简单地讲,系统中的每个文件的每个版本实际上只存在着一份,而这唯一的一份就位于WinSxS目录中。因此从这个角度看,WinSxS目录可以说是整个系统的一个扁平化的底层表现形式,换句话说此目录本身就是一个完整的操作系统备份,它已经包含了所有可能需要的系统文件。
对于这个神秘的WinSxS目录,我鼓励大家自行进入其中浏览,并查看下其属性中的大小,不过你若被其庞大的体积吓尿了的话,don't panic!此目录的实际磁盘空间占用可能要远小于所显示的体积。这并非bug或是系统故意吓唬人,而是与之前提到的硬链接有关,相关细节可参阅此技术文章。(作为对比,我们常用的快捷方式从功能上类似于符号链接,符号链接也叫做软链接)
即便如此,用户想要对这个该死的目录瘦身和精简,该怎么操作呢?官方除了以可靠性,健壮性和安全性为由不建议用户擅自清理,移动和压缩此目录外,对于此问题还有这么一个"神回复":少安装一些更新。 好吧,普通用户一般是不会太过在意每个月的第二个周二来的大姨妈{}安全更新的,默认的Windows更新设置是下载并安装这些重要更新,因此官方的意思或许是让用户尽可能少地安装每个月的第四个周二来的小姨妈{}可选更新。
简而言之,用户需要在系统更新与硬盘空间之间做出适合自己情况的平衡。
那么普通用户对此只能束手无策了吗?NOPE!我坚信方法总比问题多。
总的来说,卸载不用的应用程序对于解决这个问题没有坏处,这一点显而易见。 另外一个建议是,既然每一次安装更新和补丁(几乎)都会导致可用空间的减少,那么安装整合版的系统是一个简单有效的解决方案,比如对于近期发布的8.1 update,直接全新安装8.1 with update的镜像显然比从8.1更新上来的要好一些,如果可以这么做的话。
如果你仍然用着Vista,很抱歉我暂时没找到简单易行的方法来解决这个问题,看来官方对这个系统似乎是选择性忽视了。
对于和我一样用着7的朋友们,首先确保安装了SP1,然后可以用下列官方提供的方法来适当缓解下这个问题。当然,这只是治标不治本的权宜之计,不过也能凑合用了,毕竟聊胜于无。显然官方对于这个问题的抱怨还没有固执到完全无动于衷的地步。
如果你每个月都有按时进行系统更新的好习惯,那么现在系统自带的磁盘清理工具中已经包含了Windows更新清理这个新添加的功能,这样用户可以对Windows更新后遗留下来的老旧的安装包进行清理和删除。(特别是自从SP1发布多年后的现在,积攒的更新安装包应该相当可观,而SP2一直遥遥无期)
在打开磁盘清理之后,选择系统分区,一般情况下就是C盘。如果你没有用管理员身份打开磁盘清理,那么会在这个界面的左下角看到"清理系统文件"的按钮:
点击此按钮后,弹出下图:
记得选中"Windows更新清理"这一项后确定。
整个清理过程结束之后可能会要求重启系统。
注意:如果当前没有可清理的系统更新,则此选项将不会显示。
特别说明:在清理完毕之后,可能会无法撤销之前安装的某个更新。如果想要再次安装已被删除的某个更新,用户需要手动安装此更新。
如果你没有通过系统更新来得到这个新功能的话,可以手动下载KB2852386这个更新来达到同样的目的。
如果你以前还没有发现这个新功能的话,试一试,看看到底能为你清理出多少可用空间。
在这个更新发布之后,许多用户纷纷表示各种给力。显然这是人们期待已久的。而我对此的思考则是,在新系统的设计之初就理应包括这个功能,毕竟系统不能只是一味地吃硬盘空间而不释放。如果早在Vista时期就默认拥有此功能的话,Vista的口碑或许会更好。无论如何,better late than never。
从时间上看,这个更新是去年十月份发布的,因此我猜测微软在公测和推广8时肯定遭遇到了对于这个问题更加猛烈的吐槽,因为对于平板来说,硬盘空间更显得寸土寸金,看来不见棺材不掉泪,于是在8中集成了此功能后又决定回头给7补上。(嗯,一定是故意无视掉了Vista)
如上所述,在8中已经拥有了此功能。同时在8.1中又有了进一步的优化,据说8.1会自动地减少WinSxS目录的大小,比如老旧的和已经被卸载移除了的版本在被新的取代并保留了一段时间之后,系统会自动将其删除,这是一个内部过程。
另外,在8中对于DISM.EXE这个命令行工具的功能也有所加强,此工具也能用于完全移除某些组件,同时也集成了CheckSUR.exe这个修复工具。8.1中的相应功能则有了进一步的增强,详细信息可以参考此技术文档。
除此之外,还有一些其他的"折腾"方法可以尝试,当然这些操作一般是不可撤销的,也有一定的危险性和不确定性,且有些资料可能较老,总之三思而后行。 比如SP1中自带的工具VSP1CLN.EXE,可以在安装好SP1后移除所有被替代的RTM版的组件。
对于服务器版本的系统,可以考虑使用这个方法。
从用户体验方面来看,这种基于组件的服务机制是相对于基于文件的服务机制的倒退,比如安装更新时居高不下的磁盘I/O导致给人的卡顿感,在注销/登陆系统时缓慢的配置更新速度,且这种机制更容易导致安装更新失败后的无法启动。
(吸引仇恨时间:想想你有多长时间浪费在了傻坐在下图前的屏幕前?特别是当你急于带着笔记本电脑离开或者有紧急任务不得不赶紧开始在本机上工作时?)
顺便提一句,除了这个WinSxS大头,另外一个系统文件夹C:WindowsSystem32DriverStore的体积也不小,毕竟驱动问题不是一个小问题,考虑到有那么多种类的硬件,有备无患更保险。也正是因为DriverStore的存在,人们常说的"免驱动"和即插即用才成为了司空见惯的事情。
(实际上免驱动这个说法本身是错误的。没有驱动程序,硬件是不可能正常和高效的工作,只是系统在后台自动帮助用户完成了硬件识别,匹配并安装相应驱动的整个过程。比如在首次插入USB接口的新硬件时,系统托盘处会提示驱动的安装情况,若安装成功的话之后再次插入同样的硬件就不会重复提示了)
本文的意义并不是像某些不明真相的用户,稍微遇到一些不爽的地方就开始抱怨和嚷嚷,给人一种感觉是"我比微软工程师更聪明!"。本文只是想在承认这个技术给用户带来安全与稳定的前提下,探讨其细节以及相应的副作用。
毕竟无论从硬盘的性能价格比还是容量价格比的趋势来看,用户是完全能够承受住其带来的磁盘占用过多这个副作用,因此我想通过这种方式来更加显著地暴露出其副作用,以引起广大用户的注意,更希望我的努力能让用户尽量避免这种副作用带来的不利影响,同时提供相关的解决方案,这才是本文的落脚点所在。
另外,这种底层技术细节的改动与表层用户体验的变化之间的平衡也是我想通过本文探讨的一点。众所周知微软是一家以工程师文化为主导的大公司(至少很大程度上如此),因此相应地在设计和人文方面就相对缺乏,特别是与苹果相比时更明显。除了两家公司的软件,硬件,产品和服务外,各自的广告风格也有着显著的差异,这一点在访问双方的官网时不难发现区别。
好在一路过来从Vista到7再到8,微软一直在努力,光是Vista SP1和SP2就比RTM强许多,现在来看Vista SP2与7 RTM的差别就更小了。不过因为本文一开始所说的"Longhorn后遗症"以及"第二系统效应"的深远影响,目前看来NT 6在这方面是不太可能有巨大的变化,作为软粉的我只能继续坐等盼未来了。
值得欣喜的是,不久前微软的官方博客与技术社区分享了新技术WIMBoot (Windows Image Boot)的相关细节,虽然不十分清楚这个新技术的使用与本文所讨论的问题的关联性如何,至少从现有资料来看,这个从8.1及其之后版本支持的新式Windows映像启动方式可以极大地减少系统安装后的硬盘占用空间,比如在使用此新技术之前安装好的系统会占用9 GB而新技术只会占用4 GB,并且从用户角度来说是不会看出什么区别的,希望这个新技术的引入能缓解本文所提到的问题吧。
写完本文后我恍然大悟,这次8.1 update更新有大片用户抱怨表示遇到各种问题的情况,其实并非偶然……