trda povezava ? hardlink !

Počitnice… pa malo lenobe, pa malo gužve, pa je nastala takšna luknja med objavami…

Je Vini, medtem ko sva reševala svet s hardlinki navrgel pobudo za današnji post.

Torej hardlink na unix datotečnih sistemih, veliko uporabljen, malo poznan, veliko manj kot njegov primitivni sorodnik symlink.

Nekako takole gre: na datotečnem sistemu ima vsaka datoteka svoj unikatni id, reče se mu “inode”.

Direktorijska struktura datotek je tabela, ki ima vnose (imena datotek), ki so kazalci na id-je datotek, torej inode. Ko se mi sprehajamo po tej strukturi datotek in zahtevamo datoteko, sistem preveri v tabeli kateri inode je pod datotečnim imenom, ga poišče po tej številki in servira.

Hardlink je možnost, da v direktorijski strukturi kažeta dve imeni datotek na isti id datoteke / inode.

V praksi:
# vpišemo vrstico "vsebina" v novo datoteko
:~/test simon$ echo vsebina >datoteka

# pregledamo vsebino datoteke
:~/test simon$ cat datoteka
vsebina

# pregledamo vsebino direktorija
:~/test simon$ ls -al
total 8
drwxr-xr-x 3 simon simon 102 Aug 20 23:53 .
drwxr-xr-x 44 simon simon 1496 Aug 20 23:52 ..
-rw-r--r-- 1 simon simon 8 Aug 20 23:53 datoteka

# naredimo hardlink datoteke "datoteka" v novo ime "hardlink"
:~/test simon$ ln datoteka hardlink

# pregledamo vsebino direktorija
:~/test simon$ ls -al
total 16
drwxr-xr-x 4 simon simon 136 Aug 20 23:53 .
drwxr-xr-x 44 simon simon 1496 Aug 20 23:52 ..
-rw-r--r-- 2 simon simon 8 Aug 20 23:53 datoteka
-rw-r--r-- 2 simon simon 8 Aug 20 23:53 hardlink

# pregledamo vsebino datoteke hardlink
:~/test simon$ cat hardlink
vsebina

# zapišemo vrtico "novavsebina" v datoteko hardlink
:~/test simon$ echo novavsebina >hardlink

# jasno se s tem spremeni vsebina druge
:~/test simon$ cat datoteka
novavsebina

# pa še način, da vidimo da datotečna imena kažeta na isti "id datoteke / inode" - prva kolona
:~/test simon$ ls -li
1082466 -rw-r--r-- 2 simon simon 12 Aug 21 00:01 datoteka
1082466 -rw-r--r-- 2 simon simon 12 Aug 21 00:01 hardlink

Zakonitosti hardlinkov:

  • hardlink-ate lahko samo datoteke,
  • hardlink do datoteke lahko postavite samo na isti datotečni sistem (na enak mountpoint), linkanje med diski torej ni mogoče,
  • vsebina datoteke bo iz diska izbrisana takrat, ko nanjo ne bo kazal več nobeden link. Torej ko zbrišete kateregakoli izmed dveh datotek, bo vsebina še vedno v drugi datoteki,
  • število hardlinkov datoteke lahko vidite v drugi koloni ukaza ls (bodite pozorni na primer zgoraj, ko je bila ena datoteka je bilo število hardlinkov 1, nato 2).

Uporabnost ? povsod kjer se enake datoteke pojavljajo v različnih direktorijih

  • pri sistemskih datotekah virtualnih okolij “jail na FreeBSD”, kjer ima vsak jail kopijo celotnega sistema,
  • varnostnih kopijah, pri čemer imamo lahko za vsak dan celotno direktorijsko strukturo strežnika, zares pa bo ena datoteka zasedla samo enkratno velikost.
  • blackbox programi, programi ki znajo opravljati već funkcij, glede na to kakšno ime smo jim dali. (primer /rescue na FreeBSD)
  • razno 🙂

Pa primitivni bratec symlink ?

Symlink pa pod datotečno ime zapiše pot do datoteke, na katero kaže, torej samo tekstovni opis kje najdemo datoteko.

Zakonitosti symlinka:

  • symlink-ate lahko direktorije in datoteke,
  • symlink lahko uporabljate med večimi diski / mount pointi,
  • symlink se ne ozira na to, če datoteka na katero kaze obstaja ali ne,
  • datoteka bo iz diska odstranjena, ko odstranimo original, torej datoteko na katero kažejo ostali symlinki.

Kaj uporabiti ? Seveda odvisno od primera, če želite samo malo organizirati datotečno strukturo in imeti ene stvari “pri roki”, bližje, potem symlink.

So pa stvari ki jih symlink ne zna, kot recimo če želite datoteko ki se nahaja v direktoriju do katerega uporabnik načeloma nima dostopa, deliti z njim, potem narediti hardlink v uporabniku viden prostor.

Ko želite, da se dodoteke obnašajo kot datoteke, ko jih želite sinhronizirat z rsyncom itd.

Z Vinijem sva namreč imela primer, pri katerem sva imela organizacijo datotečnih imen po nekem svojem ključu, ki pa, jasno, naročniku ni bil povšeči 🙂 Rešil je hardlinking, dve popolnoma drugačni ureditvi datotečnih imen, pod njima pa enake datoteke.

Toliko da prelomim ta molk,
kmalu več, noč,
s.