Windows 7中Windows目錄到底占用了多少硬盤(pán)空間?

2009/9/7 10:25:58    編輯:Windows7之家 - Mary Jane     字體:【

Win7之家airtaxifl.com):Windows 7中Windows目錄到底占用了多少硬盤(pán)空間?

 原本這個(gè)話題是準(zhǔn)備在8個(gè)月前寫(xiě)的,但是由于種種原因,一直推遲到現(xiàn)在。今晚(或者說(shuō)今天凌晨),抽空把程序弄完了,因?yàn)橹挥谐绦驅(qū)懲暌院螅@個(gè)話題才有實(shí)際的價(jià)值。

這個(gè)話題就是:Windows 目錄到底占用了多少真實(shí)的硬盤(pán)空間?

看到這個(gè)問(wèn)題,我想99%的人都會(huì)說(shuō):用資源管理器右鍵點(diǎn)擊Windows目錄,看看屬性不就知道了嗎?何必故弄玄虛呢!

但是,我 Smallfrogs 會(huì)有那么傻的把一個(gè)大家都知道的問(wèn)題重新翻出來(lái)嗎?既然提出了這個(gè)話題,就有我的道理!請(qǐng)各位耐住性子往下看,看看我們的Microsoft同學(xué)又玩了什么樣的花活,呵呵。

我們知道,查看一個(gè)目錄有多大的最快捷的方法就是看看資源管理器文件夾的屬性,但是我今天要說(shuō)的是:如果你用這個(gè)方法去看 Windows Vista / Windows 7 系統(tǒng)的目錄,你會(huì)被你的眼睛所欺騙,因?yàn),Microsoft 同學(xué)在 Windows Vista/ Windows 7里面大量使用了NTFS文件系統(tǒng)的特性之一的:硬連接(Hard Link)來(lái)實(shí)現(xiàn)WinSxS機(jī)制!

我們知道,要安裝 Windows Vista / Windows 7系統(tǒng),那么系統(tǒng)分區(qū)必須是NTFS文件系統(tǒng)。原因有以下一些:

  • 系統(tǒng)文件保護(hù)所需
  • 各種安全保護(hù)機(jī)制,如MIC所需
  • WinSxS 所需
  • ……


關(guān)于最后一點(diǎn)的 WinSxS 所需,我沒(méi)有看到過(guò)相關(guān)的資料說(shuō)明,不過(guò)可以肯定的是,這也是Windows Vista / Windows 7 系統(tǒng)需要NTFS文件系統(tǒng)的一個(gè)條件,因?yàn)橹挥性?NTFS 文件系統(tǒng)上面,才能實(shí)現(xiàn)硬連接機(jī)制,也才能達(dá)到優(yōu)化Windows目錄占用磁盤(pán)空間的目的。

關(guān)于硬連接,MSDN是這樣解釋的:

A hard link is the file system representation of a file by which more than one path references a single file in the same volume. To create a hard link, use the CreateHardLink function. Any changes to that file are instantly visible to applications that access it through the hard links that reference it. However, the directory entry size and attribute information is updated only for the link through which the change was made.

簡(jiǎn)單的說(shuō),就是一種針對(duì)文件的特殊快捷方式,只不過(guò)這種快捷方式的實(shí)現(xiàn)和一般的快捷方式不一樣。

  • 一般的快捷方式是創(chuàng)建一個(gè)LNK文件,在這個(gè)LNK文件里面描述了目標(biāo)文件/目錄的屬性,資源管理器或者其他文件管理工具利用SHELL32.DLL里面的API函數(shù)獲得這個(gè)LNK文件所指向的文件/目錄,從而進(jìn)行訪問(wèn)。
  • 硬連接:是一種基于文件系統(tǒng)級(jí)別上的針對(duì)文件的快捷方式,基于文件系統(tǒng)級(jí)別的含義就是說(shuō),只要文件系統(tǒng)啟動(dòng)了,那么對(duì)應(yīng)的快捷方式也就生效了。換句話說(shuō),這種連接是常存的,因?yàn)槲募到y(tǒng)是必須要隨機(jī)啟動(dòng)的。

    硬連接是NTFS文件系統(tǒng)特有的屬性之一,在Linux下面,也有類(lèi)似的機(jī)制。硬連接適用于在同一個(gè)卷的文件級(jí)別,硬連接是不能跨卷的。


Windows Vista / Windows 7自帶了創(chuàng)建硬連接的命令:mklink.exe,利用這個(gè)命令,我們可以給指定的文件創(chuàng)建硬連接:

下面的命令將在link.txt和source.txt之間建立硬連接關(guān)系
C:UsersSmallfrogsDesktop>mklink /h link.txt source.txt
為 link.txt <<===>> source.txt 創(chuàng)建了硬鏈接

注 意上面的例子:link.txt本是一個(gè)不存在的文件,但是當(dāng)執(zhí)行完mklink命令以后,link.txt文件也就被創(chuàng)建了。其實(shí),link.txt是 一個(gè)虛假的文件,它是在文件系統(tǒng)層面上對(duì)source.txt文件的一個(gè)映射,而link.txt是不占硬盤(pán)空間的。

關(guān)于硬盤(pán)空間的占用問(wèn)題,Smallfrogs 是這樣測(cè)試的:
1、給硬盤(pán)劃分一個(gè)新分區(qū),空間只有2GB
2、在這個(gè)分區(qū)的test目錄里面新建了一個(gè)1.9GB大小的文件,此時(shí)剩余空間是0.1GB
3、用mklink命令給這個(gè)1.9GB大小的文件建立了一個(gè)硬連接
4、檢查這個(gè)分區(qū)的剩余空間,還是0.1GB,但是如果用資源管理器看test目錄的屬性,會(huì)發(fā)現(xiàn)有2個(gè)文件,總大小是3.8GB(整個(gè)分區(qū)才2GB,能夠容納3.8GB大小的文件嗎?顯然不可能了)

還是針對(duì)上述的例子,如果我們把原始的文件 source.txt 刪除以后,link.txt文件還是會(huì)繼續(xù)存在的,且內(nèi)容就是source.txt的文件內(nèi)容。也就是說(shuō),我們刪除source.txt,實(shí)際上刪除的僅僅是這種連接關(guān)系,文件本身還是沒(méi)有被操作的。

關(guān) 于硬連接,最后一個(gè)需要介紹的內(nèi)容是:當(dāng)硬連接建立以后,硬連接雙方任何一個(gè)對(duì)象被修改,都會(huì)造成對(duì)應(yīng)的連接對(duì)象被修改。例如上面的例子:如果修改了 link.txt,那么source.txt文件也會(huì)同步被修改,反之亦然。這一點(diǎn)和SHELL層面的快捷方式不同,SHELL層面的快捷方式文件LNK 僅僅是一個(gè)指示關(guān)系,修改LNK文件并不影響LNK文件指向的對(duì)象,修改LNK文件指向的對(duì)象也不會(huì)影響LNK文件。

好了,基本知識(shí)介紹完了,我們來(lái)實(shí)際看看Windows目錄里面對(duì)于硬連接的使用情況吧。

經(jīng)?吹接腥吮г,WindowsWinSxS目錄占用了太多的空間,里面經(jīng)常發(fā)現(xiàn)有同名的文件,而且這些同名的文件在 WindowsSystem32 目錄下面也有存在,這是為啥呢?其實(shí)這就是硬連接導(dǎo)致的。

Microsoft 實(shí)際上在 WindowsWinSxS 目錄和Windows目錄之間建立了硬連接的關(guān)系,舉一個(gè)最簡(jiǎn)單的例子:

對(duì)于 Windows 7 RTM 來(lái)說(shuō),你可以在2個(gè)地方找到Ntoskrnl.exe文件。第一個(gè)地方是:WindowsSystem32ntoskrnl.exe,另外還有一個(gè)地 方是WindowsWinSxSx86_microsoft-windows-os- kernel_31bf3856ad364e35_6.1.7600.16385_none_6c06b7c41576a7d9ntoskrnl.exe, 這就是一個(gè)典型的硬連接例子。Microsoft 在文件系統(tǒng)上面對(duì) ntoskrnl.exe 做了一個(gè)硬連接,使得 ntoskrnl.exe 能夠出現(xiàn)在不同的目錄里面,但是只占用了一份 ntoskrnl.exe 的硬盤(pán)空間。利用這種機(jī)制,有下面的一些好處:

  • 同樣的文件,只需要維護(hù)硬連接關(guān)系,不需要進(jìn)行多重的拷貝,這樣可以節(jié)省硬盤(pán)空間
  • 如果涉及文件更新,只需要先在WinSxS 目錄里面下載好一個(gè)新版本,然后修改 WindowsSystem32 下面同名文件的硬連接關(guān)系,從舊版本的硬連接指向新版本的硬連接,這樣就能夠快速的完成文件的更新工作,而不需要進(jìn)行文件的復(fù)制,速度也會(huì)快不少
  • 補(bǔ)丁卸載也是一樣的,只需要把硬連接指向改為舊版本就可以了,沒(méi)有文件替換的問(wèn)題。而且建立了硬連接關(guān)系的文件之間的修改是同步的,因此只要有一方被修改了,另一方也會(huì)得到修改


說(shuō)了這么多,那么如何知道 Windows 目錄的真實(shí)大小呢?Smallfrogs 提供了一個(gè)工具,可以很方便的知道您系統(tǒng)里面有哪些文件是有硬連接關(guān)系的,以及Windows 目錄下真實(shí)的文件大小。

工具可以從 http://www.kztechs.com/hardlink/realwindirsize.zip (請(qǐng)使用右鍵點(diǎn)擊另存為...方式下載)或在本文附件下載到,下載解壓縮以后,直接運(yùn)行就可以開(kāi)始掃描了。

掃描過(guò)程比較漫長(zhǎng),掃描完成以后,會(huì)看到下面的提示信息:

 
另外,在realwindirsize.exe所在目錄下,會(huì)生成一份文件名叫做LinkedFile.TXT的文件,里面記錄了Windows目錄下各個(gè)硬連接的關(guān)系。

如上圖所示,我們掃描到了65088個(gè)文件,其中,真實(shí)的文件有48022個(gè),其他17066個(gè)文件 都是硬連接文件。真實(shí)的文件占用了14981682 KB的硬盤(pán)空間,而如果你用資源管理器看Windows目錄的話,那么會(huì)提示說(shuō)Windows目錄占用了 18244902 KB的硬盤(pán)空間。實(shí)際上, Windowssystem32 目錄下的大多數(shù)文件都和 WinSxS 目錄建立了硬連接關(guān)系。

說(shuō)了這么多,最后總結(jié)一下吧:

  • 硬連接,一種基于文件系統(tǒng)的同一卷里面的文件快捷方式
  • Windows 目錄下面大量使用了硬連接技術(shù)
  • WindowsSystem32 目錄下的大多數(shù)文件,都和 WinSxS 目錄建立了硬連接關(guān)系
  • 要檢查自己系統(tǒng)Windows目錄里面的硬連接,請(qǐng)下載工具 http://www.kztechs.com/hardlink/realwindirsize.zip 自己掃描吧


OK,本次Windows 7 研究就此完成,請(qǐng)繼續(xù)等待下篇吧!

文/Smallfrogs