2024-07-18

WinSxS, sfc ve dism

Uzun dönem Windows kullanıcıları, sistem klasörlerinin (genellikle C:\Windows) altında WinSxS adında bir klasörün olduğunu görmüşlerdir. Bu klasör korunan ve içeriği administrator ile bile değiştirilemeyen bir yapıya sahiptir. Kurulumdaki bütün sistem dosyalarının asılları bu klasörün altındadır. Kullanımdaki kopyası ise aslında bir kopya değil, dosyanın aslına bir harlink'tir. Örnek olarak explorer.exe'ye bakalım.

C:\> dir C:\Windows\explorer.exe | fl FullName, LinkType, Target

FullName : C:\Windows\explorer.exe
LinkType : HardLink
Target   : {C:\Windows\WinSxS\amd64_microsoft-windows-explorer...

Bu klasördeki bütün dosyaları görmek için

dir * -file | ft Name, LinkType

kullanabiliriz. Evet, bu güvenlik önlemlerine karşı kötü niyetli yazılımların da karşı yöntemleri var. Herşeye rağmen hardlink bozulabilir, sistem dosyası kötü bir kopya ile değiştirilebilr. Hatta WinSxS klasörü altındaki dosya bile değiştirilebilir. Sistemimizde beklenmeyen bir durum olduğunda her kaynakta ilk yapılması gereken

sfc /scannow

olarak önerilmiş. Arka planda bu komut, sistem dosyalarını tarar, bütünlüğünü, denetler ve güvenilir bir katalogdaki özelliklere (imza, hash vs) sahip olup olmadığını kontrol eder. Ayrıca hardlink'inin doğru olup olmadığına da bakar. Sonra eğer burada bir sorun algılarsa WinSxS altındaki doğru dosyaya olan hardlink'i tekrar oluşturarak onarmaya çalışır. WinSxS altında bir dosyanın birden fazla sürümü olabilir. Bütün sürümler yinw WinSxS klasöründe saklanır. O yüzden en son güncelleme ile gelen sürüme hardlink oluşturulması önemli.

WinSxS klasöründe bir bozulma olmuşsa sfc bu aşamada yetersiz kalır. Bu bozulmayı onarmak için kullanılacak araç dism. Dism'in kafa karıştıran 3 farklı komutu var:

  • CheckHealth
  • ScanHealth
  • RestoreHealth

Bu 3 komutu, bir disk taramasındaki işlemlere benzeterek açıklamaya çalışacağım.

Diskimizde bir sorun olduğunu anlamak için bir tarama yapmak istiyoruz. Ama hızlı olmasını istiyoruz. Bütün diski taramak çok zaman ve enerji alan bir işlem. Aslında diskte işlem yaparken hata ile karşılaşan bir program var mı diye baksak olmaz mı? Bunun için önce evenlog'a bakıyoruz, herhangi bir program buraya disk ile ilgili hata olayı yazmış mı diye. Bu CheckHealth'a karşılık gelen bir işlem. Bütün WinSxS klasöründeki dosyaları taramak da çok zaman ve enerji alan bir işlem olduğu için kaydı düşülen bir sorun var mı, ona bakıyoruz. Bu işlemde bir düzeltme işlemi uygulanmıyor. Örnek kullanım:

DISM /Online /Cleanup-Image /CheckHealth

İkinci komut ScanHealth, daha çok diskte bir düzeltme işlemi yapmadan taramaya benziyor. Sistem açıkken diskte onarım yapmak istemiyorsak, sadece hata var mı yok mu bize onu söylesin diyorsak bu işlem uygulanabilir. Yine bu adımda da diskte bir düzeltme yapılmayacak. Örnek kullanım:

DISM /Online /Cleanup-Image /ScanHealth

Üçüncü komut RestoreHealth ise aktif olarak diskte hataları bul ve düzelt komutu gibi. Bütün WinSxS klasörü taranır, bulunan hatalar (ISO dosyasından veya internetten) bozulmamış kopyalar kullanılarak düzeltilir. Örnek kullanım:

DISM /Online /Cleanup-Image /RestoreHealth

Dism, bunun yanı sıra açık olan Windows kurulumu üzerinde de işlem yapabilir, DVD veya USB'den boot edilerek disklerden birindeki kurulum üzerinde de çalışabilir. /ONLINE anahtarı şu an çalışan sistem üzerinde işlem yapılmasını söylüyor.

Dism'in bunun dışında çok güzel kullanımları var. Örneğin WinSxS klasörümüzün boyutu çok büyüdüyse ve eski  sürümlere ait dosyaları silmek istersek (kesinlikle elle yapılmaması gereken bir işlem) aşağıdaki komut kullanılabilir.

Önce mevcut WinSxS (component store - Windows Side-by-side) boyutunu kontrol edelim:

C:\> dism /online /cleanup-image /analyzecomponentstore

Deployment Image Servicing and Management tool
Version: 10.0.22621.2792

Image Version: 10.0.22631.3880

[===========================99.6%========================= ]

Component Store (WinSxS) information:

Windows Explorer Reported Size of Component Store : 14.29 GB

Actual Size of Component Store : 13.35 GB

    Shared with Windows : 7.30 GB
    Backups and Disabled Features : 6.05 GB
    Cache and Temporary Data :  0 bytes

Date of Last Cleanup : 2024-07-15 12:24:43

Number of Reclaimable Packages : 3
Component Store Cleanup Recommended : Yes

The operation completed successfully.

Eski ve kullanılmayan (superseded) sürümleri silelim

Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase

Bu komut sonrasında da kurulmuş güncellemerin kaldırılması imkansız hale gelir. Görece daha "hafif" bir temizlik için /ResetBase olmadan kullanabiliriz.

Bir service pack ile eski duruma düşmüş dosyaları silmek için (service pack'in kaldırılmasını imkansız hale getirir)

Dism.exe /online /Cleanup-Image /SPSuperseded

RestoreHealth, hasarlı dosyaları Windows Update ya da WSUS sunucularından edinmeye çalışır. Bu yol herhangi bir sebeple işlemiyorsa (internet bağlantısı olmayan bir sistem) mevcut işletim sisteminin sürümüne uyan bir kurulum ortamına ihtiyaç var. Örneğin yeni ISO dosyasını indirdik ve onu da F: sürücüsü olarak sisteme bağladığımızı varsayalım. Bu sürücü içinde \Sources adında bir klasörün altında install.wim dosyası (büyük boyutlu bir dosya) olur. Bu dosyayı bizim işletim sistemimizin sürümüne uygun bir endeksle kullanmamız gerek. Önce hangi endeksi kullanacağımızı bulalım.

dism /get-wiminfo /wimfile:F:\sources\install.wim

Benim durumum için Windows 11 Pro install.wim dosyasının 4. sırasında (endeks) yer alıyordu.

dism /online /cleanup-image /restorehealth /source:WIM:F:\sources\install.wim:4 /limitaccess

Hala çalışan bir sistemi onardığımız için /online, hiçbir durumda internete çıkmaması için ise /limitaccess kullandım. Eğer kurulum ortamında wim dosyası yerine esd uzantılı bir dosya varsa /Source:ESD:F:\sources\setup.esd:4 gibi bir değişiklik yapmak gerek.

Açılmayan (örneğin Windows update sırasında kapatılmış) bir sistemi PE veya kurtarma konsolunda onarmak için önce recovery mode ile açıp, ya da kurulum ortamı ile açıktan sonra F10'a basarak onarma ortamına girmek gerek. Bu aşamada C: sürücümüz artık aynı harf atamasına sahip olmayabilir. Uygun yöntemlerle (diskpart, list volume gibi) önce disk sürücümüzü tespit etmemiz gerek. Eski sistem sürücümüzün D: olduğunu varsayalım. Bu ortamda /online'ın yerini /Image:D:\ alacak.

dism /Image:D:\ /Cleanup-Image /RestoreHealth /Source:WIM:D:\sources\install.wim:1 /ScratchDir:D:\Windows\Temp /LimitAccess 

Bu komut ile büyük bir wim dosyasından gereken dosyaları çıkartacağımız için, o büyük dosyanın açılacağı bir alana ihtiyaç var. Disklerimizin içinde yeterli boyuta sahip (mümkünse hızlı) bir disk içinde geçici dosyaların tutulacağı bir alanı da /ScratchDir ile veriyoruz. Bu adımın hatasız sonlandığını varsayarsak, henüz sadece WinSxS klasörü onarıldı. Asıl kopyalar hala bozuk olabilir. Bu sebeple bir tane daha sfc komutu ile bunları kontrol etmek gerek. Burada /offbootdir aslında boot drive (Windows'un yüklü olduğu sürücü), /offwindir ise Windows'un klasörünü göstermeli.

sfc /scannow /offbootdir=D:\ /offwindir=D:\Windows

dism'in kullanımına benzer olarak Powershell'in de Repair-WindowsImage cmdlet'i var, aşağıdaki gibi kullanımı mümkün:

Repair-WindowsImage -Online -CheckHealth
Repair-WindowsImage -Online -ScanHealth
Repair-WindowsImage -Online -RestoreHealth

Bir sistemde kurulu olan güncellemeleri listelemek için

dism /online /Get-Packages /Format:Table

Şu an açık olan sistemde bunu elde etmenin başka yolları da var. Ama DVD veya USB'den açılmış sistem üzerinde aynısını yapabilmek için

dism /image:D:\ /Get-Packages /Format:Table

Burada /image:D:\ Windows'un bulunduğu sürücüyü göstermeli.

Bazen de yeni kurulan bir güncelleştirme sistemi açılamaz hale getirir. Bu durumda yine sistemi PE/recovery ortamında açarak yukarıdaki yöntemlerle en son yüklenen güncelleştirme bulunabilir ve aşağıdaki komut ile kaldırılabilir.

dism /Image:D:\ /Remove-Package /PackageName:Package_for_RollupFix~31bf3856ad364e35~amd64~~22621.2428.1.0 /ScratchDir:D:\Windows\Temp

Burada /PackageName parametresinden sonra verilen güncelletirme ID'si, /Get-Packages ile edinilen verinin Package Identity alanından alındı. Yine /ScratchDir geçici dosyalar için önemli.

Bu adımdan sonra bile bazen açılmayan bir sistem olabilir, askıda kalan (pending actions, stuck installations) bir işlem olduğundan şikayet ederek. Bu durumda aşağıdaki komut işe yarayabilir.

dism /Image:D:\ /Cleanup-Image /RevertPendingActions

Karşılaşılan sorunlar ile ilgili şu videoya bakılabilir.

Hiç yorum yok: