Milyen fájlmód jelzi, hogy a fájl szimbolikus link (symlink)?


Felhasználási esetem a szimbolikus észlelés linkek egy git adattárban (és annak történetében). Az volt a benyomásom, hogy a symlink a fájl módja miatt egy symlink, és ezt a fájl módot állítja be a chmod eszköz.

Megjegyzések

  • Lásd: superuser.com/questions/303040/…
  • Úgy tűnik, hogy a kérdésemet jobban feltették ' milyen fájlmódok a git '. >
  • stackoverflow.com/questions/15465436/git-how-to-handle-symlinks
  • chmod engedélybiteket állít be (rwx és sticky / setuid / setgid bitek, …): ezt hívjuk " módnak ". De úgy tűnik, hogy inkább a fájltípusok ra hivatkozik.
  • @JohnWHSmith szívesen felajánlom egy linket azokhoz a dokumentumokhoz, amelyek megkülönböztetik a fájlmódok és a fájltípusok különbségeit! : D

Válasz

A fájlmódok két különböző fogalmat fednek le: a fájltípusokat és a fájlengedélyeket. A fájl s módját a st_mode értéke képviseli a stat(2) hívások eredményeként, és a ls -l mindet együtt mutatja be; a részletekért lásd: A UNIX engedélyek és fájltípusok megértése .

A fájl létrehozása után a típusa “nem lehet megváltoztatni. Ezenkívül Linux rendszereken nem adhatja meg a szimbólum linkjeit; csak a cél engedélye számít (és tulajdonképpen a teljes mód, mivel ez határozza meg a symlink viselkedését is). A részletekért lásd: Hogyan vonatkoznak a fájlengedélyek a hivatkozásokra? Mac OS X rendszeren a linkek saját engedélyekkel rendelkezhetnek.

Végül a git egyszerűsített modellt használ, korlátozott számú felismert móddal:

  • 040000 könyvtárhoz
  • 100644 egy normál fájlhoz
  • 100755 egy futtatható fájlhoz
  • 120000 egy szimbolikus linkhez

Ezeket az értékeket olyan parancsokkal láthatja, mint a git cat-file -p "master^{tree}"; a részletekért lásd: Pro Git .

Válasz

Milyen fájlmód jelzi, hogy a fájl egy szimbolikus link (symlink)?

Az ellenőrizendő POSIX API ha egy fájl egy symlink, akkor a S_ISLNK makrót használja.

A glibc-ben a S_ISLNK a következőképpen definiálva:

#define __S_IFMT 0170000 /* These bits determine file type. */ #define __S_IFLNK 0120000 /* Symbolic link. */ #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) #define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK) 

ie egy fájl egy symlink if ((mode & 0170000) == 0120000) (legalább GNU / Linux rendszeren).

Válasz

A symlink (bár egyes fájlrendszerek eltérően kezelik a hivatkozásokat) egy inode tábla bejegyzés, amely ugyanarra a helyre mutat, mint egy másik fájl (vagy könyvtár).

Például, ha foo inode 1234, akkor bar (a symlink to foo) inode 1234.

bar nem igazán létezik, csak egy “igazi” fájl.

Symlinks általában nem rendelkeznek engedélyekkel azon fájl engedélyein kívül, amelyre mutatnak. Tehát bar"s engedélyek “ugyanaz” as foo"s. A bar (a szimlink) engedélyeket csak foo (a valódi fájl).

Ennek ellenére nagyon magas szintű nézetet mutat. A különböző fájlrendszerek eltérően kezelik a hivatkozásokat. A különböző eszközök eltérően kezelik a symlinks t. Egyes fájlrendszerek “megjelölik” symlinks és speciálisan kezeli őket, de egyesek nem.

Például chmod a Linux oldalon nem változtatja meg a symlinks engedélyeket, de az OSX oldalon elérheti. Mindkét esetben a valódi fájlengedélyek megváltoznak.

Nem gondolok egyetlen rendszerre sem (nem “t” azt jelenti, hogy “nincs odakinn”, ahol egy symlink rendelkezik a valódi fájltól elkülönített engedélyekkel.

Megjegyzések

  • Nem, a symlink egy fájltípus (" minden egy " fájl), amely fájlnevet tartalmaz, nem pedig általános- céladatok. Ez a fájlnév általában egy létező fájlra utal – amely ' a szimbolikus hivatkozások teljes pontját jelenti, de ez nem garantáltan igaz. Igen, egy symlink (mint minden más) típusú fájl) rendelkezik inóddal. Nem, egy szimbolikus link és az a fájl, amelyre külön inódok tartoznak, különböző inódszámokkal. A Hard linkeknek ugyanaz az inode, és így ugyanaz az inode szám ber.
  • Nos, magas szintűnek szánták, de a modern rendszerek nem ' nem készítenek fájlt a merevlemezen, az inode tábla tartalmazza a karakterláncot, és nincs valós fájl létre. Azt hiszem, ' úgy hívják, hogy " gyors symlink "
  • Ha ' foo ' és ' bar ' mindkettő az 1234-es csomópont mutatója, akkor ' HARD linkeket jelentenek, nem pedig szimpla linkeket. Ha a " bar " SYMlink lenne, akkor szó szerint ez lenne a karakterlánc " foo " (vagy akár a foo elérési útja) csomópont helyett. Valójában létrehozhat egy olyan symlinket, amely ' egyáltalán nem mutat értelmes helyre, például ln -s 'this is not a real file' bar
  • Továbbá: A BSD-nek (amely magában foglalja a Mac OS X-et is) van egy lchmod () rendszerhívása, amely lehetővé teszi a symlink engedélyeinek beállítását. Fogalmam sincs, mi ennek a használata.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük