Folder WinSxS – dlaczego jest taki wielki?

Temat przypomniał mi się po pewnej konferencji, kiedy podczas którejś z sesji padło z sali pytanie (chyba trochę retoryczne) o folder WinSxS (zarówno w Windows Vista jak i Windows 7).

Wtedy nie ja prowadziłem sesję i nie bardzo był też czas, żeby odpowiedzieć na to pytanie ot tak z sali.

Ale problem zapisałem jako “do opisania na blogu” i postanowiłem dziś parę słów na ten temat napisać.

Co to jest folder WinSXS?

Ciekaw jestem ile osób podniesie teraz rękę na pytanie “Kto wie co to jest folder WinSXS, gdzie się znajduje i dlaczego jest o niego tyle krzyku?

Otóż folder WinSXS znajduje się na dysku twardym komputera z zainstalowaną Windows Vista i Windows 7 w lokalizacji domyślnej: C:\Windows\WinSXS\ (lub poprawniej %systemroot%\WinSxS\).

W folderze tym przechowywane są m.in. kopie wszystkich zainstalowanych poprawek, ale również a może przede wszystkim wiele elementów / komponentów systemu operacyjnego.

Dlaczego jest taki “duży”?

Jeśli nie słyszeliście o tym katalogu to proponuję zajrzeć teraz tam i sprawdzić jaką ma wielkość. Pewnie się zdziwicie, że jest on naprawdę duży! Ale dlaczego?

Tu wyjaśnienia wymagają dwa elementy, których słowa kluczowe to: komponentyzacja i hardlinki.

Od Windows Vista i Windows Server 2008 zmienił się sposób sposób przechowywania informacji o elementach systemu.

Komponenty – a cóż to jest?

Teraz wszystko z czego się składa system operacyjny zapakowano do komponentów. W nich zawarte są binaria, pliki dodatkowe, informacje o instalacji, powiązane klucze rejestru oraz informacje o określonych uprawnieniach jakie komponenty powinny mieć.

Komponenty takie są wrzucane do folderu właśnie WinSxS już w trakcie instalacji systemu. Dlatego nawet po świeżej instalacji folder ten jest duży (u mnie ma teraz 6 GB).

Komponenty są później wykorzystywane w wielu miejscach systemu.

Na przykład przy doinstalowaniu jakiegoś elementu systemu (którego nie było zainstalowanego jeszcze) pliki są wyciągane właśnie z tego katalogu – dlatego też już nie zobaczycie okienek proszących Was o włożenie płyty instalacyjnej Windows 7 w celu dogrania brakujących elementów.

Ale nawet już po zainstalowaniu może się zdarzyć, że teoretycznie dany komponent potrzebny jest w 3 miejscach na dysku (z różnych powodów).

Żeby nie kopiować plików 3x stworzony został (wreszcie, bo niektóre systemy już to miały) system hardlinków.

Hardlink to wskaźnik w systemie, który wskazuje nam pewien określony, istniejący już w systemie plik.

Jeśli taki hardlink stworzymy - to system będzie myślał, że mamy w tym konkretnym miejscu plik.

Kliknięcie prawym przyciskiem pokaże nam jego właściwości (m.in. rozmiar) dokładnie tak jakby to był plik fizyczny. I to mimo tego, że on istnieje w zupełnie innym miejscu (np. w katalogu WinSxS).

Dla systemu nie będzie różnicy czy to jest fizyczny plik czy tylko wskaźnik do niego.

Stąd bierze się problem liczenia objętości plików w katalogu gdzie są hardlinki. Bo system widzi je jako prawdziwe pliki, więc sumuje ich objętość i pokazuje nam wartość większą niż jest w rzeczywistości.

Przykład

Najlepiej będzie jak pokaże Wam ideę hardlinków oraz sposobu liczenia zajętości miejsca na przykładzie.

Zaczynamy od pustego folderu:

image 

Teraz na potrzeby przykładu potrzebujemy dużego pliku. Mamy do tego bardzo przyjemną opcję w fsutil.

W moim wypadku: fsutil file createnew plik.dat 100000000

image

Wystarczy jedno polecenie i mamy gotowy plik plik.dat o określonej wielkości (tu miało być ok. 100 MB):

image

Teraz ważna rzecz – zwróćcie uwagę na liczby na powyższym obrazku. Jeden plik w katalogu zajmuje teraz 100 000 000 bajtów. A na dysku pozostało nam 4 618 256 384 bajtów wolnego miejsca.

Tworzymy teraz hardlinki – czyli robimy 5 plików, które dowiązujemy do pliku źródłowego:

image

Teraz zobaczcie jak to wygląda na obrazku poniżej:

image

Mamy 6 plików i każdy teoretycznie ma ok. 100 MB. System raportuje nam, że mamy w tym katalogu 6 plików o łącznej objętości ok. 600 MB.

Ale co ciekawe parametr “bytes free” praktycznie nam się nie zmienił. I nie jest to błąd!

Do czego więc są te hardlinki?

Pewnie to jest pierwsze pytanie jakie przychodzi Wam do głowy. A odpowiedź jest prosta choć może być paradoskalna. Otóż chodzi o zaoszczędzenie miejsca.

Jeśli mamy jakieś pliki, które potrzebujemy użyć w różnych miejscach dysku/systemu to hardlinki są tu idealne.

I tak dla przykładu – w zasadzie większość elementów w katalogu C:\Windows\System32 (czy generalnie %systemroot%\System32) to tak naprawdę hardlinki do plików, które znajdują się w… folderze WinSxS!

Co za tym idzie jak badacie wielkość katalogu %systemroot% to właściwie powinniście spokojnie odjąć sobie cała wielkość katalogu System32, który jest w dużej mierze hardlinkowany do WinSxS.

Informacyjnie jeszcze Wam powiem, że istnieje oczywiście coś takiego jak pliki .lnk (pliki skrótów / shortcuts) czy linki symboliczne. Ale aby z nich można było korzystać to aplikacje muszą być tego świadome, a nie zawsze są. W wypadku hardlinków one nawet nie wiedzą że korzystają ze skrótu, bo nawet system nie jest tego do końca świadomy.

No to tyle z serii - pytań jakie czasami dostaję przy różnych okazjach.

Po więcej szczegółów na temat folderu WinSxS odsyłam do dosyć starego (ale aktualnego) wpisu na blogu Ask the Core Team.