Koukali jste někdy na rozdíl mezi symlinkem a hardlinkem? A bylo to dle definice pochopitelné? Pro mě ani moc ne. Proto vznikl tento článek.
1. Obecné informace:
1.1 Symlink:
- Odkazuje na soubor, nebo adresář
- Je univerzální, kopírovatelný mezi systémy
- Nenese žádou konkretní hodnotu o souboru, na který odkazuje.
- Jinými slovy – Tvorbou symlinku prostě odkazujeme na něco. ŘÍkáme – Klikni sem, dostaneš se tady.
1.2 Hardlink:
- Hardlinky mohou odkazovat jen na soubory unitř svého souborového systému
- Hardlink odkazuje na i-node. To znamená, že když pomocí hardlinku odkazujeme na soubor, odkazujeme i na jeho metadata (práva, časy změn, seznamy datových bloků atd)
- Jinými slovy – Tvorbou hardlinku utvoříme naprosto ekvivalentní soubor. Na první pohled to vypadá jako kopie originálu, ale není to kopie originálu. Hardlink a originál sdílejí stejná data, jsou si ekvivalentní.
2. Jaký je rozdíl mezi hardlinkem a symlinkem?
2.1 Ukázka konkrétního
Pojďme si to ukázat na konkrétním příkladu:
Jsme u sebe doma:
r@Connectica:~/linky$ ls *
LinkFile: HardOrig.txt Sym-orig SymOrig.txt
OriginalFile: Hard-orig Sym-orig
Uděláme to, že utvoříme adresáře:
- OriginalFile – Adresář, kde jsou originální soubory a to:
- Adresář Hard-orig a v něm soubor HardOrig.txt
- Adresář Sym-orig a v něm soubor SymOrig.txt
- LinkFile adresář, kde jsou utvořeny symbolické linky a hardlinky k adresářům i souborům, tedy:
- HardLink (ln) adresáře /Hard-orig — Nefunguje (hard link not allowed for directory)
- Hardlink (ln) souboru HardOrig.txt
- Symlink(ln -s) adresáře /Sym-orig a v něm jeho obsah (tedy SymOrig.txt)
- Symlink (ln-s) souboru SymOrig.txt
2.2 Editace souborů
2.2.1 Změna obsahu txt v originálním souborů
Začneme tím snadným. Uděláme-li editaci obsahu v originálním souboru, tak se změna projeví všude v linkových odkazech.
Tedy:
cat ~/linky/OriginalFile/HardOrig.txt
Hard-A
Po editaci:
cat ~Linky/LinkFile/HardOrig.txt
Hard-A
Hard-B
cat ~/linky/OriginalFile/Sym-orig/SymText.txt
Sym-A
Po Editaci:
cat ~/linky/LinkFile/SymText.txt
Sym-A
Sym-B
Co se týče velikosti, tak uděláme-li třeba 10 hardlinků, tak všechny mají ekvivalentní velikost. A změnou jednoho hardlinku sice změníme velikost všech ostatních, ale neprojeví se to na disku. Stejně tak u symlinků při změně souboru je velikost zachována. Protože symlink jen a pouze odkazuje na něco jiného.
2.2.2 Změna obsahu v linkovaném souborů:
Co se nyní stane, když ale uděláme v adresáři /LinkFile změnu obsah txt souborů?
cat~/linky/LinkFile/HardOrig.txt
Hard-A
Hard-B
Po editaci:
cat ~/linky/LinkFile/HardOrig.txt
Hard-A
Hard-B
Hard-C
cat ~/linky/LinkFile/SymText.txt
Sym-A
Sym-B
Po Editaci:
cat ~/linky/LinkFile/SymText.txt
Sym-A
Sym-B
Sym-C
Co se stalo v adresáři /OriginalFile?
cat ~/linky/OriginalFile/Hard-orig/HardOrig.txt
Hard-A
Hard-B
Hard-C
cat ~/linky/OriginalFile/Sym-orig/SymOrig.txt
Sym-A
Sym-B
Sym-C
Super! Editací obsahu obojích linků se to projeví i v originálním místě
2.2.3 Změna názvu originálních txt souboru
Teď uděláme to, že v OriginalFile přejmenujeme názvy souborů, které odkazují na linky:
mv ~/linky/OriginalFile/Hard-orig/HardOrig.txt ~/linky/OriginalFile/HardOrig-prejmenovano.txt
mv ~/linky/OriginalFile/Sym-orig/SymText.txt ~/linky/OriginalFile/SymText-prejmenovano.txt
Pak dostaneme následující výsledek v ~/linkyLinkFiles/
- cat Hard-orig.txt funguje, vypíšu si obsah
- cat SymOrig.txt nefunguje. Nevypíšu si obsah. Hlasí, že originál není k nalezení.
Pokud přejmenuji souboru zase zpět na jejich původní název, tak mi poslední varianta tedy cat SymText.txt začne opět fungovat.
2.2.4 Změna názvu linků u txt souboru:
Změníme-li název textového souboru…
mv ~/linky/LinkFile/HardOrig.txt ~/linky/LinkFile/HardOrig-prejmenovano2.txt
mv ~/linky/LinkFile/SymOrig.txt SymOrig-prejmenovano2.txt
pak se změna nijak neprojeví u originálu:
cd ~/linky/OriginalFile/Hard-orig$ ls
HardOrig.txt
cd ~/linky/OriginalFile/Sym-orig$ ls
SymText.txt
2.3 Změna adresářů
2.3.1 Přejmenovaní originálních adresářů
Když přejmenuji původní adresář
mv ~/linky/OriginalFile/Sym-orig/~/linky/OriginalFile/Sym-orig-prejmenovanAdresar/
Se projeví tak, že:
- cd~/linky/LinkFile/Sym-orig nefunguje
- cat~/linky/LinkFile/SymOrig.txt nefunguje
Po změně jmen zpět na originální názvy se opět symlinky zfunkční.
2.3.2 Prejmenovaní linkových adresářů
Změnou jména adresářů u linků:
mv ~/linky/LinkFile/Sym-orig ~/linky/LinkFile/Sym-orig-prejmenovany
Docílíme toho, že se tato změna originálu nijak nedotkne.
3. Příklady z praxe
3.1 Kategorizace adresářových struktur
Představme si, že máme adresář /home/r/Dokumenty a v dokumentech máme třeba podadresáře jakou jsou /smlouvy /knihy jízd nebo /technickeDokumentace. A teď si představme, že v adresáří /home/r/firmy máme jednotlivé firmy, tedy /Connectica /ICTMorava /Datamasters atd. Co když se mezi sebou prolínají tyto dvě kategorie. Tedy ve smlouvách jsou dokumenty, které patří současně firmě ICTMorava. A stejně tak v třeba v adresářích /fotografie jsou podadresáře fotografií vztahující se k jednotlivým firmám (fotografie montáží, site survey atd) . A Problém je na světě. Kam to zařadit? Jak to odfitrovat? Jak si v tom neudělat bordel. Řešením jsou práve symlinky a hardlinky.
3.1.1 „symlinky“ na Synology NAS
Máte-li tu smůlu, že používáte Synology NAS, tak při přihlášení přes SSH si můžete snadno v adresářové struktuře v Synology tvořit symlinky a hardlinky, ale bohužel se to neprojeví v grafickém prostředí (File Station) vaší Synology NASky. Řešení je snadné, ale není úplně snadné ho najít.
Utvořte adresář a namoutěte ho:
mkdir /volume1/technickeDokumentace
mount -o bind /volume1/homes/Franta/firmy/Connectica/ /volume1/technickeDokumentace
a pak to udělejte na trvalo zápisem do /etc/rc.local:
mount -o bind /volume1/homes/Franta/firmy/Connectica/ /volume1/technickeDokumentace
Tímto výše popsaným jsme si zajistili, že když otevřeme v Synology NAS v grafickém prostředí adresáře, tak tam uvidíme tyto odkazy. Jako záplata na bolístku je to jediné řešení.
3.2 Synchronizace souborů mezi dalšími linuxovými mašinami
Toto je věc, která mě dlouho pila krev. Mám-li hlavní Linuxovou mašinu, pojmenujme ji A a pak sekundární notebook B, tak a v každém máme třeba Midnight Commandera. Je to víc než prudérní do každé mašiny opisovat vždy novou změnu, když si přidám nějakou zkratku z adresáře /.config/mc a teď hlavně hovořím o souboru hotlist, který obsahuje všechny zkratky. Prostě je potřeba nějak soubor ~/.config/mc synchonizovat mezi všemi mašinami. Bohatým pomocníkem je třeba od Synology Cloudstation, nebo nějaká jiná alternativa, která je bezpečná (ownCloud), jen ne proboha veřejné cloudy jako je třeba Google Drive nebo Dropbox.
- V CloudStation nastavíme, že ccheme synchronizovat souborů s předporou „.“ (tedy ty schované)
- V SloudStation nastavíme, že chceme, aby byla obousměrná synchronizace souborů.
- V CloudStation nastavíme, aby se vždy při synchonizaci na server nahrála ta verze, která je nejmladší
Teď nakopírujeme do ~/Cloudstation/Synchronizace/mc náš ~/.config/mc/hotlist.
Přejmenujeme náš hotlist:
mv ~/.config/mc/hotlist ~/.config/mc/hotlist-backup
Utvoříme na mašině A hardlink souboru z Cloudstation k nám co configu:
~/Cloudstation/Synchronizace/mc/hotlist ~/.config/mc/hotlist
A teď to samo uděláme na mašině B
Přejmenujeme náš hotlist:
mv ~/.config/mc/hotlist ~/.config/mc/hotlist-backup
Utvoříme na mašině B hardlink souboru z Cloudstation k nám co configu:
~/Cloudstation/Synchronizace/mc/hotlist ~/.config/mc/hotlist
A je to! Když něco zeditujete na libovolném stroji, na tom druhém se to zaktualizuje (a vice versa)
4. Závěrem
Na závěr jeden obrázek za všechny. Vše výše sepsané lze demonstrovat jedním hezkým obrázkem, který šíká více než 1000 slov. Obrázek jsem si půjčil ze serveru https://i.stack.imgur.com/f7Ijz.jpg