Windows操作系統作為優秀的操作系統,由開發操作系統的微軟公司控制接口和設計,公開標準,因此,有大量商業公司在該操作系統上開發商業軟件。 有朋友問到 windows\installer 這個目錄下的內容為什么占用如此多的硬盤空間,以及是否可以刪除的問題,搜索到這篇文章,感覺不錯,于是簡單翻譯了一下發在這里,希望對大家有所幫助。 Windows Installer 是一個執行事務型(Transactional)安裝的引擎。當首次安裝一個產品時,被安裝的文件中基本很少已經存在于計算機中,甚至可能完全沒有。但當升級或修補某一產品時,則主要是對這些文件進行替換,因此就必須將原始副本保存起來,以便在萬一遇到錯誤時安裝程序可以進行回滾。下文介紹了 Windows Installer 為什么需要這么多磁盤空間,以及相關文件都在哪里。 提取出的文件 由于多種原因,可能會需要引導程序(Bootstrap application)。引導程序可能會將安裝文件壓縮到引導程序本身內部,或者連同安裝程序一起包含在一個自解壓存檔中。引導程序可能還需要直接從網站下載文件到磁盤上某個位置,或間接訪問互聯網上的文件緩存。 該位置通常位于 %TEMP%。 如果提取程序未將這些文件刪除,在安裝結束后您可以自行刪除這些文件。然而要注意,某些安裝程序可能會將這些文件注冊為源緩存(Source cache)。如果源緩存被刪除,但由于某種原因需要提供源內容,Windows Installer 可能會要求提供原始安裝文件,或直接導致產品安裝失敗。 ? 臨時本地緩存 如果程序包中包含了完整用戶界面,并且該界面會被顯示出來,Windows Installer 就會在用戶的 %TEMP% 目錄下創建 .msi 或 .msp 文件的副本。如果這種安裝 – 即客戶端安裝 – 被提升了權限,則 %TEMP% 將使用進行驗證與授權進行安裝的用戶的對應位置。在 UI 階段內,Windows Installer 使用該副本計算初始磁盤空間需求,直到開始生成安裝腳本。 該副本是其他任何可能被提取到本地硬盤上的臨時副本的補充。也就是說,使用 msiexec.exe 或Windows Installer API 調用所引用的程序包會被使用 Windows Installer 生成的文件名復制到 %TEMP%,哪怕源副本已經存在于 %TEMP%中。 該位置位于 %TEMP%。 如果 Windows Installer 沒有刪除這些文件,在安裝結束后您可以自行將其刪除。 程序包緩存副本 無論是否顯示用戶界面,安裝工作的主要部分 – 也是唯一試圖修改計算機狀態的這一部分 – 都需要作為服務運行。此時,程序包 – 無論是從任何嵌入的文件中提取出的 .msi 文件,或整個 .msp 文件 – 都會復制到位于 %WINDIR%\Installer 下的 Windows Installer 緩存中。如果安裝操作成功完成,該文件依然會保存在這個位置中,這是為了方便以后的維護性安裝,包括卸載產品時使用。補丁程序包將會被完整緩存,這也是為了將所有更新過的文件保存起來,方便以后進行任何維護性安裝,例如修復或安裝后續補丁。 該位置位于 %WINDIR%\Installer。 這些文件不能刪除,否則以后針對產品進行的維護性安裝 – 甚至包括產品的卸載 – 都有可能失敗。 安裝腳本 Windows Installer 的安裝有兩個主要階段:生成安裝腳本,然后執行安裝腳本。但因為 Windows Installer 是一種事務型安裝引擎,因此除非使用 DISABLEROLLBACK屬性或DisableRollback 系統策略禁用了回滾功能,否則還會生成用于對安裝操作進行回滾的第二個腳本。 這些腳本包含了 Windows Installer 將在執行腳本時所要進行的全部操作。 回滾腳本實際上就是這些操作逆向排列后的產物。這些腳本可能會變得相當大,通常這主要取決于產品本身的整體大小。作為一項優化機制,Windows Installer 通常不會重復文件系統目錄和注冊表鍵,相反這種情況會分別調用 SetTargetFolder 或 RegOpenKey 操作,這些操作決定了后續的文件或注冊表值操作的范圍。此外還可以通過安排自定義操作執行類似工作,這樣也可以減小磁盤空間需求。 這些腳本會創建到 C:\Config.Msi,其中 C: 是具有最多可用磁盤空間的本地驅動器,但并不一定是系統盤本身。 這些腳本絕對不能刪除。當安裝完成后,Windows Installer 會將其全部刪除,就算安裝操作需要重啟動多次也會刪除。 目標文件、注冊表值,以及其他預留的空間 在執行安裝腳本時,如果這些資源要復制任何文件,或許該任何注冊表值,都將需要占用一定的硬盤空間。在執行 CostFinalize 操作時,Windows Installer 會計算所需硬盤空間的總量。 這些資源會位于提權用戶,或最終用戶所選的目標位置。 這些資源不能刪除;因為這些資源就是所要安裝的產品,刪除可能導致產品無法啟動,或無法正常運行。如果任何資源被刪除,您可以使用控制面板中的添加或刪除應用程序功能進行修復。 用于回滾的文件副本 因為 Windows Installer 是一種事務型安裝引擎,因此如果現有文件將被覆蓋,Windows Installer 會對這些文件創建副本。這些文件會與安裝腳本一起,創建到一個臨時目錄中。這些文件并未被壓縮,所需存儲空間與這些文件被更新前占用的空間一樣大。回滾文件更主要是在對產品安裝補丁時創建,但并不僅限于安裝補丁時。任何產品還可以為其他產品升級文件,這種做法可以通過共享組件的方式進行。 這些資源會被復制到 C:\Config.Msi,其中 C: 是具有最多可用磁盤空間的本地驅動器,但并不一定是系統盤本身。 這些文件不應刪除。當安裝完成后,Windows Installer 會將其全部刪除,就算安裝操作需要重啟動多次也會刪除。 用于補丁安裝和刪除的基準(Baseline)緩存 Windows Installer 3.0開始支持補丁的卸載操作,為了提供更穩妥的體驗,可以為現有文件應用二進制增量(Delta),而無需考慮現有文件可能所處的每個可能的狀態。也就是說,如果某個補丁是為了給 foo.dll 應用二進制增量,將 foo.dll v1更新為 foo.dll v2,那么補丁還需要針對安裝其他產品后可能更新到 foo.dll v3狀態這種情況做出一定的準備,否則安裝操作將會失敗。 為了讓這些功能都盡可能可用,Windows Installer 會將要更新的文件復制到 %WINDIR%\Installer\$PatchCache$ 下每個產品所對應的基準緩存中。大部分情況下,當任何一個版本的文件被首次替換時,這個文件至少會存在兩個副本,因為 Windows Installer 會對原始(RTM)版本的文件保留一個副本,并為最近一次小型升級(通常是指“Service Pack”)的更新保存一個副本。 由于 Windows Installer 只將需要更新且將會被覆蓋的文件復制到基準緩存中,因此某個文件的基準緩存可能只存在于一個產品中,哪怕更新操作是由針對多個已安裝產品所安裝的補丁進行更新的。因此在某些產品需要進行更新時,這樣的設計可能會導致要求提供原始介質。Windows Installer 4.5 提供了一個功能可以解決該問題,這個功能會將共享的文件復制到所有安裝了該文件的產品的基準緩存中 – 因此硬盤空間消耗還將進一步增加。這種做法改善了服務(Servicing)操作,但代價是占用額外的硬盤空間。 這些文件以每個產品為基礎,位于 %WINDIR%\Installer\$PatchCache$。 這些文件可以刪除,或使用 MaxPatchCacheSize 策略禁用基準緩存,但如果這樣做,當需要卸載某一補丁,或者需要還原丟失的文件時,如果程序可以顯示用戶界面,您會被要求提供源文件,否則安裝工作會直接失敗。 ========這是分割線===== 在我個人的觀點來看,這里的內容最好不要亂動,雖然需要占據一定的硬盤空間,但換回的是更好的可靠性,以及后續更方便的使用。 然而確實在某些情況下,由于一些程序安裝出錯或其他原因,可能會產生一定的冗余文件,這種文件完全沒什么用,因此可以刪除。但也絕對不建議使用手工方式刪除。 Windows操作系統對硬件支持良好。 |
溫馨提示:喜歡本站的話,請收藏一下本站!