Symlinky, hardlinky a cloudové synchronizace

symlink vs hardlink rozdíly

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:

  1. 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
  2. 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

hardlink, symlink
rozdíle mezi harlinkem a symlinkem