Non si tratta di UNIX/Linux ma dell'implementazione del filesystem - ma sì, Unix/Linux usa gli inode a livello di kernel e le implementazioni del filesystem hanno inode (almeno quelli virtuali).
In generale, i link simbolici sono semplicemente file (btw, le directory sono file anche), che sono:
- bandiera
file-type
nel "inode" che dice al sistema di questo file è un "link simbolico"
- contenuto di file: percorso verso la destinazione - in altre parole: un collegamento simbolico è semplicemente un file che contiene un nome file con una bandiera nell'inode.
I file system virtuali possono avere anche collegamenti simbolici, quindi controllare FUSE o altre sorgenti di implementazione del file system. (Ext2/ext3/ufs..etc)
Quindi,
Se la soluzione un inode in UNIX/Linux?
dipende dall'implementazione del file system, ma sì, generalmente l'inode contiene un "tipo di file" (e proprietari, diritti di accesso, data e ora, dimensioni, puntatori ai blocchi di dati). Ci sono filesystem che non hanno inode
s (in una implmementation fisica) ma hanno solo "inode virtuali" per mantenere la compatibilità con il kernel.
Se sì, il numero di inode sarà lo stesso per target e collegamenti?
No. Di solito, il collegamento simbolico è un file con il proprio inode, (con il tipo di file, propri blocchi di dati, ecc)
Se sì, può nell'inode link può disporre di autorizzazioni diverse da quella di inode del bersaglio (se uno esiste)?
Questo è circa come vengono gestiti i file di collegamento simbolico. Di solito il kernel non consente modifiche alle autorizzazioni di link simbolici e i collegamenti simbolici hanno sempre le autorizzazioni predefinite.Potresti scrivere il tuo filesystem che consentirebbe diversi permessi per i link simbolici, ma ti metteresti nei guai, perché programmi comuni come chmod
non modificano le autorizzazioni sui symlink stessi, quindi rendere inutile un tale file system comunque)
A capire la differenza tra hardlink e link simbolici, dovresti prima capire le directory.
Le directory sono file (con differenziazione di un flag nell'inode) che indicano al kernel, "gestisce questo file come una mappa di file-name
a inode_number
". Gli hard-link sono semplicemente nomi di file che si associano allo stesso inode
. Quindi, se la directory-file contiene:
file_a: 1000
file_b: 1001
file_c: 1000
i mezzi di cui sopra, in questa directory sono 3 file:
- file_a descritti da inode 1000
- file_b descritto da inode 1001 e
- file_c ancora descritto dall'inode 1000 (quindi è un hard link con file_a, non hardlink a file_a - perché è impossibile dire quale nome di file è venuto prima - il sono identici).
Questa è la differenza principale per i collegamenti simbolici, in cui l'inode di file_b
(inode 1001) potrebbe avere contenuti "file_a" e una bandiera che significa "questo è un collegamento simbolico". In questo caso, file_b
sarebbe un collegamento simbolico che punta a file_a
.
E 'readlink()' ti permette di trovare ciò che è memorizzato come il percorso in un determinato link simbolico - ma la vita diventa davvero interessante quando uno degli elementi che il percorso in un collegamento simbolico attraversa è di per sé un link simbolico. Il kernel lo gestisce con aplomb; le persone non necessariamente. C'è anche 'realpath()' che determina un percorso assoluto senza link simbolico per un determinato file. –