Symlink (symbolic link, dowiązanie symboliczne) to specjalny plik, który wskazuje na inny plik lub folder — jak skrót na pulpicie, ale na poziomie systemu plików. Kiedy otwierasz symlink, system automatycznie przekierowuje Cię do pliku/folderu docelowego. Symlink sam nie zawiera danych — jest tylko wskaźnikiem.
Symlinki są fundamentem administracji serwerów, web developmentu i zarządzania konfiguracją. W tym poradniku pokazuję jak je tworzyć na Linux, macOS i Windows, z praktycznymi przykładami zastosowań.
Spis treści
TogglePo co symlinki — praktyczne zastosowania
- Wiele wersji programu:
/usr/bin/python→ symlink do/usr/bin/python3.11. Zmiana wersji = zmiana symlinku, nie pliku. - Współdzielenie plików między projektami: folder
node_modulesw jednym miejscu, symlinki z wielu projektów. - Deployment zero-downtime:
/var/www/current→ symlink do/var/www/release-v2.3. Nowa wersja = zmiana symlinku (1 ms), nie kopiowanie plików. - Konfiguracja serwera: Nginx/Apache:
/etc/nginx/sites-enabled/mysite.conf→ symlink do/etc/nginx/sites-available/mysite.conf. Aktywacja/deaktywacja strony = tworzenie/usuwanie symlinku. - WordPress multisite: współdzielenie wtyczek/motywów między instalacjami.
- Backup/archiwum:
/home/user/Documents→ symlink do/mnt/nas/Documents(dokumenty na NAS, ale dostępne jak lokalne).
Linux / macOS — ln -s
Tworzenie symlinku
ln -s /ścieżka/do/oryginału /ścieżka/do/symlinku
Przykłady:
# Symlink do pliku
ln -s /var/www/release-v2.3 /var/www/current
# Symlink do folderu
ln -s /home/user/projekty/shared-config /home/user/projekt-a/config
# Symlink w bieżącym katalogu
ln -s /etc/nginx/sites-available/mysite.conf mysite.conf
# Sprawdź, czy symlink istnieje
ls -la /var/www/current
# lrwxrwxrwx 1 root root 23 Apr 20 12:00 current -> /var/www/release-v2.3
Litera l na początku uprawnień (lrwxrwxrwx) oznacza symlink. Strzałka -> pokazuje cel.
Usuwanie symlinku
rm /var/www/current
Ważne: rm usuwa symlink, nie oryginalny plik/folder. Oryginał zostaje nietknięty. Ale uwaga: rm -rf current/ (ze slashem na końcu) na niektórych systemach może usunąć zawartość folderu docelowego! Bezpieczniej: unlink current.
Zmiana celu symlinku
# Usuń stary i utwórz nowy
rm /var/www/current
ln -s /var/www/release-v2.4 /var/www/current
# Lub jednym poleceniem (force overwrite)
ln -sfn /var/www/release-v2.4 /var/www/current
-f = force (nadpisz istniejący). -n = traktuj cel jak plik, nie folder (ważne przy symlinkach do folderów).
Symlink vs Hard Link — różnica
| Cecha | Symlink (ln -s) | Hard Link (ln) |
|---|---|---|
| Wskazuje na | Ścieżkę (path) | Inode (fizyczny blok danych) |
| Działa między partycjami | Tak | Nie (ten sam filesystem) |
| Działa z folderami | Tak | Nie (tylko pliki) |
| Co się stanie po usunięciu oryginału | Symlink „wisi” (broken link) | Dane nadal dostępne (inode istnieje) |
| Rozmiar | Kilka bajtów (tylko ścieżka) | Taki sam jak oryginał (wspólny inode) |
| Najczęstsze użycie | 95% przypadków | Niszowe (backup, deduplikacja) |
Zasada: jeśli nie wiesz, którego użyć — symlink (ln -s). Hard linki to narzędzie specjalistyczne.
Windows — mklink
Windows obsługuje symlinki od Vista/Windows 7, ale komenda jest inna:
Tworzenie symlinku
# Otwórz CMD jako Administrator (!)
# Symlink do pliku
mklink C:\skrot.txt C:\oryginaly\plik.txt
# Symlink do folderu (/D = directory)
mklink /D C:\skrot-folder C:\oryginaly\folder
# Junction (starszy typ dowiązania do folderu, nie wymaga admina)
mklink /J C:\skrot-folder C:\oryginaly\folder
Uwaga: mklink wymaga uprawnień administratora (uruchom CMD jako Admin). Junction (/J) nie wymaga — i dla większości zastosowań działa identycznie.
PowerShell
New-Item -ItemType SymbolicLink -Path "C:\skrot" -Target "C:\oryginal"
Usuwanie
Symlink w Windows usuwasz jak normalny plik/folder — prawym przyciskiem → Usuń, lub del skrot.txt (plik) / rmdir skrot-folder (folder). Oryginał zostaje.
Praktyczne przykłady — web development
1. Zero-downtime deployment
# Struktura na serwerze:
/var/www/releases/
v2.3/ # stara wersja
v2.4/ # nowa wersja (właśnie wgrana)
/var/www/current # symlink → /var/www/releases/v2.3
# Deploy nowej wersji:
ln -sfn /var/www/releases/v2.4 /var/www/current
# Nginx/Apache serwuje /var/www/current → natychmiast nowa wersja
# Rollback (jeśli bug):
ln -sfn /var/www/releases/v2.3 /var/www/current
# Powrót do starej wersji w 1 ms
To jest standardowa strategia deployment w narzędziach: Capistrano, Deployer (PHP), Envoyer. Symlink = atomowe przełączenie wersji.
2. Nginx sites-enabled
# Konfiguracja dostępna:
/etc/nginx/sites-available/mysite.conf
# Aktywacja:
ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# Deaktywacja:
rm /etc/nginx/sites-enabled/mysite.conf
sudo systemctl reload nginx
Nginx w konfiguracji: include /etc/nginx/sites-enabled/*; — ładuje tylko pliki z sites-enabled. Symlink = strona aktywna. Brak symlinku = strona wyłączona.
3. Współdzielenie uploads między środowiskami
# Staging nie musi mieć kopii 10 GB uploadów z produkcji
# Na staging:
rm -rf /var/www/staging/wp-content/uploads
ln -s /var/www/production/wp-content/uploads /var/www/staging/wp-content/uploads
# Staging używa uploadów produkcji bez kopiowania
4. Dotfiles management
# Trzymasz konfigurację (.bashrc, .gitconfig, .vimrc) w repo Git:
~/dotfiles/
.bashrc
.gitconfig
.vimrc
# Symlinki z home:
ln -s ~/dotfiles/.bashrc ~/.bashrc
ln -s ~/dotfiles/.gitconfig ~/.gitconfig
# Nowy komputer: git clone dotfiles + symlinki = gotowa konfiguracja
Diagnostyka — problemy z symlinkami
Broken symlink (wiszący link)
Jeśli oryginalny plik/folder zostanie usunięty lub przeniesiony, symlink nadal istnieje — ale wskazuje na nic. ls -la pokaże go na czerwono (w większości terminali).
# Znajdź broken symlinki w katalogu:
find /var/www -xtype l
Napraw: utwórz ponownie cel lub usuń broken symlink.
Symlink a uprawnienia
Symlink sam ma uprawnienia 777 (lrwxrwxrwx) — ale to nie ma znaczenia. System sprawdza uprawnienia pliku docelowego, nie symlinku. Jeśli cel ma 644 — to obowiązuje, niezależnie od uprawnień symlinku.
Symlink a ścieżki względne vs bezwzględne
# Bezwzględna (absolute) — zawsze działa:
ln -s /var/www/releases/v2.4 /var/www/current
# Względna (relative) — działa tylko jeśli pozycja symlinku się nie zmieni:
cd /var/www
ln -s releases/v2.4 current
Bezwzględna jest bezpieczniejsza (działa niezależnie od kontekstu). Względna jest krótsza i przenośna (nie zależy od pełnej ścieżki). Większość narzędzi używa bezwzględnych.
Najczęściej zadawane pytania
Czy symlink zajmuje miejsce na dysku?
Praktycznie nie — symlink to kilka bajtów (przechowuje tylko ścieżkę do celu). Folder z 10 GB plików i symlink do tego folderu: łącznie ~10 GB + kilka bajtów, nie 20 GB.
Czy mogę zrobić symlink do symlinku?
Tak — system podąża za łańcuchem symlinków. A → B → C = otwarcie A otwiera C. Ale unikaj cykli (A → B → A) — system wykryje to i zwróci błąd „Too many levels of symbolic links”.
Czy symlink działa przez sieć (NFS, SMB)?
Zależy: symlink wskazujący na ścieżkę na tym samym serwerze — tak. Symlink wskazujący na ścieżkę na innym serwerze — nie (chyba że zamountujesz zdalny system plików). Dla zasobów sieciowych: użyj mount (NFS) lub CIFS/SMB mount zamiast symlinku.
Git a symlinki
Git obsługuje symlinki — zapisuje je jako specjalne pliki (typ symlink w tree object). Po klonowaniu repo symlinki są odtwarzane. Ale uwaga: na Windows (bez Developer Mode) Git może przekonwertować symlinki na zwykłe pliki z treścią = ścieżką celu. Włącz: git config core.symlinks true i Developer Mode w Windows.
Podsumowanie
Symlink to wskaźnik na plik lub folder — jak skrót, ale na poziomie systemu plików. Linux/macOS: ln -s cel nazwa_symlinku. Windows: mklink nazwa cel (jako admin). Najczęstsze zastosowania: zero-downtime deployment (przełączanie wersji), Nginx sites-enabled, dotfiles management, współdzielenie plików między środowiskami. Zasada: jeśli kopiujesz folder „bo potrzebuje go inny program” — prawdopodobnie powinieneś użyć symlinku zamiast kopii.






