next up previous contents
Nästa: 7.3 Filskyddskoder Upp: 7. Mer om UNIX Förra: 7.1 Grupper och identiteter

7.2 Länkar

Antag att vi flyttar filen dikter.tgz till katalogen kopior:$ ls
bellman     dikter/     dikter.tgz  kopior/     lenngren
$ mv dikter.tgz kopior/nr1
$
Detta kan vålla problem eftersom vissa kanske förväntar sig att finna dikter.tgz där den fanns tidigare. För att undvika sådana problem kan man göra en symbolisk länk från den ursprungliga till den nya positionen för filen. En symbolisk länk är väsentligen ett meddelande om ny adress - ''jag finns inte här längre, jag finns där''. Symboliska länkar används flitigt på UNIX-system, bland annat för att man ska kunna vara säker på att alla program ska hitta de filer de behöver.

Kommandot för att skapa en symbolisk länk är ln -s.$ ln -s kopior/nr1 dikter.tgz
$
Ovan skapade jag en symbolisk länk till filen kopior/nr1. Länkfilen, som heter dikter.tgz, listas av ls ungefär som en vanlig fil:$ ls
bellman      dikter/      dikter.tgz@  kopior/      lenngren
$
Att dikter.tgz är en symbolisk länk markeras ovan med tecknet @ efter dess namn. Då vi begär utförlig information om dikter.tgz, ser vi att den är en hänvisning till kopior/nr1: $ ls -l dikter.tgz
lrwxrwxrwx   1 göran    göran       10 mar  8 22:21 dikter.tgz -> kopior/nr1
$
Det första tecknet i filskyddskoden är l för symboliska länkar.

Vad händer ifall någon försöker använda filen dikter.tgz? Låt oss prova!$ tar -ztvf dikter.tgz
drwxrwxr-x göran/göran       0 1998-02-27 19:43 dikter/
-rw------- göran/göran     372 1998-02-01 17:12 dikter/bellman
-rw-rw-r-- göran/göran     649 1998-02-01 17:12 dikter/lenngren
$
De flesta kommandon skickas automatiskt vidare till den riktiga filen när de använder en symbolisk länk. Detta var vad som skedde vid kommandot ovan; tar kördes i själva verket på filen kopior/nr1. Ett undantag från denna regel är rm: om vi ger kommandot rm dikter.tgz, så raderas länkfilen i stället för test/ny.fil.$ rm dikter.tgz
$ ls
bellman   dikter/   kopior/   lenngren
$ ls kopior
nr1
$
Det kan också förekomma symboliska länkar till kataloger.$ ln -s kopior gammalt
$ ls
bellman   dikter/   gammalt@  kopior/   lenngren
$
Nu är gammalt en symbolisk länk till katalogen kopior. Vi kan göra samma saker med gammalt som vi kan göra med kopior:$ ls gammalt
nr1
$ cd gammalt
$ pwd
/home/göran/gammalt
$ ls -l
total 1
-rw-rw-r--   1 göran    göran         829 mar  1 22:58 nr1
$

Om man raderar en fil eller katalog som det finns symboliska länkar till, så kommer dessa symboliska länkar att peka ut i tomma intet.$ cd
$ rm -r kopior
$ ls gammalt
gammalt@
$ cd gammalt
bash: cd: gammalt: Filen eller katalogen finns inte
$ rm gammalt
$ ls
bellman   dikter/   lenngren
$

 Informationen om en fil (bland annat filens längd, datum för senaste ändring, filen rättigheter samt var på lagringsmediet filen placerats) lagras i något som kallas för en inod. Filens namn lagras inte i inoden. Istället har varje inod ett nummer, dess inodsnummer. Kopplingen mellan ett filnamn och mosvarande inod görs genom att systemet i den katalog där filen finns lagrar enbart filens namn och motsvarande inodsnummer - själva inoden kan vara lagrad på någon annan plats. Vilket inodsnummer som hör till ett givet filnamn skrivs ut om man anger flaggan -i till ls.$ ls -i
 157097 bellman    157098 dikter/    157138 lenngren
$
Utskriften betyder att filen bellman har inodsnummer 157097 osv. På sätt och vis kan man hävda att inoden är filen, medan filens namn är ett slags länk, en hård länk, till inoden. Ingenting hindrar att man har mer än en hård länk till en och samma fil/inod. Därigenom kan en fil ha flera olika namn. Kommandot för att skapa en ny hård länk till en fil är ln (utan flaggan -s).$ ln bellman sång
$ ls -i
 157097 bellman    157098 dikter/    157138 lenngren   157097 sång
$
Nu är sång en hård länk till filen bellman, något som syns genom att de båda filerna har samma inodsnummer i utskriften ovan. Detta innebär att sång och bellman är två olika (men helt likvärdiga) namn för en och samma fil/inod.

När ls anropas med flaggan -l, skrivs antalet hårda länkar till varje fil ut efter dess skyddskod.$ ls -l
total 4
-rw-------   2 göran    göran         372 feb  1 16:48 bellman
drwxrwxr-x   2 göran    göran        1024 feb 27 19:43 dikter/
-rw-rw-r--   1 göran    göran         649 feb  1 15:53 lenngren
-rw-------   2 göran    göran         372 feb  1 16:48 sång
$
Siffran 2 som anges för sång och bellman i listningen ovan, betyder att det finns två hårda länkar till dessa filer. Låt oss skapa ytterligare en hård länk till dem:$ ln sång fredman
ls -li
total 5
 157097 -rw-------   3 göran    göran         372 feb  1 16:48 bellman
 157098 drwxrwxr-x   2 göran    göran        1024 feb 27 19:43 dikter/
 157097 -rw-------   3 göran    göran         372 feb  1 16:48 fredman
 157138 -rw-rw-r--   1 göran    göran         649 feb  1 15:53 lenngren
 157097 -rw-------   3 göran    göran         372 feb  1 16:48 sång
$
De tre filnamnen fredman, sång och bellman är hårda länkar till inoden med nummer 157097.

Om man raderar en hård länk, så påverkas inte de andra länkarna till samma inod (inoden tas bort först när samtliga länkar till den raderats).$ rm sång
$ ls
bellman dikter/ fredman lenngren
$ rm fredman
$ ls -l
total 3
-rw-------   1 göran    göran         372 feb  1 16:48 bellman
drwxrwxr-x   2 göran    göran        1024 feb 27 19:43 dikter/
-rw-rw-r--   1 göran    göran         649 feb  1 15:53 lenngren
$

Hårda länkar är inte lika vanligt förekommande som symboliska. De används främst när ett program ska fungera på olika sätt beroende på vilket namn det anropas under. Symboliska och hårda länkar är lika såtillvida att de båda kan ge en och samma fil olika namn. Det finns dock några skillnader. För det första kan det inte förekomma hårda länkar mellan filer som ligger på olika fysiska lagringsmedium som tex olika hårddiskpartitioner. Det kan inte heller förekomma hårda länkar mellan kataloger. En fördel med hårda länkar är att olika hårda länkar till en och samma inod är fullständigt likvärdiga - för symboliska länkar fungerar länkfilen i vissa avseenden annorlunda än den verkliga filen.


next up previous contents
Nästa: 7.3 Filskyddskoder Upp: 7. Mer om UNIX Förra: 7.1 Grupper och identiteter
Goran Andersson
1999-03-08