I collegamenti fisici vengono conteggiati come file normali?


21

Mi chiedevo se ci fosse un modo per registrarlo, ma dal momento che la maggior parte dei moderni motori di ricerca non funzionano bene con frasi lunghe più di 5 parole, ho bisogno di aiuto su questo.

Mi chiedevo questo perché sto realizzando uno script bash che deve registrare i file come determinati tipi e prendere le decisioni di conseguenza. Tecnicamente questo non è importante per il mio progetto, ma ero curioso.

Inoltre, se sono considerati file regolari, allora c'è un modo per verificare se questi file sono hard link senza dover analizzare ls -i? E c'è un modo per verificare se qualche file arbitrario, X, è collegato a qualche altro file arbitrario, Y, senza usare il find -icomando?


5
Con hard link "X" non è realmente collegato a "Y". "X" e "Y" sono lo stesso file.
Giordano,

6
Tutti i "file regolari" in una directory sono hard link. Alcuni di questi file ne hanno più di uno.
Andrew Henle,

@AndrewHenle Wow, buon punto. Questo è esattamente il tipo di cosa che stavo cercando, quindi grazie.
Mr. Minty Fresh,

2
@ Mr.MintyFresh In particolare, non c'è distinzione tra "originale" e "collegamento" come esiste per i collegamenti simbolici.
Casuale 832

Risposte:


38

Nei sistemi in stile Unix, la struttura dei dati che rappresenta gli oggetti del filesystem (in altre parole, i dati su un file), è memorizzata in quello che viene chiamato un "inode".

Il nome di un file è solo un collegamento a questo inode e viene definito "collegamento reale". Non vi è alcuna differenza tra il nome assegnato a un file e qualsiasi collegamento successivo. Quindi la risposta è "sì": un hard link è un file normale e, in effetti, un file normale è un hard link.

Il lscomando ti mostrerà quanti hard link ci sono al file.

Per esempio:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Qui abbiamo creato un file chiamato /tmp/hello.txt. L' 1output da ls -lindica che esiste 1 link reale a questo file. Questo hard link è il nome file stesso /tmp/hello.txt.

Se ora creiamo un altro collegamento reale a questo file:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

ora puoi vedere che entrambi i nomi dei file indicano che ci sono 2 hard link al file. Nessuno di questi è il nome file "corretto", sono entrambi ugualmente validi. Possiamo vedere che entrambi puntano allo stesso inode (in questo caso, 5374043):

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

C'è un malinteso comune sul fatto che questo sia diverso per le directory. Ho sentito gente dire che il numero di collegamenti restituiti da lsuna directory è il numero di sottodirectory, incluso .e ..che non è corretto . O almeno, mentre ti darà il numero corretto, è giusto per le ragioni sbagliate!

Se creiamo una directory e facciamo una ls -ldotteniamo:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

Questo mostra che ci sono 2 hard link a questa directory. Questi sono:

/tmp/testdir
/tmp/testdir/.

Nota che non/tmp/testdir/.. è un collegamento a questa directory, è un collegamento a . E questo ti dice perché il "numero di sottodirectory" funziona. Quando creiamo una nuova sottodirectory:/tmp

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir

ora puoi vedere che ci sono 3 hard link alla /tmp/testdirdirectory. Questi sono:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

Quindi ogni nuova sottodirectory aumenterà il conteggio dei collegamenti di uno, a causa della ..voce che contiene.


Capisco come funzionano metadati, inode e hard linking. Avevo solo bisogno di chiarire se il file hard link era conteggiato come un file normale. Questo mi mostra solo che la risposta è 'sì' a causa della colonna dedicata a questo, che indica implicitamente che questo è nativo di tutti i file. Mi dispiace, ma dovrò sottovalutare questo :(
Mr. Minty Fresh

Va bene, sono sicuro che saranno utili informazioni per qualcun altro.
Seumasmac,

Interessante modifica con il sistema hardlink dotglob, non ho mai saputo che lo fa.
Mr. Minty Fresh,

Ho chiarito il paragrafo dei collegamenti regolari == file normali.
Seumasmac,

1
In particolare come la frase: "Nessuno di questi è il nome file" corretto ", sono entrambi ugualmente validi." Questo è un ingrediente cruciale per la comprensione degli hard link. Molto ben scritto.
Wildcard il

4

I collegamenti fisici vengono conteggiati come file normali?

I collegamenti fissi contano come qualsiasi cosa siano collegati. Puoi collegarti a qualsiasi cosa sullo stesso filesystem.

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

Ogni collegamento fisico a qualsiasi cosa è equivalente, l'oggetto sottostante rimane attivo fintanto che esiste un collegamento (modifica: non simbolico) (anche un descrittore di file aperto, per il quale ho imbarazzante causa di gratitudine).

Il sistema imporrà le regole sui collegamenti alle directory, otterrai un collegamento con nome a una directory e il sistema aggiungerà automaticamente il suo .collegamento incorporato e tutti i collegamenti delle sottodirectory ..(nota che .in ls ha due collegamenti) ma questo è un controllo esplicito, su alcuni modded gli utenti con privilegi di sistema che promettono che promettono di non creare loop possono aggiungere essi stessi nuovi collegamenti. Al filesystem non importa, può rappresentare bene i grafici di directory arbitrari, ma nessuno vuole gestirli.

Esistono (un sacco di file system non unix) che non funzionano in questo modo, inclusi alcuni che chiamano ciò che offrono come "collegamenti fisici" sostitutivi. OS X ha raccolto un equivalente su HFS + (che non li ha nativamente) se ricordo bene, non so quanto fedelmente conservi la semantica qui.


cosa fa ./tsockeffettivamente, comunque?
Mikeserv,

@mikeserv È il programma make-a-socket sopra, rilascia semplicemente un collegamento socket chiamato "socket" nella sua directory corrente.
jillill

ok, ma forse avrei dovuto chiarire quanto poco so delle prese. penso di aver capito abbastanza bene i collegamenti e quindi dà alla stessa presa un nuovo nome, giusto? che non ha alcun significato speciale per prese o altro, sì? scusa per la mia ignoranza.
Mikeserv,

1
@mikeserv Un socket è un'entità puramente runtime. socket()crea un socket effettivo, gli bind()dà un nome specifico, connect()collega un socket creato a un socket denominato. Diversi tipi di socket usano diversi tipi di nomi, ad esempio i socket Internet usano indirizzi Internet, ma condividono tutti le API comuni (incluso read()e write(), mi rende triste che tu non possa open()un socket del filesystem e che il sistema operativo o la libc facciano socket()e connect()per te) . man 7 socketha di più, tutti i protocolli di rete creano una manpage irrequieta.
jillill

1
@mikeserv Vedi, posso scrivere pty e pts, e probabilmente anche ptmx in una buona giornata, ma questo è tutto. :-) almeno il nodo 5,0 funziona ovunque trovo, è il tipo di dispositivo control-tty. L'ho preso con solo ls -l / dev / tty, immagino di essere stato fortunato lì.
jillill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.