it-swarm.com.de

Was ist das Konzept zum Erstellen einer Datei mit null Byte unter Linux?

Wenn ich folgendes mache:

touch /tmp/test

und dann durchführen

ls -la /tmp/

Ich konnte die Datei test mit Bytes im Verzeichnis sehen.

Aber wie geht das Betriebssystem mit einem Konzept von Bytes um? Wenn ich es in Laienbegriffen formuliere:

0 Bytes ist überhaupt kein Speicher, daher wird nichts erstellt.

Die Erstellung einer Datei, muss oder sollte mindestens bestimmten Speicher benötigen, Recht?

32
Shan-Desai

Eine Datei besteht (ungefähr) aus drei verschiedenen Dingen:

  • Ein "Inode", eine Metadatenstruktur, die verfolgt, wem die Datei gehört, Berechtigungen und eine Liste von Blöcken auf der Festplatte, die die Daten tatsächlich enthalten.
  • Ein oder mehrere Verzeichniseinträge (die Dateinamen), die auf diesen Inode verweisen
  • Die eigentlichen Datenblöcke selbst

Wenn Sie eine leere Datei erstellen, erstellen Sie nur den Inode und einen Verzeichniseintrag, der auf diesen Inode verweist. Gleiches gilt für Dateien mit geringer Dichte (dd if=/dev/null of=sparse_file bs=10M seek=1).

Wenn Sie Hardlinks zu einer vorhandenen Datei erstellen, erstellen Sie einfach zusätzliche Verzeichniseinträge, die auf denselben Inode verweisen.

Ich habe die Dinge hier vereinfacht, aber Sie haben die Idee.

63
xhienne

touch erstellt ein inode und ls -i oder stat zeigt Informationen zum Inode an:

$ touch test
$ ls -i test
28971114 test
$ stat test
  File: ‘test’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 28971114    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/1000)   Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
 Birth: -

Beachten Sie, dass test 0 Blöcke verwendet. Zum Speichern der angezeigten Daten verwendet der Inode einige Bytes. Diese Bytes werden in der Inode-Tabelle gespeichert. Auf der ext2-Seite finden Sie ein Beispiel für eine Inode-Struktur .

24
ctx

ls (oder auch der Systemaufruf stat(2)) gibt die Größe des Inhalts der Datei an. Wie viel Speicherplatz das Dateisystem für die Buchhaltung benötigt, gehört nicht dazu, und als Implementierungsdetail sollten sich Programme im Allgemeinen nicht darum kümmern oder gar wissen. Wenn Sie die Implementierungsdetails sichtbar machen, wird die Dateisystemabstraktion weniger nützlich.

19
ilkkachu

Die Datei selbst belegt keinen Speicherplatz, das Dateisystem jedoch, indem sie den Dateinamen, den Speicherort, die Zugriffsrechte darauf und dergleichen speichert.

9
Patrick Bucher

Einfache Antwort: Weil es so definiert ist.

Längere Antwort: Es ist so definiert, weil einige Operationen konzeptionell einfacher sind:

  • Wenn eine Datei 20 Buchstaben "A" enthält und Sie alle "A" entfernen, wird die Datei 20 Byte kürzer. Dieselbe Operation für eine Datei, die nur aus "AAAAAAAAAAAAAAAAAAAA" bestand, müsste sich mit dem Sonderfall einer verschwindenden Datei befassen.
  • In der Praxis müsste das Löschen der letzten Zeile einer Textdatei in einem speziellen Fall erfolgen.
  • Texteditoren, die regelmäßig ein Backup erstellen, benötigen einen Sonderfallcode, um die Situation zu bewältigen, in der der Benutzer möglicherweise die letzte Zeile löscht, zum Mittagessen geht und dann zurückkommt und eine weitere Zeile hinzufügt. Weitere Komplikationen treten auf, wenn einige andere Benutzer in der Zwischenzeit eine Datei mit diesem Namen erstellt haben.

Sie können noch mehr tun: * Fehlerprotokolldateien werden in der Regel leer erstellt und nur dann ausgefüllt, wenn ein Fehler auftritt. * Um herauszufinden, wie viele Fehler aufgetreten sind, zählen Sie die Anzahl der Zeilen in den Protokolldateien. Wenn die Protokolldatei leer ist, ist die Anzahl der Fehler Null, was durchaus sinnvoll ist. * Manchmal sehen Sie Dateien, in denen der gesamte relevante Text im Dateinamen enthalten ist, z. this-is-the-logging-directory. Dies verhindert, dass übermäßige Administratoren leere Verzeichnisse nach der Installation löschen, und verhindert auch Fehler, bei denen ein Programm oder ein Benutzer versehentlich eine Datei erstellt, in der das Programm später ein Verzeichnis sehen möchte. Das Programm git (und andere) ignorieren in der Regel leere Verzeichnisse. Wenn ein Projekt/Administrator/Benutzer einen Datensatz haben möchte, dass das Verzeichnis vorhanden ist, obwohl es (noch) keinen nützlichen Inhalt enthält, wird möglicherweise ein angezeigt leere Datei mit dem Namen empty oder empty.directory.

Keine Operationen werden komplizierter:

  • Verketten von Dateien: Dies ist nur ein No-Op mit einer leeren Datei.
  • Suchen nach einer Zeichenfolge in einer Datei: Dies wird durch den Standardfall "Wenn die Datei kürzer als der Suchbegriff ist, darf sie den Suchbegriff nicht enthalten" abgedeckt.
  • Lesen aus der Datei: Programme müssen sich damit befassen, das Ende der Datei zu erreichen, bevor sie das erreichen, was sie erwartet haben. Auch hier erfordert der Fall einer Datei mit der Länge Null keine zusätzlichen Überlegungen für den Programmierer: Er wird nur das Ende der Datei erreichen -Datei von Anfang an.

Im Fall von Dateien kommt der Aspekt "Es wird irgendwo eine Datei aufgezeichnet" (Inode und/oder Dateiname) zu den obigen Überlegungen hinzu, aber Dateisysteme würden dies nicht tun, wenn leere Dateien nutzlos wären.

Im Allgemeinen gelten alle oben genannten Gründe mit Ausnahme derjenigen, die sich auf Dateinamen beziehen, auf Sequenzen. Vor allem für Zeichenfolgen, bei denen es sich um Zeichenfolgen handelt: Zeichenfolgen mit der Länge Null sind in Programmen weit verbreitet. Zeichenfolgen sind auf Benutzerebene normalerweise nicht zulässig, wenn sie keinen Sinn ergeben: Ein Dateiname ist eine Zeichenfolge, und die meisten Dateisysteme lassen keine leere Zeichenfolge als Dateinamen zu. Intern kann das Programm beim Erstellen von Dateinamen aus Fragmenten eine leere Zeichenfolge als eines der Fragmente haben.

5
toolforger

Mit der einfachsten Analogie:

Vergleichen wir eine Datei beispielsweise mit einem Glas Wasser.

'touch/tmp/test' ähnelt dem Erstellen eines leeren Glases ohne Wasser. Das Glas ist leer, also ist seine Größe Null. Aber das Glas existiert.

Im Dateisystem-Sprachgebrauch sind das Glas die Metadaten, während der Inhalt des Glases die Daten sind. Die Metadaten enthalten alle möglichen Dinge, wie in den vorherigen Beiträgen erwähnt.

Dateien mit der Größe Null können nützlich sein. Ein Beispiel ist die Verwendung als Brotkrume, wobei ihre bloße Existenz verwendet werden kann, um einen Zustand anzuzeigen (d. H. Wenn die Datei existiert: dann etwas tun; wenn nicht: ignorieren).

1
El Stepherino

Stellen Sie sich das so vor: Angenommen, ein Programm verfolgt SQL-Abfragen, die an Ihren Server gesendet wurden. Das Programm möchte angeben, dass Anforderungen in einer Nur-Text-Datei protokolliert werden, es wurden jedoch noch keine Anforderungen protokolliert. Wie soll das aussehen? Ich würde argumentieren, dass es sich bei /var/log/acme-sql-server/queries.log Um eine Datei mit der Größe Null handeln sollte. Auf diese Weise können Sie herausfinden, wann die Protokollierung gestartet wurde (Erstellungszeit der Datei), wann sie zuletzt aktualisiert wurde (dh wann sie erstellt wurde), wie viele Abfragen aufgezeichnet wurden (Anzahl der Zeilenumbrüche in Datei = 0) und wer die Protokollierung durchführt (Acme SQL Server). In solchen Fällen ist es hilfreich, das Konzept einer leeren Datei zu haben, die dennoch an einem bestimmten Speicherort vorhanden ist.

0
Gaurav