转自:http://blog.163.com/yuan_haoliang/blog/static/81198320097178431691/

 

从WINDOWS 98用到现在的7,自VISTA开始就出现了个莫名的winsxs文件夹,既不知道有什么用,也不能删除,想必很多坛友有此疑问吧,那我说说啥是winsxs。

谈到winsxs,就要从微软效仿linux而引进的一种新的文件储存方式,链接式(英文叫HARDLINK,不知汉语怎么翻译)。就是说比如我有一个文件,通常我要复制它,就要用到复制粘贴,储存空间加倍。但是用HARDLINK,通俗点讲,复制的仅仅只是一个索引而已,就是说有两个文件,但是共用一个储存空间。你删除其中任意一个,另一个都可以正常使用,而且只占用一份的空间。你改变其中任意一个,另一个随之改变。你粘贴时选择覆盖,另一个内容随之覆盖。

但是注意,如果你查看文件或者文件夹的属性,他们都会占空间。但是你查看磁盘的空间,你会发现不管HARDLINK多少次,都只占用一份空间,这也就是说连操作系统都无法分清是HARDLINK,还是真实的单独文件。比如你D盘10G文件,用hardlink把这10G的文件又做了一份,你查看磁盘属性,占用空间为10G,但是全选里面所有的文件,显示为20G。所以你装完Win7查看系统盘属性和全选系统文件后看属性他们显示的空间占用是不一致的

是不是很方便?

在VISTA/7下,可以用MKLINK这个命令创建这种HARDLINK,具体用法,你可以参考系统自带的MKLINK提示。

当然现在也有一个方便的可供批量使用的HARDLINK工具,集成在了右键菜单中,我放到附件里了,感兴趣的可以自己去下载。

安装了这个工具后,你再打开windows目录,看看有什么不一样?好多的系统文件左下角多了个红色的小箭头(快捷方式是蓝色的),用以标记被hardlink过的文件。你再看看他的属性,多了一项吧?

 

上面写着他的另一个副本在哪里呢!天哪,原来都在winsxs文件夹里。明白了吧!系统部署的时候,其实在install.wim里只有winsxs占用空间,其他都只是hardlink(原来是否奇怪过imagex的压缩比怎么这么大?),部署时先复制winsxs,然后将所需的系统文件用hardlink的方式部署到确定路径,一来达到统一管理的目的,二来方便误操作删除了系统文件后的自动恢复。

如果你升级系统补丁,他是先将文件放进winsxs,然后再部署到相应路径。在你使用“关闭windows的功能”时,也只是移除了系统文件的副本而已,系统文件本身还在winsxs中,并没有省空间。

在回头看看winsxs文件夹,好多人删除它了发现没有问题,呵呵,那是因为hardlink删除任意一个都不影响另一个。但当你安装新硬件的时候系统想从winsxs里部署驱动程序,于是他傻了!没有了winsxs自然也就不能自动更新了,总之一切的莫名的问题都来了。

现在清楚winsxs的作用了吧?

那么hardlink能为我们所用吗?答案是肯定的

应用举例一

列举一个hardlink的日常用法。比如玩魔兽争霸的朋友清楚,切换版本最麻烦了。但是用hardlink却可以很方便的解决这一问题,一劳永逸。先安装1.20版,将文件夹命名为1.20(最好删除那些无用的垃圾文件,不删除也无所谓,就是图个眼睛干净)。在别处(最好和1.20放在同一个文件夹里)建立4个文件夹,命名为1.21,1.22,1.23,1.24。然后安装附件中的工具,右键拖动1.20里所有的文件到1.21,松开右键,选择hardlink clone

 

然后就出现了魔兽争霸所有文件的hardlink,其中的文件夹是真实的,其他的文件都是hardlink。然后删除game.dll  ijl15.dll  storm.dll  war3.exe   War3Patch.mpq   worldedit.exe 这7个文件(因为版本的不同就取决与这7个文件)。下载1.21补丁,把其中的这7个文件拷到1.21文件夹中,OK,1.21的做好了,如法炮制,制作1.22,1.23,1.24,然后只需要运行各个目录下的魔兽就是所需版本了。如果你记下原来磁盘的空间,你会发现只占用了一个1.20的空间,添加了其他4个版本只多了那些不同的文件的空间,嘻嘻。(还有个技巧,删除其中4个MAPS文件夹,然后依次用右键中的JUNCTION复制MAPS到刚刚删除的4个目录中,这样就是对文件夹做了LINK,而不是文件,达到了所有版本的地图都一样的效果。神奇吧!

应用举例二

很多人都在苦恼不断增长的系统盘,可随着使用,系统盘增长是不可避免的,于是动起了USERS文件夹的注意。如果能把users文件夹移到其他盘,既方便了管理,也将这个日益增大的负担移除了系统盘。注意在资源管理器中是看不到users文件夹的,他的名字被映射成了“用户”,你用cmd的dir命令就可以看到他的真实名称。

先假设系统装在C盘,然后其他的文件放在了D盘,先用WIN7的光盘引导进PE(在PE里移动系统文件不会破坏他的权限),打开CMD(这个就不一步步的说了)然后随便运行一个程序,比如regedit,选择文件-导入。这里并不是要动注册表,只是利用了他的资源管理器而已。找到那个c:/users文件夹,右键移动到D盘,确保C盘已经没有users文件夹了。然后在CMD里输入mklink c:/users d:/users /j,这就为那个d:/USERS在C:/USERS创建了一个junction link,此后虽然在C盘由一个users文件夹,但是其内容的空间确实占在了D盘,呵呵

Vista/win7 32:

http://schinagl.priv.at/nt/hardlinkshellext/HardLinkShellExt_win32.exe

Vista/win7 64:

http://schinagl.priv.at/nt/hardlinkshellext/HardLinkShellExt_X64.exe

Logo

更多推荐