Heim  >  Artikel  >  System-Tutorial  >  Inode-Datensätze unter Linux

Inode-Datensätze unter Linux

PHPz
PHPznach vorne
2024-02-11 09:51:291040Durchsuche

Dateien werden auf der Festplatte gespeichert.

Die kleinste Speichereinheit auf einer Festplatte wird Sektor genannt.

Jeder Sektor speichert 512 Bytes (entspricht 0,5 KB).

Wenn das Betriebssystem die Festplatte liest, liest es nicht Sektor für Sektor, was ineffizient ist.

Stattdessen liest es mehrere Sektoren nacheinander, also einen Block nach dem anderen.

Dieser „Block“ besteht aus mehreren Sektoren und ist die kleinste Einheit des Dateizugriffs.

Blockgröße, am häufigsten ist 4 KB, was einer Reihe von acht Sektoren entspricht, die einen Block bilden.

Inode-Datensätze unter Linux

Dateidaten werden in „Blöcken“ gespeichert, daher müssen wir natürlich auch einen Ort finden, an dem die Metainformationen der Datei gespeichert werden, z. B. der Ersteller der Datei, das Erstellungsdatum der Datei und die Größe der Datei , usw. Dieser Bereich, in dem Dateimetainformationen gespeichert werden, wird als Inode bezeichnet und seine chinesische Übersetzung lautet „Indexknoten“.

Inode-Inhalt

inode enthält Metainformationen der Datei, insbesondere den folgenden Inhalt:

* Die Anzahl der Bytes in der Datei

* Benutzer-ID des Dateieigentümers

* Gruppen-ID der Datei

* Lese-, Schreib- und Ausführungsberechtigungen für Dateien

* Es gibt drei Zeitstempel der Datei: ctime bezieht sich auf den Zeitpunkt, zu dem der Inode zuletzt geändert wurde, mtime bezieht sich auf den Zeitpunkt, zu dem der Dateiinhalt zuletzt geändert wurde, und atime bezieht sich auf den Zeitpunkt, zu dem die Datei zuletzt geöffnet wurde.

* Anzahl der Links, also wie viele Dateinamen auf diesen Inode verweisen

* Der Speicherort des Dateidatenblocks

Mit dem Befehl stat können Sie die Inode-Informationen einer bestimmten Datei anzeigen:

stat example.txt

Kurz gesagt, alle Dateiinformationen außer dem Dateinamen werden im Inode gespeichert. Warum es keinen Dateinamen gibt, wird unten ausführlich erläutert.
Inode-Datensätze unter Linux

Inode-Größe

Inode verbraucht auch Festplattenspeicher, sodass das Betriebssystem die Festplatte beim Formatieren der Festplatte automatisch in zwei Bereiche aufteilt. Einer ist der Datenbereich, der Dateidaten speichert; der andere ist der Inode-Bereich (Inode-Tabelle), der die im Inode enthaltenen Informationen speichert.

Die Größe jedes Inode-Knotens beträgt im Allgemeinen 128 Byte oder 256 Byte. Die Gesamtzahl der Inode-Knoten wird bei der Formatierung angegeben, normalerweise wird alle 1 KB oder alle 2 KB ein Inode gesetzt. Angenommen, bei einer 1-GB-Festplatte beträgt die Größe jedes Inode-Knotens 128 Byte und für jeweils 1 KB ist ein Inode festgelegt. Dann erreicht die Größe der Inode-Tabelle 128 MB, was 12,8 % der gesamten Festplatte ausmacht.

Um die Gesamtzahl der Inodes in jeder Festplattenpartition und die Anzahl der verwendeten Inodes anzuzeigen, können Sie den Befehl df verwenden.

df -i

Um die Größe jedes Inode-Knotens anzuzeigen, können Sie den folgenden Befehl verwenden:

sudo dumpe2fs -h /dev/hda | grep "Inode size"

Da jede Datei einen Inode haben muss, kann es vorkommen, dass die Inodes aufgebraucht sind, die Festplatte aber nicht voll ist. Derzeit können keine neuen Dateien auf der Festplatte erstellt werden.

Inode-Nummer

Inode-Datensätze unter Linux

Jeder Inode hat eine Nummer und das Betriebssystem verwendet die Inode-Nummer, um verschiedene Dateien zu identifizieren.

Es lohnt sich hier zu wiederholen, dass Unix/Linux-Systeme intern keine Dateinamen verwenden, sondern Inode-Nummern zur Identifizierung von Dateien verwenden. Für das System ist der Dateiname lediglich ein Alias ​​oder Spitzname für die Inode-Nummer zur einfachen Identifizierung. Oberflächlich betrachtet öffnet der Benutzer die Datei über den Dateinamen. Tatsächlich ist der Prozess innerhalb des Systems in drei Schritte unterteilt: Erstens findet das System die Inode-Nummer, die dem Dateinamen entspricht. Zweitens erhält es die Inode-Informationen über die Inode-Nummer Block, in dem sich die Dateidaten befinden, und liest die Daten.

Verwenden Sie den Befehl ls -i, um die Inode-Nummer anzuzeigen, die dem Dateinamen entspricht:

ls -i example.txt

Verzeichnisdateien

In Unix/Linux-Systemen ist ein Verzeichnis auch eine Art Datei. Das Öffnen eines Verzeichnisses bedeutet eigentlich das Öffnen der Verzeichnisdatei.

Die Struktur einer Verzeichnisdatei ist sehr einfach, es handelt sich um eine Liste einer Reihe von Verzeichniseinträgen (dirent). Jeder Verzeichniseintrag besteht aus zwei Teilen: dem Dateinamen der enthaltenen Datei und der dem Dateinamen entsprechenden Inode-Nummer.

Der Befehl

ls listet nur alle Dateinamen in den Verzeichnisdateien auf:

ls /etc
Der Befehl

ls -i listet die gesamten Verzeichnisdateien auf, d. h. Dateinamen und Inode-Nummern:

ls -i /etc

Wenn Sie die detaillierten Informationen der Datei anzeigen möchten, müssen Sie auf den Inode-Knoten zugreifen und die Informationen entsprechend der Inode-Nummer lesen. Der Befehl ls -l listet detaillierte Informationen zu einer Datei auf.

ls -l /etc

Harter Link

Im Allgemeinen stehen der Dateiname und die Inode-Nummer in einer „Eins-zu-eins-Korrespondenz“-Beziehung, und jede Inode-Nummer entspricht einem Dateinamen. Allerdings erlauben Unix/Linux-Systeme, dass mehrere Dateinamen auf dieselbe Inode-Nummer verweisen. Dies bedeutet, dass auf den gleichen Inhalt mit unterschiedlichen Dateinamen zugegriffen werden kann. Das Ändern des Dateiinhalts wirkt sich auf alle Dateinamen aus. Das Löschen eines Dateinamens hat jedoch keinen Einfluss auf den Zugriff auf einen anderen Dateinamen. Diese Situation wird als „Hardlink“ bezeichnet.

Der Befehl

ln kann Hardlinks erstellen:

ln 源文件 目标文件

运 行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文 件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系 统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时, 默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当 前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录),这里的 2是父目录对其的“硬链接”和当前目录下的”.硬链接“。

Inode-Datensätze unter Linux

软链接

除了硬链接以外,还有 一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打 开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这 意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此 发生变化。

ln -s命令可以创建软链接。

ln -s 源文文件或目录 目标文件或目录

inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

\1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

\2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

\3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时 候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode则被回收。

实际问题

在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。

查找原因:

/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

解决方案:

1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。

2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:

ln -s /opt/newcache /data/cache

Das obige ist der detaillierte Inhalt vonInode-Datensätze unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:lxlinux.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen