1. 程式人生 > >Windows 7目錄到底佔用了多少真實硬碟空間

Windows 7目錄到底佔用了多少真實硬碟空間

看到這個問題,我想99%的人都會說:用資源管理器右鍵點選Windows目錄,看看屬性不就知道了嗎?何必故弄玄虛呢!

但是,我會有那麼傻的把一個大家都知道的問題重新翻出來嗎?既然提出這個話題,就有我的道理!請各位耐住性子往下看,看看Microsoft又玩了什麼樣的花活,呵呵。

我們知道,檢視一個目錄有多大的最快捷的方法就是看看資源管理器資料夾的屬性,但是我今天要說的是:如果你用這個方法去看Windows Vista/Windows 7系統的目錄,你會被你的眼睛所欺騙,因為,Microsoft在 Windows Vista/Windows 7裡面大量使用了NTFS檔案系統的特性之一的:硬連線(Hard Link)來實現WinSxS機制!

我們知道,要安裝Windows Vista/Windows 7系統,那麼系統分割槽必須是NTFS檔案系統。原因有以下一些:

◦系統檔案保護所需
◦各種安全保護機制,如MIC所需
◦WinSxS 所需
◦……

關於最後一點的 WinSxS 所需,我沒有看到過相關的資料說明,不過可以肯定的是,這也是Windows Vista / Windows 7 系統需要NTFS檔案系統的一個條件,因為只有在 NTFS 檔案系統上面,才能實現硬連線機制,也才能達到優化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.

簡單的說,就是一種針對檔案的特殊快捷方式,只不過這種快捷方式的實現和一般的快捷方式不一樣。

•一般的快捷方式是建立一個LNK檔案,在這個LNK檔案裡面描述了目標檔案/目錄的屬性,資源管理器或者其他檔案管理工具利用SHELL32.DLL裡面的API函式獲得這個LNK檔案所指向的檔案/目錄,從而進行訪問。

•硬連線:是一種基於檔案系統級別上的針對檔案的快捷方式,基於檔案系統級別的含義就是說,只要檔案系統啟動了,那麼對應的快捷方式也就生效了。換句話說,這種連線是常存的,因為檔案系統是必須要隨機啟動的。

硬連線是NTFS檔案系統特有的屬性之一,在Linux下面,也有類似的機制。硬連線適用於在同一個卷的檔案級別,硬連線是不能跨卷的。

Windows Vista / Windows 7 自帶了建立硬連線的命令:mklink.exe,利用這個命令,我們可以給指定的檔案建立硬連線:

下面的命令將在link.txt和source.txt之間建立硬連線關係

C:\Users\Smallfrogs\Desktop>mklink /h link.txt source.txt

為 link.txt <<===>> source.txt 建立了硬連結

注意上面的例子:link.txt本是一個不存在的檔案,但是當執行完mklink命令以後,link.txt檔案也就被建立了。其實,link.txt是一個虛假的檔案,它是在檔案系統層面上對source.txt檔案的一個對映,而link.txt是不佔硬碟空間的。

關於硬碟空間的佔用問題,Smallfrogs 是這樣測試的:

1、給硬碟劃分一個新分割槽,空間只有2GB

2、在這個分割槽的test目錄裡面新建了一個1.9GB大小的檔案,此時剩餘空間是0.1GB

3、用mklink命令給這個1.9GB大小的檔案建立了一個硬連線

4、檢查這個分割槽的剩餘空間,還是0.1GB,但是如果用資源管理器看test目錄的屬性,會發現有2個檔案,總大小是3.8GB(整個分割槽才2GB,能夠容納3.8GB大小的檔案嗎?顯然不可能了)

還是針對上述的例子,如果我們把原始的檔案 source.txt 刪除以後,link.txt檔案還是會繼續存在的,且內容就是source.txt的檔案內容。也就是說,我們刪除source.txt,實際上刪除的僅僅是這種連線關係,檔案本身還是沒有被操作的。

關於硬連線,最後一個需要介紹的內容是:當硬連線建立以後,硬連線雙方任何一個物件被修改,都會造成對應的連線物件被修改。例如上面的例子:如果修改了link.txt,那麼source.txt檔案也會同步被修改,反之亦然。這一點和SHELL層面的快捷方式不同,SHELL層面的快捷方式檔案LNK僅僅是一個指示關係,修改LNK檔案並不影響LNK檔案指向的物件,修改LNK檔案指向的物件也不會影響LNK檔案。

好了,基本知識介紹完了,我們來實際看看Windows目錄裡面對於硬連線的使用情況吧。

經常看到有人抱怨,Windows\WinSxS目錄佔用了太多的空間,裡面經常發現有同名的檔案,而且這些同名的檔案在 Windows\System32 目錄下面也有存在,這是為啥呢?其實這就是硬連線導致的。

Microsoft 實際上在 Windows\WinSxS 目錄和Windows目錄之間建立了硬連線的關係,舉一個最簡單的例子:

對於 Windows 7 RTM 來說,你可以在2個地方找到Ntoskrnl.exe檔案。第一個地方是:Windows\System32\ntoskrnl.exe,另外還有一個地方是Windows\WinSxS\x86_microsoft-windows-os-kernel_31bf3856ad364e35_6.1.7600.16385_none_6c06b7c41576a7d9\ntoskrnl.exe,這就是一個典型的硬連線例子。Microsoft 在檔案系統上面對 ntoskrnl.exe 做了一個硬連線,使得 ntoskrnl.exe 能夠出現在不同的目錄裡面,但是隻佔用了一份 ntoskrnl.exe 的硬碟空間。利用這種機制,有下面的一些好處:

•同樣的檔案,只需要維護硬連線關係,不需要進行多重的拷貝,這樣可以節省硬碟空間

•如果涉及檔案更新,只需要先在WinSxS 目錄裡面下載好一個新版本,然後修改 Windows\System32 下面同名檔案的硬連線關係,從舊版本的硬連線指向新版本的硬連線,這樣就能夠快速的完成檔案的更新工作,而不需要進行檔案的複製,速度也會快不少

•補丁解除安裝也是一樣的,只需要把硬連線指向改為舊版本就可以了,沒有檔案替換的問題。而且建立了硬連線關係的檔案之間的修改是同步的,因此只要有一方被修改了,另一方也會得到修改

說了這麼多,那麼如何知道 Windows 目錄的真實大小呢?Smallfrogs 提供了一個工具,可以很方便的知道您系統裡面有哪些檔案是有硬連線關係的,以及Windows 目錄下真實的檔案大小。

工具可以從 http://www.kztechs.com/hardlink/realwindirsize.zip (請使用右鍵點選另存為...方式下載)或在本文附件下載到,下載解壓縮以後,直接執行就可以開始掃描了。

掃描過程比較漫長,掃描完成以後,會看到下面的提示資訊:

Windows目錄到底佔用了多少真實硬碟空間

另外,在realwindirsize.exe所在目錄下,會生成一份檔名叫做LinkedFile.TXT的檔案,裡面記錄了Windows目錄下各個硬連線的關係。

如上圖所示,我們掃描到了65088個檔案,其中,真實的檔案有48022個,其他17066個檔案都是硬連線檔案。真實的檔案佔用了14981682 KB的硬碟空間,而如果你用資源管理器看Windows目錄的話,那麼會提示說Windows目錄佔用了 18244902 KB的硬碟空間。實際上, Windows\system32 目錄下的大多數檔案都和 WinSxS 目錄建立了硬連線關係。

說了這麼多,最後總結一下吧:

•硬連線,一種基於檔案系統的同一卷裡面的檔案快捷方式

•Windows 目錄下面大量使用了硬連線技術

•Windows\System32 目錄下的大多數檔案,都和 WinSxS 目錄建立了硬連線關係

•要檢查自己系統Windows目錄裡面的硬連線,請自己掃描吧!

OK,本次Windows 7 研究就此完成,請繼續等待下篇吧!