So erkennen Sie, welche Datei original ist, wenn ein fester Link erstellt wird

34

Zum Beispiel habe ich eine Datei myold_file. Dann lnerstelle ich einen Hardlink als mylink:

ln myold_file mylink

Dann ls -akann ich , selbst wenn ich es benutze , nicht sagen, welches das alte ist.

Gibt es sowieso etwas zu erzählen?

BufBills
quelle
2
Gegenfrage: Wenn ja ls > a; ln a b; rm a; ln b c, welche ist "origineller" als die andere? aist weg, Sie bleiben mit bund c...
Glglgl
2
Was versuchst du zu erreichen? Was versuchst du zu erreichen? Es gibt kein "Original" als solches. Eine Datei ist ein Inode, der Metadaten und eine Sammlung von Blöcken enthält, die Daten enthalten. Ein Verzeichnis kann einen Link zur Datei enthalten. Dieser Link ist der Dateiname und die Inode-Nummer. Sie können eine beliebige Anzahl von Links zu einer Datei erstellen. Dateien dürfen niemals weniger als einen Link haben.
Johan
Ausführliche Erklärung der akzeptierten Antwort auf diese Frage: Siehe die akzeptierte Antwort auf diese Frage .
Utku

Antworten:

93

Dies ist nicht möglich, da es sich buchstäblich um dieselbe Datei handelt, die nur über verschiedene Pfade erreichbar ist. Der erste hat keinen besonderen Status.

Jenny D
quelle
4
Dies ist eindeutig die richtige Antwort: Die Frage des OP beruht auf einem Missverständnis.
Daniel Earwicker
8
@Adnan Eigentlich nein: Die beiden festen Links sind dieselbe Datei. Es sind verschiedene Verzeichniseinträge. Die Terminologie von Jenny D ist korrekt.
Gilles 'SO- hör auf böse zu sein'
1
@ Gilles Ich sehe nicht, wie es richtig sein kann. Zwei feste Links sind nicht zwei Dateien . harte Links sind keine Dateien. Sie weisen damit verknüpfen , auf die gleiche Datei (die die physische Position auf der Platte ist). Sagen, dass "zwei harte Verbindungen sind ist falsch zu wahrsten Sinne des Wortes dieselbe Datei sind".
Adi
1
@JennyD Und das ist so ziemlich die einzige Art, wie ich hörte, wie "harter Link" verwendet wird. Ein Dateisystemzeiger auf eine Inode. Nun, ich denke wir sind alle falsch und richtig. Ich werde aufhören, darüber zu streiten, da es sinnlos ist. Ihre Antwort scheint mir richtig zu sein, Sie haben eine +1 von mir, und ich werde es dabei belassen.
Adi
5
Zu sagen, dass ein fester Link "ist" eine Datei, die Dinge verschiedener Kategorien vergleicht, was technisch inkorrekt ist. Aber da wir im Allgemeinen sagen, " .bashrcist eine Datei, die ... enthält", wenn wir meinen, "der relative Pfad .bashrcbezieht sich auf eine Datei, die ... enthält", handelt es sich um eine häufige Verschmelzung von Kategorien, und wir sollten verstehen, wann immer man darauf verweist Ein Pfad oder ein Verzeichniseintrag ist eine Datei. Damit ist die Datei gemeint, auf die sie verweist. Nach diesem Verständnis können zwei feste Verknüpfungen dieselbe Datei sein. Wenn sie diese Konvention zugunsten der formalen Sprache ablehnen, können sie das nicht. Beide Haltungen haben ihren Platz :-)
Steve Jessop
16

Es gibt keinen direkten, sauberen (zuverlässigen) Weg, dies zu tun. Unter geeigneten Umständen kann dies jedoch möglich (oder zumindest wahrscheinlich) sein. Das Problem ist, dass es zwei feste Links gibt, aber nur eine Datei. Änderungen, Modifikationen und (möglicherweise) Erstellungszeitpunkte werden nur für Dateien (Inodes) gespeichert, nicht jedoch für Verzeichniseinträge (die festen Links). Daher können die gewünschten Informationen nur Sekundäreffekten entnommen werden, die durch Vorgänge, die nicht mit der Datei zusammenhängen, leicht zerstört werden können. Und Sie können nicht einmal sehen, ob es zerstört wurde. Das können Sie aus den betrieblichen Gegebenheiten nur erkennen, wenn Sie diese genau kennen.

Die Erstellung einer festen Verknüpfung ist eine Schreiboperation in das Verzeichnis, das die Verknüpfung enthält. Dadurch werden die Verzeichnisse aktualisiert mtime. Also wenn

  1. Die Links befinden sich in verschiedenen Verzeichnissen

  2. Wenn Sie wissen, dass keines dieser Verzeichnisse geändert wurde (Datei hinzugefügt, gelöscht, umbenannt oder Metadaten geändert), nachdem der zweite feste Link erstellt wurde, können Sie einfach die mtimes der Verzeichnisse vergleichen.

Sonderfall: Wenn eines der Verzeichnisse ein mtimevor der Datei (inode) hat mtimeund Sie sicher sein können, dass die Datei nicht später als einen kurzen Moment nach ihrer Erstellung geschrieben wurde, ist die Verknüpfung dieses Verzeichnisses die ältere.

Wenn sich die Links im selben Verzeichnis befinden (was in Ihrer Frage der Fall zu sein scheint), wird es schlimmer. Dann können Sie verwenden

ls -lU

um sich einen Eindruck von der Reihenfolge zu verschaffen, in der die Einträge erstellt wurden. Dies muss nicht die richtige Reihenfolge sein, da Einträge möglicherweise gelöscht werden, sodass neue Einträge in der Mitte der Verzeichnisliste vorgenommen werden. Und wie Gilles betonte, funktioniert es mit neueren Dateisystemen überhaupt nicht.

Hauke ​​Laging
quelle
2
Keine Erwähnung von Selinux, Audit Trails oder Spionage im Dateisystemjournal ??? grinsen Ohne Audit-Trail gibt es keine Möglichkeit zu wissen - alles andere ist eine kalkulierte Vermutung
Ricky Beam
1
@mikeserv Wenn du andere auf diese Weise unterrichten willst, solltest du zumindest lernen, richtig zu zitieren. Es steht nicht "welche Datei" in der Frage. Und selbst wenn dies der Fall wäre, wäre dies nur ein Wortlautproblem, und wenn man ein wenig über das Verständnis der Frage nachdenkt, kann man leicht erkennen, worum es wirklich geht.
Hauke ​​Laging
4
Der Verzeichnis-Mtime-Trick funktioniert, wenn die Umstände stimmen (was selten vorkommt). So wie Sie es präsentieren, werden Sie jedoch manchmal zu dem gegenteiligen Schluss kommen. Das Verzeichnis mtime ist nur dann eine sinnvolle Angabe, wenn es der ctime der Datei entspricht. Bei ls -lUmodernen Dateisystemen (ext4, btrfs, zfs) funktioniert der Trick jedoch nicht, da Einträge in der Erstellungsreihenfolge überhaupt nicht angezeigt werden.
Gilles 'SO- hör auf böse zu sein'
2
@mikeserv - die Frage des OP beruht auf einem Missverständnis. Wenn dies der rm myold_fileFall mylinkwäre, würden sie immer noch existieren und einwandfrei funktionieren, da dies ein ebenso guter Eintrag ist, der sich auf dieselbe zugrunde liegende Inode bezieht. Erst wenn beide gelöscht wurden, kann das System den Inode verwerfen. Sobald zwei Dateisystemeinträge, die auf dieselbe Datei verweisen, durch feste Verknüpfung erstellt wurden, sind sie gleichwertig. (Beachten Sie, dass "Datei" hier "eine Inode" bedeutet, die die Daten für eine Datei im Gegensatz zu einem Verzeichnis enthält.) Siehe: de.wikipedia.org/wiki/Inode
Daniel Earwicker
1
-1 weil, obwohl die Informationen darüber, wie sich das Verzeichnis in einigen Dateisystemen beim Aktualisieren der Tabellen ändert, diese Antwort das in der Frage vorhandene Missverständnis nicht ausräumen kann, dass "Originaldatei" bei mehreren Hardlinks keine Eigenschaft ist zu einer einzelnen Inode. In diesem Sinne ist es anekdotisch interessant, was die meisten Leute, die auf dieser Frage landen, über das grundlegende Konzept von Hardlinks lernen sollten. Bei diesem Problem fehlt es nicht an einer "direkten, sauberen Methode", sondern an der Tatsache, dass es überhaupt kein "es" gibt .
Caleb
10

Wenn Sie sich auf die letzte Änderungszeit der Verzeichnisse verlassen und nicht wissen, wie und wann diese Verzeichnisse geändert werden, führt die Verwendung von mtime zu einem gewissen Prozentsatz von Zeitfehlern. Das Problem hierbei ist, dass die Datei im Dateisystem durch einen Inode und nicht durch einen Verzeichniseintrag dargestellt wird. Der Verzeichniseintrag (Dateiname) zeigt auf den Inode, nicht auf die Datei.

Ich denke, ich würde ein bisschen nachsehen, warum ich wissen muss, welcher Verzeichniseintrag älter ist und wie ich vermeiden kann, dass ich das wissen muss.

Melinda
quelle
8

Ich denke, diese Frage ist (ziemlich vernünftig) falsch, was eine harte Verbindung wirklich ist. Ich denke jedoch, dass die direkteste Antwort "Sie sind beide" ist .

Unix-Dateisysteme speichern normalerweise den eigentlichen Dateiinhalt und die eigentlichen Daten in i-Nodes. Diese haben keinerlei Pfad, die Pfade stehen dann in einer Beziehung zu diesen i-Nodes. Nehmen Sie als Analogie eine Person, die zwei Namen trägt, Bob und Joe. Man kann nicht sagen, dass Bob älter ist als Joe oder umgekehrt, es sind nur Namen für dieselbe Person.

Wenn Sie das Konzept einer "ursprünglichen" und einer neuen Datei beibehalten möchten, suchen Sie wahrscheinlich stattdessen nach einem symbolischen Link. Dies ist eher ein Alias, nur eine Anweisung an das Betriebssystem, dass auf einem Pfad so vorgegangen werden soll, als ob sie waren zu einem anderen, ohne die Dateistruktur darunter zu ändern. (Diese können Sie mit "ln -s file link" erstellen.

Wertigkeit
quelle
Weißt du, Bob / Joe kann sehr empfindlich auf sein Alter reagieren ... Der Hard / Soft-Link-Vergleich ist gut - vor allem, wenn man bedenkt, dass ein Hard-Link nur einen Eintrag in eine Verzeichnisdatei bekommt - eine bereits vorhandene Inode - aber ein Soft-Link ist eine Datei für sich und erhält daher einen eigenen Inode. In beiden Fällen ist der Änderungszeitpunkt jedoch nur für die verknüpfte Datei relevant, da die einzigen Änderungen, die an einer Verknüpfung von Belang vorgenommen werden können, nur das Erstellen / Löschen sind.
mikeserv
2

Der Kern der Antwort, die oben von mehreren anderen gegeben wurde, ist, dass jeder Dateiname eine feste Verknüpfung zu einer Datei ist. Es gibt kein echtes Original, nur möglicherweise ein erstes.

Stellen Sie sich ein Verzeichnis als eine Tabelle vor, in der Dateinamen und Inode-Nummern aufgelistet sind.

Jede feste Verbindung, einschließlich der ersten, ist ein Eintrag in einem Verzeichnis, das der Inode-Nummer einen "Dateinamen" zuweist, damit Sie unter diesem Namen auf die Datei zugreifen können.

Die Datei ist eine Sammlung von Blöcken auf der Festplatte, die von in einem Inode gespeicherten Metadaten verwaltet und verfolgt werden. Eine Datei hat eine Inode-Nummer.

Der Zugriff auf die Daten einer Datei über den Dateinamen erfolgt in drei Schritten: Der Dateiname wird im Verzeichnis nachgeschlagen, um die Inode-Nummer zu erhalten. Auf den Inode wird dann Bezug genommen, um den relevanten Plattenblock (oder die Blöcke) zu finden, die die Daten enthalten. Dann werden diese Blöcke endlich gelesen / geschrieben.

Das mit nach Hause nehmen von allem, was im Grunde genommen so ist: Es gibt absolut keinen Unterschied zwischen dem Zugriff auf Dateiinhalte mit dem ersten ("Original") oder später erstellten harten Links.

Johan
quelle