Linux linkelés, hogyan is van ez?

enlightened Ez az oldal a közösségért készül. heart Kövess minket máshol is:  Linux Mint Magyar Közösség a Mastodon-on  Telegram csatorna – csak hírek  Beszélgessünk a Telegram – Linux csevegő csoport  Hírek olvasása RSS segítségével  Linux Mint Hivatalos Magyar Közösség a Facebook-on      Linux Mint Baráti Kör a Facebook-on
wink Ha hasznosnak találod, és szeretnéd, hogy folytatódjon, támogasd a munkát Ko-fi vagy Paypal segítségével. laugh

Azt tapasztalom, hogy nem mindenki van teljesen tisztában azzal, hogy pontosan mi az a kemény link (hard link) és a szimbolikus link (symbolic link), ill. akadnak félreértések. Nézzük!

Röviden:

 * Kemény link: egy második név ugyanahhoz az inode-hoz.
 * Szimbolikus link: egy külön fájl, amely egy másik fájl vagy könyvtár elérési útját tárolja.

A különbség megértéséhez először az inode fogalmát érdemes ismerni.

Linuxban leegyszerűsítve egy fájlhoz két fontos dolog tartozik, a fájlnév és az inode (egyéb jellemzők):

(1) fájlnév
      │
      ▼
(2) inode
      │
      ├── jogosultságok
      ├── tulajdonos
      ├── időbélyegek
      └── a fájl adatainak helye

A fájlnév önmagában nem maga a fájl! A könyvtárban egy bejegyzés kapcsolja össze a fájl nevét az inode-dal.

 - Kemény link:

Kemény linket az `ln` paranccsal hozunk létre:

ln eredeti.txt link.txt

Most két néven érhetjük el ugyanazt a fájlt:

eredeti.txt  ────┐
                 ├──► inode 12345 ──► fájl adatai
link.txt     ────┘

Az `ls -li` paranccsal ellenőrizhetjük is.

FONTOS, ez a legtöbbször félreértelmezett dolog, a kemény link NEM másolat! Ha a link.txt tartalmát megváltoztatom az eredeti.txt tartalma is megváltozik, mert valójában ugyanazt a fájlt módosítottam, csak egy másik néven keresztül.

Mi történik, ha törlöm az eredetit? Ez az egyik legfontosabb különbség a két linkelési módszer között!

rm eredeti.txt

eredeti.txt       ❌ törölve
link.txt          ✅ továbbra is működik
                     │
                     ▼
                 inode 12345
                     │
                     ▼
                 fájl adatai

A link.txt továbbra is használható! Az adat nem tűnik el, mert az inode-ra még mindig hivatkozik a link.txt. A fájl tényleges adatai akkor törlődnek, amikor az utolsó kemény linket is törlöd.

 - Szimbolikus link:

A szimbolikus linket a `ln -s` paranccsal hozzuk létre:

ln -s eredeti.txt szim.txt

Itt már más a helyzet:

szim.txt
     │
     │ tartalma:
     │ "eredeti.txt elérési útvonala"
     ▼
eredeti.txt
     │
     ▼
inode 12345
     │
     ▼
fájl adatai

A szimbolikus linknek saját inode-ja van, ezt szintén az `ls -li` paranccsal ellenőrizheted.
Tehát a  szim.txt egy speciális fájl, amely azt mondja: "Keresd meg az eredeti.txt nevű fájlt".

A `ls -l` kimenetében ezért jól látható: szim.txt -> eredeti.txt.

Mi történik, ha törlöm az eredetit?

rm eredeti.txt

szim.txt ───► eredeti.txt ❌ törölve

A szimbolikus link megmarad, de nincs többé érvényes célja, azaz megtörik.
Ha megpróbálod a `cat szim.txt` parancsot, akkor hibát kapsz, mert a szimbolikus link egy már nem létező fájlra mutat.

 - Fájlrendszerek:

Fontos különbség, hogy kemény linkkel nem tudsz egy másik fájlrendszerben lévő fájlra hivatkozni, szimbolikus linkkel viszont igen.
Ez azért van, mert a kemény link közvetlenül az inode-ra hivatkozik, az inode pedig az adott fájlrendszerhez tartozik, a szimbolikus link ezzel szemben egy útvonalat tárol.
Könyvtárak esetén is ez a helyzet, csak szimbolikus linket tudsz használni (nagyon speciális esetben kemény linket is).

Egy kis összefoglaló kép az eddig tárgyaltakról:

Mikor használj szimbolikus linket:
* egy könyvtárra szeretnél hivatkozni;
* másik fájlrendszerre szeretnél hivatkozni;
* egy konfigurációs fájlt szeretnél más helyről elérhetővé tenni;
* verziók között szeretnél egyszerűen váltani;
* fontos, hogy egyértelműen látszódjon: ez egy link;
* könnyen szeretnéd átirányítani a linket egy másik célra.

Mikor használj kemény linket:
* ténylegesen ugyanazt a fájlt szeretnéd két néven elérni;
* fontos, hogy az egyik név törlése ne törölje az adatot;
* például hatékony pillanatkép megoldást építesz.

A pillanatkép létrehozása egy adott könyvtárról a legéletszerűbb felhasználása a kemény linkeknek (pl. az rsync --link-dest is így működik), példának egy egyszerű kis szkript, ami a cp parancsot használja, ami szintén tud kemény linkeket létrehozni:

#!/usr/bin/env bash

# Szigorú hibafelelősség: álljon le hiba esetén
set -euo pipefail

# Használati útmutató, ha nem megfelelő a paraméterezés
if [ "$#" -ne 2 ]; then
    echo "Használat: $0 <forrás_könyvtár> <cél_pillanatkép_könyvtár>"
    echo "Példa:    $0 /var/www/html /backups/snapshots/html_\$(date +%Y%m%d_%H%M%S)"
    exit 1
fi

SOURCE_DIR="$1"
TARGET_DIR="$2"

# 1. Ellenőrzések
if [ ! -d "$SOURCE_DIR" ]; then
    echo "Hiba: A forráskönyvtár ($SOURCE_DIR) nem létezik!" >&2
    exit 1
fi

if [ -e "$TARGET_DIR" ]; then
    echo "Hiba: A célkönyvtár ($TARGET_DIR) már létezik!" >&2
    exit 1
fi

# 2. Pillanatkép létrehozása
echo "Pillanatkép készítése:"
echo "  Forrás: $SOURCE_DIR"
echo "  Cél:    $TARGET_DIR"

# A cp -al paranccsal kemény linkeljük a fájlokat
cp -al "$SOURCE_DIR" "$TARGET_DIR"

echo "Pillanatkép sikeresen elkészült!"

A megoldás helytakarékos, az újonnan létrejött mappában lévő fájlok pontosan ugyanazokra az inode-okra mutatnak, mint a forrásban lévők. Független törlés: ha a forráskönyvtárból törölsz egy fájlt, a pillanatképben lévő fájl nem tűnik el, mivel a kemény link számlálója (link count) még nem érte el a nullát.

Végére egy kis táblázat:

| Tulajdonság                      | Kemény link     | Szimbolikus link          |
| -------------------------------- | ----------------| ------------------------- |
| Parancs                          | `ln fájl link`  | `ln -s fájl link`         |
| Ugyanaz az inode?                | Igen            | Nem                       |
| Saját inode-ja van?              | Nem             | Igen                      |
| Másolatot készít?                | Nem             | Nem                       |
| Ugyanazokat az adatokat éri el?  | Igen            | Igen, amíg a cél létezik  |
| Az eredeti törlése után működik? | Igen            | Nem                       |
| Könyvtárra mutathat?             | Általában nem   | Igen                      |
| Másik fájlrendszerre mutathat?   | Nem             | Igen                      |
| Nem létező célra létrehozható?   | Nem             | Igen                      |
| Könnyen látható, hogy link?      | Nem mindig      | Igen                      |
| Gyakori használat                | pillanatkép     | konfigurációk, könyvtárak |

 

Berus