Alles, was Sie schon Immer Wissen Wollten, Über inodes auf Linux

0
44
Fatmawati Achmad Zaenuri/Shutterstock

Die Linux-Datei-system beruht auf der inodes. Diese wichtigen Stücke der Datei-system-das Innenleben oft missverstanden. Lassen Sie uns sehen Sie genau, was Sie sind, und was Sie tun.

Die Elemente einer Datei-System

Per definition müssen Sie ein Dateisystem zum speichern von Dateien, und Sie enthalten auch Verzeichnisse. Die gespeicherten Dateien innerhalb der Verzeichnisse, und diese Verzeichnisse können Unterverzeichnisse. Etwas, irgendwo aufnehmen, wo sich alle Dateien befinden sich im Dateisystem, wie Sie heißen, welche Konten Sie gehören, welche Berechtigungen Sie haben, und vieles mehr. Diese Informationen werden Metadaten genannt, weil es Daten, die andere Daten beschreibt.

Im Linux ext4 Dateisystem eine inode-und Verzeichnis-Strukturen arbeiten zusammen, um eine Untermauerung der Rahmen, speichert alle Metadaten für jede Datei und jedes Verzeichnis. Sie stellen die Metadaten für jeden verfügbar, der es erfordert, sei es, dass die kernel -, user-Anwendungen oder Linux-utilities wie ls, stat, und df.

Inodes und Dateisystem Größe

Während es ist wahr, es gibt ein paar Strukturen, ein Datei-system erfordert, viel mehr als das. Es gibt Tausende und Tausende jedes Struktur. Jede Datei und jedes Verzeichnis benötigt eine inode, und da ist jede Datei in einem Verzeichnis, jede Datei ist eine Verzeichnisstruktur erforderlich. Verzeichnis-Strukturen werden auch als Einträge in ein Verzeichnis, oder “dentries.”

Jeder inode hat eine inode-Nummer, die einzigartig ist in der Datei system. Die gleiche inode-Nummer kann angezeigt werden, in der mehr als ein Dateisystem. Allerdings wird die Datei-system-ID und die inode-Nummer kombinieren, um eine eindeutige Kennung, unabhängig davon, wie viele Dateisysteme gemountet sind auf Ihrem Linux-system.

Denken Sie daran, unter Linux nicht mounten einer Festplatte oder partition. Mounten Sie das Dateisystem auf der partition, so ist es einfach, mehrere Datei-Systemen, ohne es zu merken. Wenn Sie mehrere Festplatten oder Partitionen auf einer einzigen Festplatte haben Sie mehr als eine Datei-system. Sie könnten die gleiche Art—alle ext4, zum Beispiel—aber Sie werden immer noch unterschiedliche Datei-Systeme.

Alle inodes gehalten werden, in einer Tabelle. Die Verwendung einer inode-Nummer der Datei system leicht berechnet den offset in die inode-Tabelle, zu der die inode befindet. Sie können sehen, warum das “ich” im inode steht für index.

Die variable enthält die inode-Anzahl deklariert ist, in den source-code als 32-bit unsigned long integer. Dies bedeutet, dass die inode-Nummer ist ein integer-Wert mit einer maximalen Größe von 2^32 berechnet sich zu 4,294,967,295—weit über 4 Milliarden inodes.

Das ist das theoretische maximum. In der Praxis, die Anzahl von inodes in ein ext4-Dateisystem wird bestimmt, wenn das Dateisystem erstellt wird, bei der ein Standard-Verhältnis von einem inode pro 16 KB Datei system Kapazität. Verzeichnis-Strukturen werden on the fly erstellt, wenn die Datei system verwendet wird, wie Dateien und Verzeichnisse erstellt werden, in der Datei system.

Es gibt einen Befehl, den Sie verwenden können, um zu sehen, wie viele inodes in einem Dateisystem auf Ihrem computer. Die -i (inodes) Möglichkeit, die df-Befehl weist ihn, um seine Ausgabe in der Anzahl der inodes.

Wir betrachten das Dateisystem auf der ersten partition auf der ersten Festplatte, also wir geben die folgenden:

df-i /dev/sda1

Die Ausgabe gibt uns:

  • Dateisystem: Das Dateisystem, über das berichtet wird.
  • Inodes: Die Anzahl der inodes im Dateisystem.
  • IUsed: Die Anzahl der inodes im Einsatz.
  • IFree: Die Anzahl der verbleibenden inodes zur Verfügung.
  • IUse%: Der Prozentsatz an inodes verwendet.
  • Montiert auf: Der mount-Punkt für das Datei-system.

Wir habe verwendet, 10 Prozent der inodes im Dateisystem. Dateien sind gespeichert auf der Festplatte im disk-Blöcke. Jeder inode-Punkte, um die disk-Blöcke, speichern Sie den Inhalt der Datei, die Sie vertreten. Wenn Sie haben Millionen von kleinen Dateien, Sie können aus der inodes, bevor Sie laufen aus Festplattenspeicher. Allerdings, das ist ein sehr schwieriges problem zu laufen.

In der Vergangenheit einige E-mail-Server gespeicherten E-Mail-Nachrichten als separate Dateien (die rasch führte zu großen Sammlungen von kleinen Dateien) hatte dieses Problem. Wenn diese Anwendungen geändert, deren back-ends, Datenbanken, dies löste das problem allerdings. Die Durchschnittliche home-system läuft nicht out-of-inodes, die ist genauso gut, denn mit dem ext4-Dateisystem, können Sie nicht fügen Sie mehr inodes ohne Neuinstallation das Dateisystem.

Um zu sehen, die Größe der Festplatte Blöcke im Dateisystem, die Sie verwenden können, die blockdev-Befehl mit der –getbsz (get-block size) option:

sudo blockdev –getbsz /dev/sda

Die Blockgröße ist 4096 bytes.

Lassen Sie uns verwenden Sie die-B – (block size) option für die Angabe einer Blockgröße von 4096 bytes und überprüfen Sie die regelmäßigen Festplattennutzung:

df -B 4096 /dev/sda1

Diese Ausgabe zeigt uns:

  • Dateisystem: Das Dateisystem, auf dem wir uns meldest.
  • 4K-Blöcke: Die Anzahl der 4-KB-Blöcke in dieser Datei-system.
  • Verwendet: Wie viele 4K Blöcke in Verwendung sind.
  • Verfügbar: Die Anzahl der verbleibenden 4-KB-Blöcke, die verfügbar sind für Gebrauch.
  • Verwenden Sie%: der Anteil Der 4-KB-Blöcke, die verwendet wurden.
  • Montiert auf: Der mount-Punkt für das Datei-system.

In unserem Beispiel Dateiablage (und Speicherung der inodes und Verzeichnis-Strukturen) verwendet hat, 28 Prozent der Platz auf diesem Dateisystem an den Kosten von 10 Prozent der inodes, also wir sind in guter Form.

Inode-Metadaten

Sehen Sie die inode-Nummer einer Datei, die wir verwenden können ls mit der Option-i (inode) option:

ls -i geek.txt

Die inode-Nummer für diese Datei ist 1441801, so dass dieser inode enthält die Metadaten für diese Datei, und, traditionell, die Zeiger auf die festplattenblöcke, wo die Datei liegt auf der Festplatte. Wenn die Datei fragmentiert ist, sehr groß ist, oder beide, einige von den Blöcken der inode-Punkte zu halten könnte weitere Zeiger auf andere disk-Blöcke. Und einige der anderen disk-Blöcke, vielleicht auch gedrückt halten, Zeiger zu einem anderen Satz von disk-Blöcke. Dies überwindet das problem der inode wird eine Feste Größe und in der Lage zu halten eine begrenzte Anzahl von Zeigern auf disk-Blöcke.

Diese Methode wurde abgelöst durch ein neues System, dass mit “Blöcke.” Diese zeichnen die start-und end-block von jedem set von zusammenhängenden Blöcken verwendet, um die Datei speichern. Wenn die Datei unfragmented, müssen Sie nur speichern Sie die ersten block-und file-Länge. Wenn die Datei fragmentiert ist, müssen Sie zum speichern der ersten und letzten block jeder Teil der Datei. Diese Methode ist (natürlich) effizienter.

Wenn Sie möchten, um zu sehen, ob Ihr Dateisystem verwendet, die Platte block Zeiger oder Blöcke, können Sie sich innerhalb einer inode. Dazu verwenden wir den Befehl debugfs mit-R (Anfrage) option, und geben Sie die inode der Datei von Interesse. Diese fragt debugfs zu nutzen, seine internen “stat” – Befehl zeigt den Inhalt der inode. Da inode-Nummern nur innerhalb einer Datei-system müssen wir auch sagen, debugfs das Dateisystem, auf dem der inode befindet.

Hier ist, was in diesem Beispiel der Befehl würde wie folgt Aussehen:

sudo debugfs -R “stat <1441801>” /dev/sda1

Wie unten gezeigt, die debugfs-Befehl extrahiert die Informationen aus der inode und präsentiert Sie uns in weniger:

Wir sind gezeigt, die folgenden Informationen:

  • Inode: Die Nummer der inode, die wir uns ansehen.
  • Typ: Dies ist eine normale Datei, kein Verzeichnis oder den symbolischen link.
  • Modus: Die Dateiberechtigungen in oktal.
  • Flags: Indikatoren, die für unterschiedliche Funktionen oder Funktionalität. Die 0x80000 ist die “Ausmaße” – flag (mehr dazu weiter unten).
  • Generation: Ein Network File System (NFS) nutzt dies, wenn jemand greift auf die remote-Datei-Systeme über eine Netzwerkverbindung, als ob Sie waren montiert auf dem lokalen Rechner. Die inode-und generation-Nummern verwendet werden als eine form der Datei-handle.
  • Version: Die inode-version.
  • Benutzer: Den Eigentümer der Datei.
  • Gruppe: Die Gruppe Besitzer der Datei.
  • Projekt: Sollte immer null sein.
  • Größe: Die Größe der Datei.
  • Datei-ACL: Die Datei access control list. Diese wurden entwickelt, um ermöglichen es Ihnen einen kontrollierten Zugriff auf die Menschen, die nicht in die owner-Gruppe.
  • Links: Die Anzahl der hard links auf die Datei.
  • Blockcount: Die Höhe der Speicherplatz auf der Festplatte zugewiesen, um diese Datei in 512-byte-Blöcken. Unsere Datei zugewiesen wurde, und acht von diesen, die von 4.096 bytes. So, unser 98-byte-Datei befindet sich in einem einzigen von 4.096-byte-Blöcke auf dem Plattenspeicher.
  • Fragment: Diese Datei nicht fragmentiert ist. (Dies ist eine veraltete Flagge.)
  • Ctime: Die Zeit, in der die Datei erstellt wurde.
  • Zeit: Der Zeitpunkt, zu dem diese Datei zuletzt zugegriffen wurde.
  • Mtime: Zeitpunkt, an dem diese Datei zuletzt geändert wurde.
  • Crtime: Der Zeitpunkt, an dem die Datei erstellt wurde.
  • Größe der extra-inode-Felder: Das ext4-Dateisystem eingeführt, die Fähigkeit zu vergeben, größer auf der Festplatte inode-format Zeitpunkt. Dieser Wert ist die Anzahl der zusätzlichen bytes, die die inode verwendet wird. Dieser zusätzliche Platz kann auch verwendet werden, um zukünftige Anforderungen gerecht zu werden für neue Kerne oder zum speichern von erweiterten Attributen.
  • Inode-checksum: Eine Prüfsumme für diese inode, die es möglich macht, zu erkennen, ob die inode ist beschädigt.
  • Blöcke: Wenn Blöcke benutzt werden (auf ext4, sind Sie standardmäßig), die Metadaten über die Festplatte Sperrung der Nutzung von Dateien hat zwei zahlen, die angeben, dass die start-und end-Blöcke von jedem Teil einer fragmentierten Datei. Dies ist effizienter als die Speicherung jedes disk-block genommen, der von jedem Teil einer Datei. Wir haben einen Teil, weil unsere kleine Datei sitzt in einem disk-block in diesem block-offset.

Wo ist der Datei-Name?

Wir haben nun eine Menge Informationen über die Datei, aber wie Sie vielleicht bemerkt haben, haben wir nicht die Dateinamen. Dies ist, wo der Verzeichnis-Struktur ins Spiel kommt. In Linux, genau wie eine Datei, ein Verzeichnis besitzt eine inode. Anstatt zeigen auf disk-Blöcke, enthält die Datei Daten, wenn ein Verzeichnis-inode-Punkte, um disk-Blöcken, die directory-Strukturen.

Im Vergleich zu einer inode ein Verzeichnis-Struktur enthält eine begrenzte Menge von Informationen über eine Datei. Es enthält nur die Datei die inode-Nummer, der name und die Länge des namens.

Die inode und die Verzeichnis-Struktur enthalten alles, was Sie (oder eine Anwendung) wissen müssen über eine Datei oder ein Verzeichnis. Die directory-Struktur ist in ein Verzeichnis der Festplatte blockiert, so dass wir wissen, das Verzeichnis der Datei liegt. Die Verzeichnis-Struktur gibt uns der name der Datei und die inode-Nummer. Die inode-sagt uns alles, was über die Datei, einschließlich Zeitstempel, Berechtigungen, und wo finden Sie die Daten der Datei in der Datei-system.

Directory-Inodes

Sehen Sie die inode-Nummer eines Verzeichnisses so einfach wie Sie sehen können Sie für Dateien.

Im folgenden Beispiel wird ls mit der -l (long format), -i (inode) und -d (directory) Optionen, und suchen Sie im work-Verzeichnis:

ls -Deckel-Arbeit/

Weil wir die -d “(Verzeichnis) ” auswählen, ls Berichte, die auf das Verzeichnis selbst, nicht seinen Inhalt. Die inode für das directory ist 1443016.

Zu wiederholen, dass für das home-Verzeichnis, geben wir die folgenden:

ls -Deckel ~

Die inode für das home-Verzeichnis ist 1447510, und die Arbeit Verzeichnis im home-Verzeichnis. Nun, schauen wir uns den Inhalt des Arbeitsverzeichnisses. Anstelle des-d (directory) – option, verwenden wir den -a (all) option. Dies zeigt uns die directory-Einträge sind in der Regel ausgeblendet.

Wir geben Sie den folgenden:

ls -lia Arbeit/

Weil wir die -a (all) option, die single- (.) und double-Punkt (..) Einträge angezeigt werden. Diese Einträge stehen für das Verzeichnis selbst (ein-Punkt) und das übergeordnete Verzeichnis (double-dot.)

Wenn man sich die inode-Nummer für die single-dot-Eintrag, dass du es’s1443016—die gleiche inode-Nummer, die wir erhielten, als wir vor der inode-Nummer für das work-Verzeichnis. Auch die inode-Nummer für die double-dot-Eintrag ist der gleiche wie der inode-Nummer für das home-Verzeichnis.

Das ist, warum Sie können, verwenden Sie den Befehl cd .. um eine Ebene nach oben verschieben in den directory-Baum. Ebenso, wenn Sie vorangehen, eine Anwendung oder ein Skript mit Namen ./, lassen Sie die shell, von wo aus um die Anwendung zu starten oder ein Skript.

Inodes und Links

Wir haben bereits abgedeckt, die drei Komponenten sind erforderlich, um eine wohlgeformte und zugänglichen Datei in der Datei-system: die Datei, die Verzeichnis-Struktur, und die inode. Die Datei die Daten auf der Festplatte gespeichert, die Verzeichnis-Struktur enthält den Namen der Datei und die inode-Nummer und der inode enthält alle Metadaten für die Datei.

Symbolische links sind Dateisystemeinträge, die Aussehen wie Dateien, aber Sie sind wirklich-Verknüpfung zu einer vorhandenen Datei oder ein Verzeichnis. Mal sehen, wie Sie verwalten, und wie die drei Elemente werden verwendet, um dies zu erreichen.

Sagen wir mal wir haben ein Verzeichnis mit zwei Dateien: die eine ist ein script, und das andere ist eine Anwendung, wie unten gezeigt.

Wir können mit dem ln-Befehl und die -s (symbolische) option zum erstellen von einem weichen link, um die Skript-Datei, etwa so:

ls -s my_script geek.sh

Wir haben einen link zu my_script.sh genannt geek.sh. Wir können geben Sie Folgendes ein, und verwenden Sie ls, um sich die zwei script-Dateien:

ls -li *.sh

Der Eintrag für geek.sh erscheint in blau. Das erste Zeichen der Berechtigungen flags ist ein “l” für link und der -> Punkte my_script.sh . All dies zeigt, dass geek.sh ist ein link.

Wie Sie wahrscheinlich erwarten, die beiden Skript-Dateien haben unterschiedliche inode-Nummern. Was könnte mehr überraschend, obwohl, ist die soft-link geek.sh,, nicht den gleichen user-rechten wie der original-Skriptdatei. In der Tat, sind die Berechtigungen für geek.sh sind viel liberaler—alle Benutzer haben volle Berechtigungen.

Die Verzeichnis-Struktur für geek.sh enthält den Namen des link und seine inode. Wenn Sie versuchen, verwenden Sie den link, dessen inode referenziert wird, wie eine normale Datei. Der link inode verweist auf einen Datenträger-block, aber anstatt mit Datei-Inhalt von Daten, die disk-block enthält den Namen der original-Datei. Die Datei system Umleitung auf die original-Datei.

Wir werden löschen Sie die ursprüngliche Datei, und sehen, was passiert, wenn wir geben Sie den folgenden, um den Inhalt von geek.sh:

rm my_script.sh
Katze geek.sh

Der symbolische link ist kaputt, und die Weiterleitung fehlschlägt.

Wir geben Sie nun die folgende erstellen ein harter link auf die Programm-Datei:

ln special-app geek-app

Blick auf die inodes für diese beiden Dateien geben wir die folgenden:

ls -li

Beide sehen aus wie normale Dateien. Nichts über geek-app gibt es einen link in der Art und Weise der ls-Liste für geek.sh Tat. Plus, geek-app hat die gleichen Benutzer Berechtigungen wie die ursprüngliche Datei. Aber was vielleicht überraschend ist, beide Programme haben die gleiche inode-Nummer: 1441797.

Der directory-Eintrag für geek-app enthält den Namen “geek-app” und einer inode-Nummer, aber es ist das gleiche wie die inode-Nummer der original Datei. Also, wir haben zwei Dateisystem-Einträge mit unterschiedlichen Namen, die beide auf den gleichen inode. In der Tat, eine beliebige Anzahl von Elementen kann auf den gleichen inode.

Wir werden geben Sie Folgendes ein, und verwenden Sie das stat-Programm zu schauen auf das Ziel-Datei:

stat-special-app

Wir sehen, dass zwei hard-links verweisen auf diese Datei. Dies ist in der inode gespeichert.

Im folgenden Beispiel löschen wir die original-Datei und versuchen, die link mit einer geheimen, sicheren Passwort:

rm special-app
./geek-app correcthorsebatterystaple

Überraschend, läuft die Anwendung wie erwartet, aber wie? Es funktioniert, weil, wenn Sie eine Datei löschen, die inode ist frei, um wiederverwendet werden. Die directory-Struktur ist gekennzeichnet durch eine inode-Zahl von null, und die disk Blöcke werden anschließend in einer anderen Datei gespeichert werden, in diesem Raum.

Wenn die Anzahl der hard links auf den inode zeigt, die größer als eins ist, jedoch der hard link count wird um eins reduziert, und die inode-Nummer der Verzeichnisstruktur der gelöschten Datei wird auf null gesetzt. Den Inhalt der Datei auf der Festplatte und inode sind noch verfügbar, um die vorhandene hard-links.

Wir werden geben Sie Folgendes ein, und verwenden Sie stat-einmal mehr—dieses mal auf geek-app:

stat geek-app

Diese details sind gezogen aus der gleichen inode (1441797) als die Vorherige stat-Befehl. Die link-Zählung um eins reduziert.

Denn wir sind unten, um eine Feste Verbindung zu dieser inode, wenn wir löschen geek-app, es wäre wirklich löschen Sie die Datei. Die Datei system werden die inode und markieren Sie die Verzeichnis-Struktur mit einer inode null. Eine neue Datei kann dann überschreiben die Speicherung der Daten auf der Festplatte.

VERWANDTE: Wie die stat-Befehl unter Linux

Inode Gemeinkosten

es ist ein tolles system, aber es gibt Gemeinkosten. Zum Lesen einer Datei, wird die Datei-system zu tun hat, die folgenden:

  • Finden Sie die richtige Verzeichnis-Struktur
  • Lesen Sie die inode-Anzahl
  • Finden Sie den richtigen inode
  • Lesen Sie die inode-Informationen
  • Folgen Sie entweder der inode-links oder die Blöcke auf die entsprechenden disk-Blöcke
  • Lesen Sie die Daten der Datei

Ein bisschen mehr rumspringen ist notwendig, wenn die Daten nicht.

Stellen Sie sich die Arbeit, die getan werden muss, für die ls zum durchführen einer lang-format-Datei mit der Auflistung von vielen Dateien. Es gibt eine Menge hin und her, nur für ls zu Holen Sie sich die Informationen, die Sie benötigt zum generieren der Ausgabe.

Natürlich, beschleunigt Zugriff auf das Dateisystem ist der Grund, warum Linux versucht so viel zu tun, preemptive Datei-caching wie möglich. Dies hilft sehr, aber manchmal—so wie mit jedem Datei-system—der Aufwand kann sich bemerkbar machen.

Jetzt wissen Sie, warum.

LESEN SIE WEITER

  • › Wie Benutzerdefinierte Klingeltöne auf ein iPhone von macOS Catalina
  • › Der Ultimative Leitfaden für die Reinigung Ihrer AirPods Eklig
  • › Microsoft testet Anzeigen in WordPad auf Windows 10
  • › Was Ist ein Internet-Troll? (und Wie man Trolle)
  • › Was Ist ein GaN-Ladegerät, und Warum Wird Sie Eines Möchten?