Win7之家( afsion.com.cn):Windows 7中Windows目錄到底占用了多少硬盤空間?
原本這個話題是準備在8個月前寫的,但是由于種種原因,一直推遲到現在。今晚(或者說今天凌晨),抽空把程序弄完了,因為只有程序寫完以后,這個話題才有實際的價值。
這個話題就是:Windows 目錄到底占用了多少真實的硬盤空間?
看到這個問題,我想99%的人都會說:用資源管理器右鍵點擊Windows目錄,看看屬性不就知道了嗎?何必故弄玄虛呢!
但是,我 Smallfrogs 會有那么傻的把一個大家都知道的問題重新翻出來嗎?既然提出了這個話題,就有我的道理!請各位耐住性子往下看,看看我們的Microsoft同學又玩了什么樣的花活,呵呵。
我們知道,查看一個目錄有多大的最快捷的方法就是看看資源管理器文件夾的屬性,但是我今天要說的是:如果你用這個方法去看 Windows Vista / Windows 7 系統的目錄,你會被你的眼睛所欺騙,因為,Microsoft 同學在 Windows Vista/ Windows 7里面大量使用了NTFS文件系統的特性之一的:硬連接(Hard Link)來實現WinSxS機制!
我們知道,要安裝 Windows Vista / Windows 7系統,那么系統分區(qū)必須是NTFS文件系統。原因有以下一些:
- 系統文件保護所需
- 各種安全保護機制,如MIC所需
- WinSxS 所需
- ……
關于最后一點的 WinSxS 所需,我沒有看到過相關的資料說明,不過可以肯定的是,這也是Windows Vista / Windows 7 系統需要NTFS文件系統的一個條件,因為只有在 NTFS 文件系統上面,才能實現硬連接機制,也才能達到優(yōu)化Windows目錄占用磁盤空間的目的。
關于硬連接,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.
簡單的說,就是一種針對文件的特殊快捷方式,只不過這種快捷方式的實現和一般的快捷方式不一樣。
- 一般的快捷方式是創(chuàng)建一個LNK文件,在這個LNK文件里面描述了目標文件/目錄的屬性,資源管理器或者其他文件管理工具利用SHELL32.DLL里面的API函數獲得這個LNK文件所指向的文件/目錄,從而進行訪問。
-
硬連接:是一種基于文件系統級別上的針對文件的快捷方式,基于文件系統級別的含義就是說,只要文件系統啟動了,那么對應的快捷方式也就生效了。換句話說,這種連接是常存的,因為文件系統是必須要隨機啟動的。
硬連接是NTFS文件系統特有的屬性之一,在Linux下面,也有類似的機制。硬連接適用于在同一個卷的文件級別,硬連接是不能跨卷的。
Windows Vista / Windows 7自帶了創(chuàng)建硬連接的命令:mklink.exe,利用這個命令,我們可以給指定的文件創(chuàng)建硬連接:
下面的命令將在link.txt和source.txt之間建立硬連接關系
C:UsersSmallfrogsDesktop>mklink /h link.txt source.txt
為 link.txt <<===>> source.txt 創(chuàng)建了硬鏈接
注 意上面的例子:link.txt本是一個不存在的文件,但是當執(zhí)行完mklink命令以后,link.txt文件也就被創(chuàng)建了。其實,link.txt是 一個虛假的文件,它是在文件系統層面上對source.txt文件的一個映射,而link.txt是不占硬盤空間的。
關于硬盤空間的占用問題,Smallfrogs 是這樣測試的:
1、給硬盤劃分一個新分區(qū),空間只有2GB
2、在這個分區(qū)的test目錄里面新建了一個1.9GB大小的文件,此時剩余空間是0.1GB
3、用mklink命令給這個1.9GB大小的文件建立了一個硬連接
4、檢查這個分區(qū)的剩余空間,還是0.1GB,但是如果用資源管理器看test目錄的屬性,會發(fā)現有2個文件,總大小是3.8GB(整個分區(qū)才2GB,能夠容納3.8GB大小的文件嗎?顯然不可能了)
還是針對上述的例子,如果我們把原始的文件 source.txt 刪除以后,link.txt文件還是會繼續(xù)存在的,且內容就是source.txt的文件內容。也就是說,我們刪除source.txt,實際上刪除的僅僅是這種連接關系,文件本身還是沒有被操作的。
關 于硬連接,最后一個需要介紹的內容是:當硬連接建立以后,硬連接雙方任何一個對象被修改,都會造成對應的連接對象被修改。例如上面的例子:如果修改了 link.txt,那么source.txt文件也會同步被修改,反之亦然。這一點和SHELL層面的快捷方式不同,SHELL層面的快捷方式文件LNK 僅僅是一個指示關系,修改LNK文件并不影響LNK文件指向的對象,修改LNK文件指向的對象也不會影響LNK文件。
好了,基本知識介紹完了,我們來實際看看Windows目錄里面對于硬連接的使用情況吧。
經?吹接腥吮г,WindowsWinSxS目錄占用了太多的空間,里面經常發(fā)現有同名的文件,而且這些同名的文件在 WindowsSystem32 目錄下面也有存在,這是為啥呢?其實這就是硬連接導致的。
Microsoft 實際上在 WindowsWinSxS 目錄和Windows目錄之間建立了硬連接的關系,舉一個最簡單的例子:
對于 Windows 7 RTM 來說,你可以在2個地方找到Ntoskrnl.exe文件。第一個地方是:WindowsSystem32ntoskrnl.exe,另外還有一個地 方是WindowsWinSxSx86_microsoft-windows-os- kernel_31bf3856ad364e35_6.1.7600.16385_none_6c06b7c41576a7d9ntoskrnl.exe, 這就是一個典型的硬連接例子。Microsoft 在文件系統上面對 ntoskrnl.exe 做了一個硬連接,使得 ntoskrnl.exe 能夠出現在不同的目錄里面,但是只占用了一份 ntoskrnl.exe 的硬盤空間。利用這種機制,有下面的一些好處:
- 同樣的文件,只需要維護硬連接關系,不需要進行多重的拷貝,這樣可以節(jié)省硬盤空間
- 如果涉及文件更新,只需要先在WinSxS 目錄里面下載好一個新版本,然后修改 WindowsSystem32 下面同名文件的硬連接關系,從舊版本的硬連接指向新版本的硬連接,這樣就能夠快速的完成文件的更新工作,而不需要進行文件的復制,速度也會快不少
- 補丁卸載也是一樣的,只需要把硬連接指向改為舊版本就可以了,沒有文件替換的問題。而且建立了硬連接關系的文件之間的修改是同步的,因此只要有一方被修改了,另一方也會得到修改
說了這么多,那么如何知道 Windows 目錄的真實大小呢?Smallfrogs 提供了一個工具,可以很方便的知道您系統里面有哪些文件是有硬連接關系的,以及Windows 目錄下真實的文件大小。
工具可以從 http://www.kztechs.com/hardlink/realwindirsize.zip (請使用右鍵點擊另存為...方式下載)或在本文附件下載到,下載解壓縮以后,直接運行就可以開始掃描了。
掃描過程比較漫長,掃描完成以后,會看到下面的提示信息:
另外,在realwindirsize.exe所在目錄下,會生成一份文件名叫做LinkedFile.TXT的文件,里面記錄了Windows目錄下各個硬連接的關系。
如上圖所示,我們掃描到了65088個文件,其中,真實的文件有48022個,其他17066個文件 都是硬連接文件。真實的文件占用了14981682 KB的硬盤空間,而如果你用資源管理器看Windows目錄的話,那么會提示說Windows目錄占用了 18244902 KB的硬盤空間。實際上, Windowssystem32 目錄下的大多數文件都和 WinSxS 目錄建立了硬連接關系。
說了這么多,最后總結一下吧:
- 硬連接,一種基于文件系統的同一卷里面的文件快捷方式
- Windows 目錄下面大量使用了硬連接技術
- WindowsSystem32 目錄下的大多數文件,都和 WinSxS 目錄建立了硬連接關系
- 要檢查自己系統Windows目錄里面的硬連接,請下載工具 http://www.kztechs.com/hardlink/realwindirsize.zip 自己掃描吧
OK,本次Windows 7 研究就此完成,請繼續(xù)等待下篇吧!
文/Smallfrogs
評論列表
查看所有 條評論