Zählen harte Links als normale Dateien?

21

Ich habe mich gefragt, ob es eine Möglichkeit gibt, dies zu registrieren, aber da die meisten modernen Suchmaschinen mit Phrasen von mehr als 5 Wörtern nicht gut funktionieren, brauche ich Hilfe.

Ich habe mich das gefragt, weil ich ein Bash-Skript mache, das Dateien als bestimmte Typen registrieren und entsprechende Entscheidungen treffen muss. Das ist technisch nicht wichtig für mein Projekt, aber ich war neugierig.

Gibt es eine Möglichkeit, zu überprüfen, ob diese Dateien fest verknüpft sind, ohne sie analysieren zu müssen, wenn sie als reguläre Dateien betrachtet werden ls -i? Und gibt es eine Möglichkeit zu überprüfen, ob eine beliebige Datei, X, fest mit einer anderen beliebigen Datei, Y, verknüpft ist, ohne den find -iBefehl zu verwenden?

Mr. Minty Fresh
quelle
5
Bei harten Links ist "X" nicht wirklich mit "Y" verknüpft. "X" und "Y" sind dieselbe Datei.
Jordanien
6
Alle "regulären Dateien" in einem Verzeichnis sind Hardlinks. Einige solche Dateien haben mehr als eine.
Andrew Henle
@ AndrewHenle Wow, guter Punkt. Das ist genau das, wonach ich gesucht habe, also danke.
Mr. Minty Fresh
2
@ Mr.MintyFresh Insbesondere gibt es keine Unterscheidung zwischen "Original" und "Link" wie bei symbolischen Links.
Random832

Antworten:

38

In Unix-artigen Systemen wird die Datenstruktur, die Dateisystemobjekte darstellt (mit anderen Worten, die Daten zu einer Datei), in einer sogenannten "Inode" gespeichert.

Ein Dateiname ist nur eine Verknüpfung zu diesem Inode und wird als "harte Verknüpfung" bezeichnet. Es gibt keinen Unterschied zwischen dem Vornamen einer Datei und einem nachfolgenden Link. Die Antwort lautet also "Ja": Ein fester Link ist eine reguläre Datei, und tatsächlich ist eine reguläre Datei ein fester Link.

Der lsBefehl zeigt Ihnen, wie viele feste Links zu der Datei vorhanden sind.

Beispielsweise:

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

Hier haben wir eine Datei namens erstellt /tmp/hello.txt. Das 1in der Ausgabe von ls -lgibt an, dass 1 fester Link zu dieser Datei vorhanden ist. Dieser feste Link ist der Dateiname /tmp/hello.txt.

Wenn wir jetzt einen weiteren festen Link zu dieser Datei erstellen:

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

Sie können jetzt sehen, dass beide Dateinamen darauf hinweisen, dass es zwei feste Links zu der Datei gibt. Keiner von beiden ist der "richtige" Dateiname, beide sind gleichermaßen gültig. Wir können sehen, dass beide auf dieselbe Inode verweisen (in diesem Fall 5374043):

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

Es gibt ein weit verbreitetes Missverständnis, dass dies für Verzeichnisse anders ist. Ich habe gehört, dass die Anzahl der von lseinem Verzeichnis zurückgegebenen Links der Anzahl der Unterverzeichnisse entspricht, einschließlich .und ..was falsch ist . Oder zumindest, obwohl es Ihnen die richtige Nummer gibt, ist es aus den falschen Gründen richtig!

Wenn wir ein Verzeichnis erstellen und ein tun, erhalten ls -ldwir:

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

Dies zeigt, dass es 2 feste Links zu diesem Verzeichnis gibt. Diese sind:

/tmp/testdir
/tmp/testdir/.

Beachten Sie, dass /tmp/testdir/..ist nicht ein Link zu diesem Verzeichnis, es ist ein Link zu /tmp. Und das sagt Ihnen, warum die Sache "Anzahl der Unterverzeichnisse" funktioniert. Wenn wir ein neues Unterverzeichnis erstellen:

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

Sie können jetzt sehen, dass es 3 feste Verbindungen zum /tmp/testdirVerzeichnis gibt. Diese sind:

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

Jedes neue Unterverzeichnis erhöht also die Anzahl der Links aufgrund des ..darin enthaltenen Eintrags um eins .

seumasmac
quelle
Ich verstehe, wie Metadaten, Inodes und Hardlinking funktionieren. Ich musste nur klären, ob die fest verknüpfte Datei als reguläre Datei gezählt wurde. Dies zeigt mir nur, dass die Antwort "Ja" ist, da die entsprechende Spalte implizit angibt, dass dies für alle Dateien gilt. Tut mir leid, aber ich muss Folgendes ablehnen :(
Mr. Minty Fresh
Das ist in Ordnung, ich bin sicher, dass es nützliche Informationen für jemand anderen sein wird.
Seumasmac
Interessante Bearbeitung mit dem Dotglob-Hardlink-System, ich wusste nie, dass es das tut.
Mr. Minty Fresh
Ich habe den Abschnitt über harte Links == reguläre Dateien geklärt.
Seumasmac
1
Besonders wie der Satz: "Keiner von diesen ist der 'richtige' Dateiname, sie sind beide gleichermaßen gültig." Dies ist ein wesentlicher Bestandteil für das Verständnis von Hardlinks. Sehr schön geschrieben.
Wildcard
4

Zählen harte Links als normale Dateien?

Harte Links zählen als das, womit sie verbunden sind. Sie können auf alles im selben Dateisystem verlinken.

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  

Jeder Hardlink zu irgendetwas ist gleichwertig, das zugrunde liegende Objekt bleibt bestehen, solange es überhaupt einen (edit: nicht symbolischen) Link dazu gibt (sogar einen offenen Dateideskriptor, für den ich peinlich bin, sehr dankbar).

Das System erzwingt Regeln für Verzeichnisverknüpfungen, Sie erhalten eine benannte Verknüpfung zu einem Verzeichnis und das System fügt automatisch die eingebettete .Verknüpfung und die Verknüpfungen aller Unterverzeichnisse hinzu ..(beachten Sie, dass .in der obigen Liste zwei Verknüpfungen aufgeführt sind), dies ist jedoch bei einigen modifizierten eine explizite Prüfung Benutzer mit Systemprivilegien, die versprechen, keine Schleifen zu bilden, können selbst neue Links hinzufügen. Das Dateisystem kümmert sich nicht darum, es kann beliebige Verzeichnisgraphen darstellen, aber niemand will damit umgehen.

Es gibt (viele Nicht-Unix-) Dateisysteme, die auf diese Weise nicht funktionieren, einschließlich einiger, die das, was sie anbieten, als Ersatz für "harte Links" bezeichnen. Wenn ich mich richtig erinnere, hat OS X ein Äquivalent zu HFS + (das sie nicht von Haus aus hat) herausgesucht. Ich weiß nicht, wie genau es die Semantik hier bewahrt.

jdoch
quelle
was macht ./tsockeigentlich überhaupt
mikeserv
@mikeserv Es ist das obige Programm make-a-socket. Es legt einfach einen Socket-Link mit dem Namen "socket" in seinem aktuellen Verzeichnis ab.
8.
ok, aber vielleicht hätte ich klarer machen sollen, wie wenig ich über steckdosen weiß. Ich glaube, ich verstehe Links gut genug und es gibt der gleichen Buchse einen neuen Namen, oder? das hat keine besondere bedeutung für steckdosen oder so, ja? Entschuldigung für meine Unwissenheit.
mikeserv
1
@mikeserv Ein Socket ist eine reine Laufzeitentität. socket()Erstellt einen tatsächlichen Socket, bind()gibt ihm einen bestimmten Namen und connect()verbindet einen von Ihnen erstellten Socket mit einem benannten Socket. Verschiedene Arten von Sockets verwenden verschiedene Arten von Namen, wie zB Internet Sockets verwenden Internet - Adressen, aber sie alle teilen gemeinsame API (einschließlich read()und write()es macht mich traurig , dass Sie nicht können open()ein Dateisystem Sockel und das Betriebssystem oder libc tun socket()und connect()für Sie) . man 7 socketDarüber hinaus sorgen alle Netzwerkprotokolle für eine unruhige Manpage.
8.
1
@mikeserv Sehen Sie, ich kann Pty und Pts buchstabieren, und wahrscheinlich sogar PTMX an einem guten Tag, aber das war es auch schon. :-) Immerhin funktioniert der 5,0-Knoten überall dort, wo ich ihn finden kann. Es ist der Typ des Controlling-Tty-Geräts. Ich habe es mit nur ls -l / dev / tty geschafft, ich schätze, ich habe dort Glück gehabt.
8.