Dowiązania symboliczne w Windows
28.08.2016 | aktual.: 20.03.2019 18:25
Dowiązania twarde i miękkie - funkcja w systemach *nix (ln ) istniejąca praktycznie od zawsze a traktowana po macoszemu w Windowsach. NTFS, archaiczno-prehistoryczny system plików, nie ma problemów z obsługą tej funkcji od czasów Windowsa 2000. Wpis ten ma na celu przekazanie podstaw pracy z dowiązaniami, oraz przykład ich użycia w systemach z rodziny Windows.
Dowiązania - od mklink (CMD) po Powershell i GUI
Czasem nawet nie zdajemy sobie sprawy, że dowiązania są używane zaraz po zainstalowaniu świeżego systemu. Tu przykład z katalogu głównego (Windows 10):
Jeszcze więcej (JUNCTION) jest w katalogu dowomym użytkownika (C:\Users\%username%):
No ale może po kolei...
Skróty w Windows
W Windowsie na co dzień korzysta się ze skrótów. Utwórzmy dwa foldery - najlepiej na innych dyskach, lub partycjach. W poniższym przykładzie będzie to C:\DOBREPROGRAMY, oraz G:\PLIKI:
mkdir C:\DOBPREPROGRAMY mkdir G:\PLIKI
W katalogu G:\PLIKI należy umieścić dowolny plik, np. dokument tekstowy:
Teraz w C:\DOBREPROGRAMY\ tworzymy skrót (bez żadnej magii: przeciągamy prawym klawiszem myszy z opcją "Utwórz Skrót"):
Skrót (można go utworzyć zarówno dla pliku, jak i katalogu) jest informacją o lokalizacji pliku w systemie plików:
Zróbmy teraz to samo ze skrótem do katalogu:
W obu przypadkach wszystko działa po podwójnym kliknięciu w skrót: jesteśmy automagicznie przenoszeni na dysk G:\ do odpowiedniego katalogu, lub pliku. Jak jednak widać, nie można na tych skrótach wykonywać bezpośrednich akcji na dowiązanych obiektach: edycji dokumentu tekstowego, czy przechodzenia do katalogu.
Co jednak, gdybyśmy chcieli skorzystać z Linuksowej zasady działania "ln"?
Intepreter Windows (CMD) - mklink
Do obsługi dowiązań niezbędny jest system NTFS, system minimum Windows 2000 (tam jeszcze używało się programu JUNCTION, lub fsutil, ale od czasów MS Vista jest prościej) oraz uprawnienia administratora. Funkcja tworzenia to "mklink":
W wolnym tłumaczeniu:
[item]/J : punkt 'połączenia' dwóch katalogów - JUNCTION,[/item][item]/D : dowiązanie 'miękkie' katalogów,[/item][item]/H :dowiązanie twarde.[/item] Przykłady użycia... Z C:\DOBREPROGRAMY\ usuńmy wcześniej utworzone skróty (.lnk). Dla lepszego zrozumienia zagadnienia do katalogu G:\PLIKI\ można skopiować jakiś większy plik:
Utwórzmy teraz dwa dowiązania: "Link1" jako dowiązanie symboliczne i "Link2":
Na pierwszy rzut oka nie różnią się od standardowych skrótów. Spróbujmy jednak wyświetlić/kliknąć na zawartość tych katalogów:
Jak widać, nie jesteśmy przenoszeni na dysk G: do katalogu PLIKI, ale zawartość tego katalogu jest "mapowana" do utworzonych dowiązań na dysku C: w katalogu PLIKI. Patrząc na właściwości dowiązań nie jest wskazywana wielkość samego dowiązania (4kB jak to miało miejsce w przypadku .lnk), ale rzeczywista wielkość katalogu na dysku G:\
Jak łatwo się domyśleć - wygodna funkcja do "oszukania" programów, że rzeczywiste repozytorium plików znajduje się gdzie indziej. Dość podobnie wygląda sytuacja z tworzeniem dowiązań do plików:
mklink "C:\DOBREPROGRAMY\plik_Link1" G:\PLIKI\dokument1.txt
Tutaj wprawne okno powinno jednak dostrzec różnicę - link "miękki" zawiera dodatkową zakładkę "Shortcut":
To właśnie główna różnica między dowiązaniem "miękkim" a twardym "JUNCTION" - ten drugi lepiej "udaje" rzeczywisty katalog umieszczony w C:\PLIKI\
Mam w sieci domowej dysk sieciowy (NAS) z moim katalogiem domowym (\\NAS\BACHUS\). Utwórzmy na nim nowy katalog, oraz spróbujmy utworzyć dowiązanie miękkie "Link3"(przełącznik /D), oraz połączenie (JUNCTION) do katalogów "Link4" (przełącznik /J):
Jak widać, można utworzyć tylko dowiązanie miękkie, ponieważ JUNCTION wymaga dysku lokalnego - połączenie sieciowe (SMB) nie jest w ten sposób obsługiwane.
Powershell
A Co z Powershellowcami ? Microsoft miał dość spore opóźnienie w implementacji i dopiero w ostatniej (!) 5‑tej wersji coś się ruszyło. Ja osobiście używam w Windowsie dowiązań często - może przez to, że przez lata zajmowałem się głównie systemami z rodziny *nix i po czasie przeszedłem na ciemną stronę mocy. Dla mnie to była jakaś parodia używanie dodatków w stylu "PowerShell Community Extensions" (PSCX ) oferujące dodatkowe funkcje jak "New-SymLink", "New-HardLink", "New-Junction" i podobne. Najbardziej mnie jednak "bolało" odwoływanie się do powłoki Windows (cmd) poprzez brzydkie wywoływanie z PS:
cmd /c mklink c:\ZRODLO\ D:\CEL
Jak wyżej wspomniałem, firma z Redmond w nowej piątej wersji dodała odpowiednie funkcje. Na początku warto się upewnić, czy mamy taką w systemie:
Get-Host
Zacznijmy od dowiązanie "miękkiego" do katalogu:
# # link miekki - odpowiednik mklink /D Link10 "G:\PLIKI" # New-Item -ItemType SymbolicLink -Name Link11 -Target G:\PLIKI
Jak można się chyba domyśleć, JUNCTION utworzymy w podobny sposób:
# # link twardy- odpowiednik mklink /J Link10 "G:\PLIKI" # New-Item -ItemType Junction -Name Link12 -Target G:\PLIKI
Może jeszcze nasuwać się pytanie - w jaki sposób wyświetlić w Powershell typy plików i dowiązań? Tak jest! Microsoft i PS wspaniałomyślnie na to pozwala:
Get-ChildItem | select Name,Mode,LinkType,Target | Format-Table
Jeszcze się może zdarzyć, że ktoś ma awersję do linii poleceń - CMD, lub Powershell przeraża, albo po prostu nie lubisz wpisywać długich komend. Mówiąc szczerze, nie używam żadnych GUI do tego celu i nie mam z tym doświadczenia. Po chwili poszukiwań widzę, że są ciekawe rozwiązania. Pierwsze co wypluła wyszukiwarka Google to mała aplikacja Alejandro Mora "Symlinker ". Używanie jej nie zwalnia jednak ze znania zasad rządących linkami twardymi i miękkimi:
Całkiem rozsądnie wygląda też "Link Shell Extension ":
[img=drophardlinkfolder id=211112 alt=[źródło: Link Shell Extension]]
A jak usuwać dowiązania? Tak samo, jak zwykłe skróty (.lnk) i inne pliki - skasowanie ich nie skasuje katalogów, lub plików docelowych.
Przykład zastosowania
Może pojawić się pytanie, co dają dowiązania symboliczne i jaki mają sens, szczególnie przy NTFS i literach dysku a nie punktach montowania.
Po pierwsze, może być wygodne w przypadku braku miejsca na np. partycji systemowej (najczęściej dysku C:\) a dany program (lub inny zasób systemu operacyjnego) nie pozwala na instalację, lub wygodną zmianę lokalizacji. Spotkałem się z wieloma programami, które po prostu chcą być na C:, chcą koniecznie tworzyć tam pliki ..koniec i kropka. Podobnie ma miejsce ze źle (lub specjalnie...) skonstruowanymi programami, które nie pozwalają na pewne operacje: np. DROPBOX, który w opcjach nie ma możliwości dodawania innych katalogów (poza głównym wskazanym przy instalacji). No ale może jakiś rzeczywisty przykład, do którego w sumie natchnął mnie ten wpis.
Przeniesienie repozytorium aktualizacji na inną partycję
W laptopie żony wylądowała 3 lata temu pierwsza w domu pamięć SSD o zawrotnej pojemności 60GB. Po czasie okazało się się, że jest jednak lekkim nieporozumieniem w przypadku Windowsa "kiszenie się" na takiej dostępnej pojemności - po zainstalowaniu podstawowych aplikacji, klienta pocztowego zaczyna wyjątkowo brakować miejsca. Do laptopa dodałem dodatkowy talerzowy dysk, przeniosłem tam gry, maile (Thunderbird), ale Windows pomimo czyszczenia zapycha się i tyle. Nie mam czasu i ochoty ślęczeć nad tym i odchudzać OS. Przyszło do aktualizacji Windows 7 do Windows 10, sam proces był awykonalny ze względu na dostępne 2‑3GB miejsca. Procedura okazała się dość prosta, ale czasochłonna i wymagająca rozkręcania laptopa, oraz żonglowania dyskami i kieszeniami USB:
[item]sklonowanie (kopia 1:1) SSD 60GB na tymczasowy dysk 240GB,[/item][item]podmiana fizycznego dysku w laptopie,[/item][item]aktualizacja do Window 10,[/item][item]ponowne sklonowanie (240GB -‑> 60GB),[/item][item]podmiana dysków.[/item]Pomimo tego, że po całym procesie zrobiło się na dysku więcej miejsca, niż przy Windows 7, nadal było za mało GB na niektóre aktualizacje.
Główny "cache" aktualizacji Windows trzyma w C:\Windows\SoftwareDistribution\. Przechowywane są tam pobrane, oraz tymczasowe pliki. Przenieśmy go na dysk G:\ - z pomocą przyjdą nam dowiązania symboliczne. Aby to zrobić, należy najpierw zatrzymać odpowiedzialny serwis: można to zrobić z linii komend, lub klikając w serwis prawym klawiszem (services.msc). Najprościej jak sprawdzić, czy proces jest uruchomiony, oraz jak zatrzymać serwis:
sc query wuauserv net stop wuauserv
Po zatrzymaniu WUAUSERV nie powinno być problemu ze zmianą nazwy katalogu, lub całkowite usunięcie: Windows sobie poradzi z odtworzeniem zawartości a czasem całkowite wyczyszczenie może okazać się lekarstwem na problemy z aktualizacjami:
Teraz należy utworzyć na docelowym dysku (w tym przykładzie D:\) nowy katalog - nazwa jest dowolna, jednak dla porzadu utworzyłem D:\Windows\SoftwareDistribution\, oraz dowiązanie miękkie:
mkdir D:\Windows\SoftwareDistribution mklink /D "C:\Windows\SoftwareDistribution" "D:\Windows\SoftwareDistribution"
Tak, dowiązanie "miękkie" działa, ale jak ktoś nie ma pewności, może zawsze utworzyć "JUNCTION":
mklink /J "C:\Windows\SoftwareDistribution" "D:\Windows\SoftwareDistribution"
Teraz można uruchomić zatrzymany wcześniej serwis aktualizacji, oraz obserwować, że po chwili powinny pojawić się w nim nowe katalogi i pliki (co oznacza, że operacja się udała):
Może się zdarzyć, że próba aktualizacji wyświetli błędy:
Wynika to z błędnych ustawień poziomu dostępu do tego katalogu dla kont systemowych. Najprościej chyba skorzystać z 'troubleshootingu' i pozwolić Windowsowi na naprawę uprawnień:
Oczywiście można to zrobić ręcznie, przepisując uprawnienia z katalogu D:\Windows\SoftwareDistribution.old:
Poprawność konfiguracji można sprawdzić poprzez rozpoczęcie procesu aktualizacji i sprawdzenie, czy katalog na dysku D:\ zaczyna "puchnąć"
Uwagi
Należy szczególnie przemyśleć przenoszenie istotnych plików i katalogów systemowych, szczególnie na zasoby sieciowe. Po pierwsze należy mieć pewność, że dysk lokalny jest zawsze obecny w systemie i przetestować, co się stanie jak go zabraknie. Co do zasobów sieciowych: czy dostęp danego katalogu, czy pliku nie jest wymagany przed podniesieniem usług sieciowych. Mam nadzieję, że z grubsza wyjaśniłem na czym polegają dowiązania w systemie Windows. Borat jest dumny, że dotrwałeś do końca tego wpisu.