WinSxS
有很多組件組成的文件夾
WinSxS裡面的文件是不可刪除的。
WinSxS下有很多重要的組件,版本也很繁雜,為了保證Windows的正常運行,請確保這些文件一個都不能少。這些文件支撐著mscorwks.dll,沒有它們,mscorwks也無法載入。強行刪除后可能只有以安全模式能勉強進入Windows,Windows也就廢了。
安全的做法是使用系統自帶的釋放磁碟空間工具或使用第三方工具,清除service pack備份。
支持COM和共享DLL的隔離
Windows 系列系統(這裡包括XP、Vista、Win7、win8)在“Windows”目錄下提供了一個名為“WinSxS”(Windows Side-by-Side)的文件夾。系統使用這個文件夾存儲各個版本的Windows組件,減少因為動態鏈接庫(Dynamic Link Libraries,DLL)引起的配置問題(DLL hell)。組件的多個版本都存儲在這個文件夾中。Windows XP允許Win32 API組件和應用程序使用與這些程序在測試時所使用的版本完全一致的Microsoft 組件版本,並且不受其它程序或者操作系統升級的影響。Windows 通過XML文件來實現這一功能,這些XML文件保存了有關應用程序配置的元數據,例如COM類、介面和類型庫。
Windows XP
Windows XP的一個重要革新就是引入了隔離組件(Isolated Components)和並列共享(side-by-side sharing)功能。作為原來Windows中經常出現的DLL衝突問題的解決方案,Microsoft 強烈建議應用程序使用組件隔離和並列共享技術來解決DLL調用的問題。微軟在ComCtl version 6中使用了並列共享處理,證明隔離組件和並列共享是未來Windows的發展方向。
在使用隔離組件和並列共享模式下,一個組件的很多個不同版本被同時安裝在系統中。注意,是"同時"安裝在系統中。在原來的Windows中,系統中一個組件或者是DLL只能有一個版本,因此在安裝應用程序的時候,我們經常看到這樣的對話框:"要安裝的xxxx.dll 比系統中原有的要舊,是覆蓋還是保留?"。這個問題的確不好問答,因為安裝舊的DLL吧,那麼原來使用新的DLL的應用程序可能無法正常運行;如果不安裝,那麼新的應用程序也可能無法正常運行。這真是個兩難的問題。
Windows XP使用隔離組件和並列共享較好地解決了這個問題。由於系統中可以有一個DLL或組件的多個版本同時存在,應用程序在運行的時候可以選擇使用自己在設計或開發的時候經過嚴格測試的組件版本。這樣可以避免應用程序被迫調用不同版本的DLL或組件而可能導致的不可預知的錯誤。
在Windows XP中,隔離組件和並列共享主要是通過程序清單(manifest)來實現的。通過程序清單,一個應用程序完整地定義了自己運行時需要調用的DLL或組件的版本。Windows XP根據程序清單,保證系統中一個應用程序的升級或刪除不會影響到其它的程序需要使用的DLL或組件。所以我們看到,隔離組件和並列共享可以保證系統的安全和應用程序的安全。
(元數據指程序需要的基本的DLL調用、組件支持、介面定義等),例如COM 類、介面定義和DLL庫定義等。清單文件有兩類:應用程序清單文件,用來描述應用程序所需要的所有元數據;裝配清單文件,用來描述單個組件的安裝。
一個應用程序可以在程序清單中明確地指出自己包含的所有程序部件如何安裝在系統中。一個應用程序包含很多基本的元素,例如介面定義、幫助文件、不同版本的組件、系統配置信息等。所有的這些元素,可以根據程序清單分成兩類:公有的和私有的。公有元素可以被計算機上安裝的其他應用程序使用,他們被安裝在Windows XP的WinSxS目錄中。私有元素只能被包含他們的應用程序使用,安裝在應用程序獨有的目錄下。
Windows Vista/7/8
Microsoft 在 Windows Vista/ Windows 7 裡面大量使用了NTFS文檔系統的特性之一的:硬連接(Hard Link)來實現WinSxS機制!
硬相連是NTFS文檔系統特有的屬性之一,在Linux下面,也有類似的機制。硬相連適用於在同一個卷的文檔級別,硬相連是不能跨卷的。
Windows Vista / Windows 7自帶了創建硬相連的命令:mklink.exe,利用這個命令,我們可以給指定的文檔創建硬相連。
常常看到有人抱怨,Windows\WinSxS目錄佔用了太多的空間,裡面常常發現有同名的文檔,而且這些同名的文檔在 Windows\System32 目錄下面也有存在,這是為啥呢?其實這就是硬相連導致的。
Microsoft為啥這麼貧苦搞這個呢?其實如此對系統的穩定性的增加非常有好處。
同樣的文檔,只必要維護硬相連干係,不必要進行多重的拷貝,如此可以節省硬碟空間。
如果涉及文檔更新,只必要先在WinSxS 目錄裡面下載好一個新版本,然後改正 Windows\System32 下面同名文檔的硬相連干係,從舊版本的硬相連指向新版本的硬相連,如此就可以或許快速的完成文檔的更新工作,而不必要進行文檔的複製,速度也會快不少
補丁卸載也是一樣的,只必要把硬相連指向改為舊版本就可以了,沒有文檔替換的問題。而且建立了硬相連干係的文檔之間的改正是同步的,所以只要有一方被改正了,另一方也會得到改正。
![WinSxS](https://i1.twwiki.net/cover/w200/m3/d/m3dbdcc7b78eb22e84ff4ac15bbb785eb.jpg)
WinSxS