NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
查看: 3009|回復: 7

[問題] WinSXS精簡

[複製鏈接]
發表於 2019-1-29 04:13:32 | 顯示全部樓層 |閱讀模式
本帖最後由 makimaki2 於 2019-1-29 04:15 編輯

PE開機容量是越小越好,越省速度越快

之前將sun大的幾年前遺作的10PE增加了.netFramwork包

這包自身就佔了1GB大,用7z level9極致壓縮有250MB

包進MS的Wim增加的大小也差不多是250MB,壓縮率亮眼而且可以mount執行

但是研究一下,整個.net 4.x版的文件中,大約有50-60%的容量是由WinSXS佔去

我試著把WinSXS整個刪去,試了Local emulater這個.net程式倒也正常執行..

查找網路訊息對於一般系統,有人表示在WinSXS用了HardLink刪了會使系統不穩定,

有人表示可以把WinSXS精簡到數十MB,有人說刪了會失去備援保護,

有人說刪了就無法正常移除元件

因為PE與一般系統在維護方式上有本質的不同,這些意見倒也未必能直接套用

不知道各位前輩,對於WinSXS精簡的實務心得與經驗,能否給後輩略為指點
發表於 2019-1-29 05:59:25 | 顯示全部樓層
我覺的如果是你是針對容量大小...其實沒差別
你把 winsxs 完砍了...大概會小一點點

就像 HardLink ... 這是指 硬連結
https://www.techbang.com/posts/1 ... ives-does-not-fashu
要簡單說的話就是... 多個相同的檔案...用同一份儲存磁區
所以砍不砍...對容量來說是沒差別

想想...為毛 win8.1 win10
install.wim 最多才 4G ... 一個系統明面上卻 1x G
然後實際安裝...又只要 8 - 9G
因為 install.wim 如果單純當作 解壓檔 解出來...是要 1x G
但如果是安裝...安裝時 相同檔案 用 HardLink ... 實際上佔用的就少很多
所以砍掉 HardLink 的檔案未必會釋放空間 (除非已經沒有檔案使用該 HardLink)

這和 WIM 一個檔案 只存一份 類似
.net Framwork 如果在 正常硬碟 Win 下安裝...是否用 HardLink 不清楚
如果沒用那 相關 .net Framwork 的 WinSxs 可能會佔比較多容量
反之有用就不會多佔容量

但對 PE 來說... 壓成 Wim ... 相同檔案只存一份的情況下...本身就不會多佔容量
所以針對容量...要考量的是...用不到的 WinSxs

WinSxs 簡單的說就是 windows 會用到的系統檔...(大多是 windows\system32 中的檔案)
但是 win update 更新 或是 安裝某些軟體
都可能會對 Win 新增系統元件
由其是 win update ...
例如...某個 dll ... 原本是 1.00 版
system32 和 winsxs 都有一份
DLL 更新升到 1.01 版
system32 中的換成了 1.01 ... 但 WinSxs 中卻是有 1.00 1.01 各一份

那如果想要能 移除更新 ... 也就是 1.01 變成 1.00
那當然要保留 1.00 的檔案才行
反之如果用不到...是可以把 WinSxs 中 1.00 的砍了

Win 的系統元件...來就就是 使用中(system32) 和 WinSxs 各一份
有問題是也可以還原或修復
如果砍了 WinSxs ... Win 當然還是可以跑

但 Win 本身管理元件就是這樣在管理...
例如 某個軟體 ... 在安裝時會安裝某些元件...
那移除軟體時...合理的是一併移除所安裝的元件 ( system32 和 WinSxs )
如果砍了 WinSxs ... 可能會讓 Win 或 軟體 以為沒這個元件了
反而會 移除不乾淨 或是 移除時出錯 或 不能移除
這和上面說的 dll 1.00 1.01  ... 也差不多一個意思

所以就算要精簡...還是用 Windows 本身的管理方式 ( Windows 是可以用 Dism )

對正常系統 或 PE...如果沒移除Win更新的打算...
精簡掉沒在用的 WinSxs (指 Win 正在使用的元件並不是該 WinSxs 的版本)
是沒差...也的確能釋放空間
但對有在用 WinSxs ... 不管有沒有 HardLink 是都不建議砍
而且對 PE 來說解壓 WIM ...實際同檔只存一份...對容量基本上沒影響

所以針對容量來說...更多是要清掉垃圾資料
例如在 Win更新 , 安裝軟體 , 安裝元件 時...產生的 暫存檔 快取  或 非必要資料  (例如 記錄檔)

老實說...說一堆...
其實你用 Dism++ 把 PE Wim 掛起來...
然後用它的清理功能就差不多了...
你 WinSxs 就算全砍了...也不會小到哪裡
清理掉垃圾資料和用不到的WinSxs 就可以了
 樓主| 發表於 2019-1-30 18:10:19 | 顯示全部樓層
本帖最後由 makimaki2 於 2019-1-30 18:11 編輯

對於Hard Link我試過在一般Copy時,不會複製Hard Link,會直接複製檔案
使用特別的同步軟體則可以複製Hard Link自身

換言之,我的看法是 只需要 對離線文件 Copy一次就可以破棄 Hard Link的依賴

而我們在進行 匯出差分文件時,就有一次copy動作,
我的看法是 這個copy使得 Hard Link的依賴  破棄

因此 對於差分文件的Winsxs可以不考慮Hard Link

另外我認為PE的維護方式本來就特殊,不需要備援保護,
也沒有移除元件,或是昇級版本的問題

因此 我個人的結論是,對於差分文件的製作方式,於PE的應用上
WinSXS直接砍掉就對了

實際還是要在實際條件下公測,看看用戶端回應就是了...
發表於 2019-1-31 11:41:21 | 顯示全部樓層
本帖最後由 阿達金田一 於 2019-1-31 11:43 編輯
makimaki2 發表於 2019-1-30 18:10
對於Hard Link我試過在一般Copy時,不會複製Hard Link,會直接複製檔案
使用特別的同步軟體則可以複製Hard Li ...

HardLink 本來就是直指 叢集(磁區) ...
這是底層 檔案系統 在處理的
例如
有一個 檔案...編號 1234 指定了使用哪些 叢集 例如 叢集 1 2 3
c:\1.txt 使用 編號 12345678 這個 HardLink ...
c:\2.txt 也使用 編號 12345678 這個 HardLink ...
當修改1.txt 時...修改叢集 1 2 3 中的 磁區資料
這等同修改 2.txt 因為 2.txt 也是用同一個 HardLink (編號1234 檔案)

copy 是把 來源 寫入一份到 目標
例如 copy 1.txt 3.txt ...
是把 1.txt 的資料...複制一份到 另一個 檔案 3.txt
如果 目標檔案 3.txt 不存在...會建立一個新的 檔案
不管存不存在...另一個檔案都是另一個 HardLink (除非2個檔案都用同一個 HardLink)
例如
3.txt 用的是 編號 2345 的檔案 (HardLink) 叢集 4 5 6
若是 3.txt 是不存在的...
所以另建立一個新檔 編號 3456 (HardLink) 叢集 7 8 9

HardLink 只能在同一個檔案系統(FS)下做
簡單說...能 HardLink 的 FS
檔案不是 1.txt ... 直接直指使用哪些叢集磁區
而是 HardLink(檔案編號 xxxx) ... 使用哪些叢集磁區
然後 FS 的檔案表...指向 HardLink
所以...不同的路徑的檔案...可以同時指向同一個 HardLink
同樣的檔案靠 HardLink 可以只存一份
因為是底層的 FS 管理...所以 HardLink 無法跨磁碟

而 PE WIM 本來儲存也是只存一份...這和 HardLink 無關
所以對 PE 來說 WinSxs 砍不砍沒什麼差 ...除非你 PE 不是做成 WIM

HardLink 想玩的話用 mklink 這個指令就可以 (加參數 /h)
例如
echo 123>1.txt
mklink /h 2.txt 1.txt
echo 456>2.txt
然後 type 1.txt 時...會是 456
del 2.txt 砍掉 2.txt 不會影響 1.txt ... 反之亦同
概念流程
1.txt -> FileID_1234 HardLink -> 叢集磁區 1 2 3
mklink /h 2.txt 1.txt 其實是算 複制 HardLink ... 不是 copy 叢集磁區 1 2 3 中的資料
2.txt ->  FileID_1234 HardLink -> 叢集磁區 1 2 3
砍掉 1.txt 時不會影 ...因為 2.txt 還是指向 HardLink
2.txt ->  FileID_1234 HardLink -> 叢集磁區 1 2 3

修改檔案內容時...最終是寫入  叢集磁區
所以修改 1.txt 時...並不是修改 2.txt 是修改 HardLink -> 叢集磁區
只是 2.txt HardLink 是同一個 ... 所以等於 2.txt 也修改

另外還有 SoftLink ( mklink 不加 /h 就是了)
這是把 檔案 指向 檔案 ... 而不是指向 HardLink
例如
mklink 2.txt 1.txt
這是把 2.txt 指向 1.txt
2.txt -> 1.txt -> hardlink -> 叢集磁區 1 2 3
修改 2.txt 時...其實是改 1.txt 然後
改 1.txt 是改 hardlink -> 叢集磁區 1 2 3
這時...如果砍了 1.txt
2.txt 就找不到指向的 1.txt

同樣的指令...把 /h 拿掉
echo 123>1.txt
mklink 2.txt 1.txt
echo 456>2.txt
這樣寫入 2.txt 其實是寫入 1.txt
del 1.txt ...
type 2.txt 就會出錯

但 SoftLink 因為是指向檔案...所以可以跨磁碟
發表於 2019-1-31 11:54:08 | 顯示全部樓層
本帖最後由 阿達金田一 於 2019-1-31 12:06 編輯

在說的簡單點
也就是你 PE0 PE1 你做分差取出 .net framework 相關
這時你分差是先存到 硬碟 而且是用 copy
那所有檔案都是使用各自的 HardLink 不共用...容量最大
先假設同檔有 40% 左右 ... 然後全部 1G
那就是 200M 無同檔 + 400M 同檔 ... 有 HardLink 的話...只要 600M

然後你 做成 WIM 時...WIM 本身就同檔存一份 ...
所以 WIM 的中的檔案其實只有 200+400M 然後壓縮...
然後如果把 wim 解出來到硬碟...
用 imagex 或 wimlib-imagex ... 應該會做 HardLink ... 所以容量可能只佔 600M
(這就和 install.wim 1xG ...解出來占用只要 8-9G 一樣)


然後不管是否 HardLink ... PE 是 WIM ...又不是用 HardLink
所以砍 WinSxs 對 硬碟 有差...因為沒 HardLink 時...容量佔比較多
但對 PE 沒什差...只要把 無同檔 的 WinSxs 砍了就可以
WinSxs 無同檔...就表示該 WinSxs 沒在用...
所以 Dism++就可以砍那些 WinSxs 了
因為你是搞 .net framework 不是 win update 所以...這部份的 無同檔 WinSxs 應該不多

這個要試其實先簡單...
你不砍 Winsxs 先做一份 WIM
(無聊可以 Dism++ 砍了用不到的 Winsxs 在做一份)
然後砍了WinSxs 在做一份不就知道
然後比較一下容量大小
 樓主| 發表於 2019-1-31 13:06:18 | 顯示全部樓層
文件系統就是將 二進制數據球如 光碟,HDD,ISO,WIM,VHD,Database 對應為 想像中的 文件夾目錄樹圖標

簡單講HardLink就是給這個 二進制數據球 創造第2個 文件圖標



砍掉Winsxs之後,.net4.X 包進WIM容量剩130MB

目前試過的.net程式有 Local Emulater,MS的線上安裝程式...

我這邊用的PE是幾年前的舊版,不過我想.net Framework應該是本身獨立的,版本影響應該不大,未必非1809不可

後面會拿出來公測...
發表於 2019-1-31 17:03:16 | 顯示全部樓層
砍了 WinSxs 如果 WIM 容量差很大...
那表示那些是不同的檔案 (指 system32 和 winsxs)
那可能就那些都是 一檔多版本 ...
可是可以砍...但是...如果某些軟體...要針對用舊版本...就有可能有相容問題
當然覺大部份情況下新版都可以相容舊版
發表於 2019-2-6 08:43:16 | 顯示全部樓層
我都是使用微軟的 Dism 掛接 WIM 檔,
部署映像服務與管理,
來增加磁碟陣列驅動程式,
當WIM檔的某些WinSxS缺少時,
執行Dism就會出現錯誤訊息,造成無法使用Dism。
(例如WIN8PE的WIM缺少
WinSxS\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_6.2.9200.16384_none_622908ad510eb05b\CbsCore.dll
WinSxS\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_6.2.9200.16384_none_622908ad510eb05b\DrUpdate.dll
WinSxS\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_6.2.9200.16384_none_622908ad510eb05b\drvstore.dll
WinSxS\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_6.2.9200.16384_none_622908ad510eb05b\PkgMgr.exe)
您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

小黑屋|手機版|NoName Team 電腦資訊討論區 |網站地圖

GMT+8, 2024-12-26 17:59 , Processed in 0.153354 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表