Blog (66)
Komentarze (4.9k)
Recenzje (2)
@bachusDowiązania symboliczne w Windows

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):

602137

Jeszcze więcej (JUNCTION) jest w katalogu dowomym użytkownika (C:\Users\%username%):

602139

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
602144

W katalogu G:\PLIKI należy umieścić dowolny plik, np. dokument tekstowy:

602146

Teraz w C:\DOBREPROGRAMY\ tworzymy skrót (bez żadnej magii: przeciągamy prawym klawiszem myszy z opcją "Utwórz Skrót"):

602148

Skrót (można go utworzyć zarówno dla pliku, jak i katalogu) jest informacją o lokalizacji pliku w systemie plików:

602150
602151

Zróbmy teraz to samo ze skrótem do katalogu:

602153

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.

602155

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":

602159

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:

602162

Utwórzmy teraz dwa dowiązania: "Link1" jako dowiązanie symboliczne i "Link2":

602164
602165

Na pierwszy rzut oka nie różnią się od standardowych skrótów. Spróbujmy jednak wyświetlić/kliknąć na zawartość tych katalogów:

602167

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:\

602169

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
602172

Tutaj wprawne okno powinno jednak dostrzec różnicę - link "miękki" zawiera dodatkową zakładkę "Shortcut":

602174

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):

602177

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
602184

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
602187

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
602190

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
602193

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:

602195

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.

602201

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
602208
602209

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:

602211

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"
602214
602215

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):

602219

Może się zdarzyć, że próba aktualizacji wyświetli błędy:

602221

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ń:

602223

Oczywiście można to zrobić ręcznie, przepisując uprawnienia z katalogu D:\Windows\SoftwareDistribution.old:

602225

Poprawność konfiguracji można sprawdzić poprzez rozpoczęcie procesu aktualizacji i sprawdzenie, czy katalog na dysku D:\ zaczyna "puchnąć"

602227

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.

602230
Wybrane dla Ciebie
Komentarze (81)