Beginnen Sie mit lsof und erlangen Sie ein tiefgreifendes Verständnis des virtuellen Linux-Dateisystems

Freigeben: 2023-08-04 16:15:49
nach vorne
1644 Leute haben es durchsucht

Hintergrund

Manchmal kommt es vor, dass der Speicherplatz voll ist, aber wenn Sie die spezifische Dateibelegung der Festplatte überprüfen, stellen Sie fest, dass auf der Festplatte noch viel freier Speicherplatz vorhanden ist.
1. Ausführen <code style="margin-right: 0.15em;margin-left: 0.15em;padding-right: 0.3em;padding-left: 0.3em;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;white-space: pre-wrap;border-width: 1px;border-style: solid;border-color: rgb(234, 234, 234);background-color: rgb(248, 248, 248);border-radius: 3px;display: inline;"><span style="font-size: 15px;">df</span>df Befehl zum Überprüfen der Festplattennutzung und festgestellt, dass die Festplatte voll ist.

-bash-4.2$ df -ThFilesystem     Type      Size  Used Avail Use% Mounted on/dev/vda1      ext4       30G    30G 0         100% /devtmpfs       devtmpfs  489M     0  489M   0% /devtmpfs          tmpfs     497M     0  497M   0% /dev/shmtmpfs          tmpfs     497M   50M  447M  11% /runtmpfs          tmpfs     497M     0  497M   0% /sys/fs/cgroup
Nach dem Login kopieren

2. Führen Sie den Befehl du aus, um die Festplattennutzung jedes Verzeichnisses zu überprüfen, addieren Sie die Größe der Dateien in jedem Verzeichnis und stellen Sie fest, dass die Festplatte nicht belegt ist und mehr als 10 GB Speicherplatz vorhanden ist fehlt aus unerklärlichen Gründen.


-bash-4.2$ du -h --max-depth=1 /home16M    /home/logs11G    /home/serverdog11G    /home
Nach dem Login kopieren

🎜
3.为何会出现这样的情况呢?
因为虽然文件已被删除,但是一些进程仍然打开这些文件,因此其占用的磁盘空间并没有被释放。执行<span style="font-size: 15px;">lsof</span> 命令显示打开已删除的文件。将有问题的进程重启(或,清空),磁盘空间就会得到释放。
-bash-4.2# lsof | grep deletemysqld     2470         mysql    4u      REG              253,1           0     523577 /var/tmp/ibfTeQFn (deleted)mysqld     2470         mysql    5u      REG              253,1           0     523579 /var/tmp/ibaHcIdW (deleted)mysqld     2470         mysql    6u      REG              253,1           0     523581 /var/tmp/ibLjiALu (deleted)mysqld     2470         mysql    7u      REG              253,1           0     523585 /var/tmp/ibCFnzTB (deleted)mysqld     2470         mysql   11u      REG              253,1           0     523587 /var/tmp/ibCjuqva (deleted)
Nach dem Login kopieren

那么,Linux 的文件系统,到底为什么这么设计呢?要了解这些,就要先弄清楚并不容易,下面将从一些基本概念入手,一步步将这些梳理清楚:
  • 什么是虚拟文件系统(VFS:virtual filesystem)?

  • 什么是通用文件模型?

    • 超级块对象(superblock object)

    • 索引节点对象(inode object)

    • 文件对象(file object)

    • 目录项对象(dentry object)

    • 文件的概念

  • 文件的表达

    • 内存表达

    • 磁盘表达

  • 目录树的构建

    • Softlink vs. Hardlink

  • Datei- und Datenträgerverwaltung

    • Indexstatus

  • Datei- und Prozessverwaltung

    • Vorgänge:

      Öffnen und löschen

Virtuelles Dateisystem

Die folgende Abbildung zeigt die grundlegenden Komponenten, die für die Dateiverwaltung im Linux-Betriebssystem verantwortlich sind. Der obere Halbbereich ist der Benutzermodus und der untere Halbbereich ist der Kernelmodus. Anwendungen verwenden die Standardbibliothek libc, um auf Dateien zuzugreifen, und die Bibliothek ordnet Anforderungen Systemaufrufen zu, um in den Kernel-Modus zu gelangen.

Beginnen Sie mit lsof und erlangen Sie ein tiefgreifendes Verständnis des virtuellen Linux-Dateisystems

Der Einstiegspunkt für alle dateibezogenen Vorgänge ist das virtuelle Dateisystem (VFS), nicht ein bestimmtes Dateisystem (wie Ext3, ReiserFS und NFS). VFS bietet eine Schnittstelle zwischen Systembibliotheken und bestimmten Dateisystemen. Daher fungiert VFS nicht nur als Abstraktionsschicht, sondern stellt tatsächlich eine grundlegende Implementierung eines Dateisystems bereit, das von verschiedenen Implementierungen verwendet und erweitert werden kann. Um zu verstehen, wie das Dateisystem funktioniert, müssen Sie daher zunächst VFS verstehen.

Gemeinsames Dateimodell

Die Hauptidee von VFS besteht darin, ein gemeinsames Dateimodell einzuführen. Das allgemeine Dateimodell besteht aus den folgenden Objekttypen:

Superblock-Objekt

Speicher: Wird bei der Installation des Dateisystems erstellt und speichert relevante Informationen über das Dateisystem.
Festplatte: Entspricht den darauf gespeicherten Informationen Festplatte Dateisystem-Steuerblock (Dateisystem-Steuerblock)

Inode-Objekt (Inode-Objekt)

Speicher: Wird beim Zugriff erstellt und speichert allgemeine Informationen zu bestimmten Dateien (inode 结构)
Disk: Entspricht der Speicherung auf der Festplatte. Die Datei Kontrollblock auf
Jedes Inode-Objekt hat eine Inode-Nummer, die die Datei im Dateisystem eindeutig identifiziert

Dateiobjekt (Dateiobjekt)

Speicher: Wird beim Öffnen einer Datei erstellt und speichert Informationen über die Interaktion zwischen der geöffneten Datei und dem Prozess (Dateistruktur< /code >) <code style="margin-right: 0.15em;margin-left: 0.15em;padding-right: 0.3em;padding-left: 0.3em;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;white-space: pre-wrap;border-width: 1px;border-style: solid;border-color: rgb(234, 234, 234);background-color: rgb(248, 248, 248);border-radius: 3px;display: inline;">file 结构
打开文件信息,仅当进程访问文件期间存在于内核内存中。

目录项对象(dentry object)

内存:目录项一旦被读入内存,VFS就会将其转换成dentry 结构Informationen zu geöffneten Dateien sind nur im Kernel-Speicher vorhanden, während der Prozess auf die Datei zugreift.

Dentry-Objekt

Speicher: Sobald der Verzeichniseintrag in den Speicher eingelesen wurde, konvertiert VFS ihn in dentry structure Verzeichniseintragsobjekt Datenträger: Ein bestimmtes Dateisystem wird auf eine bestimmte Art und Weise auf der Festplatte gespeichert.

Speichert Informationen über die Verknüpfung zwischen einem Verzeichniseintrag (d. h. Dateiname) und der entsprechenden Datei. 🎜🎜🎜🎜 Verzeichnisbaum. 🎜🎜🎜🎜 Zusammenfassend ist es das Root-Dateisystem von Linux (das Root-Dateisystem des Systems) ist das erste Dateisystem, das der Kernel mit dem Mounten beginnt. Die Kernel-Code-Image-Datei wird im Root-Dateisystem gespeichert, und das Systemstartprogramm lädt einige grundlegende Initialisierungsskripte und -dienste in den Speicher, um sie nach dem Mounten des Root-Dateisystems auszuführen (das Dateisystem und der Kernel sind völlig unabhängige zwei Teile). ). Andere Dateisysteme werden anschließend über Skripte oder Befehle als Unterdateisysteme in dem Verzeichnis installiert, in dem das Dateisystem installiert wird, und bilden schließlich den gesamten Verzeichnisbaum. 🎜🎜
start_kernel   vfs_caches_init     mnt_init       init_rootfs     // 注册rootfs文件系统      init_mount_tree // 挂载rootfs文件系统   …   rest_init   kernel_thread(kernel_init, NULL, CLONE_FS);
Nach dem Login kopieren

就单个文件系统而言,在文件系统安装时,创建超级块对象;沿树查找文件时,总是首先从初识目录的中查找匹配的目录项,以便获取相应的索引节点,然后读取索引节点的目录文件,转化为dentry对象,再检查匹配的目录项,反复执行以上过程,直至找到对应的文件的索引节点,并创建索引节点对象。

软链接 vs 硬链接

软链接是一个普通的文件,其中存放的是另外一个文件的路径名。硬链接则指向同一个索引节点,硬链接数记录在索引节点对象的 i_nlink 字段。当<span style="font-size: 15px;color: rgb(68, 68, 68);">i_nlink</span>字段为零时,说明没有硬链接指向该文件。

文件 & 进程管理

下图是一个简单示例,说明进程是怎样与文件进行交互。三个不同进程打开同一个文件,每个进程都有自己的文件对象,其中两个进程使用同一个硬链接(每个硬链接对应一个目录对象),两个目录项对象都指向同一个 索引节点对象。

Beginnen Sie mit lsof und erlangen Sie ein tiefgreifendes Verständnis des virtuellen Linux-Dateisystems

索引节点的数据又由两部分组成:内存数据和磁盘数据。Linux 使用 Write back 作为索引节点的数据一致性策略。对于索引节点的数据,当文件被打开时,才会加载索引节点到内存;当不再被进程使用,则从内存踢出;如果中间有更新,则需要把数据写回磁盘。
*  "in_use" - valid inode, i_count > 0, i_nlink > 0*  "dirty"  - as "in_use" but also dirty*  "unused" - valid inode, i_count = 0
Nach dem Login kopieren

Ob der Indexknoten noch verwendet wird, wird bestimmt durch <code style="margin-right: 0.15em;margin-left: 0.15em;padding-right: 0.3em;padding-left: 0.3em;font-size: 0.85em;font-family: Consolas, Inconsolata, Courier, monospace;white-space: pre-wrap;border-width: 1px;border-style: solid;border-color: rgb(234, 234, 234);background-color: rgb(248, 248, 248);border-radius: 3px;display: inline;"><span style="font-size: 15px;">open()</span><span style="font-size: 15px;">close()</span> 操作建立和销毁文件对象,文件对象通过索引节点提供的 <span style="font-size: 15px;">iget</span><span style="font-size: 15px;">iput</span> 更新索引节点的i_count字段,以完成使用计数。open 操作使得 i_count 加一, close 操作使得 i_count 减一。在 close 操作时判断索引节点是否释放,如果 i_count = 0,则意味着不再有进程引用,将会从内存释放。

文件 & 磁盘管理

文件与磁盘管理联系最紧密的操作,莫过于<span style="font-size: 15px;">touch</span><span style="font-size: 15px;">rm</span>open() und

🎜close( )🎜 🎜 Der Vorgang erstellt und zerstört das Dateiobjekt. Das Dateiobjekt wird über den Indexknoten bereitgestellt 🎜🎜iget🎜🎜 und 🎜 🎜iput🎜🎜 Aktualisieren Sie das i_count-Feld des Indexknotens, um die Nutzungszählung abzuschließen. Die Öffnungsoperation erhöht i_count um eins und die Schließoperation verringert i_count um eins. Bestimmen Sie, ob der Indexknoten während des Schließvorgangs freigegeben wird. Wenn i_count = 0, bedeutet dies, dass keine Prozessreferenz mehr vorhanden ist und er aus dem Speicher freigegeben wird. 🎜🎜

Datei- und Datenträgerverwaltung🎜

🎜Datei Der Vorgang, der am engsten mit der Datenträgerverwaltung zusammenhängt, ist 🎜🎜touch🎜🎜 und 🎜🎜rm🎜🎜 operation, Vor allem letzteres ist am kritischsten. Verwenden Sie strace (oder dtruss), um den tatsächlichen Systemaufruf von rm🎜🎜 anzuzeigen

# dtruss rm tmp...geteuid(0x0, 0x0, 0x0)         = 0 0ioctl(0x0, 0x4004667A, 0x7FFEE06F09C4)         = 0 0lstat64("tmp\0", 0x7FFEE06F0968, 0x0)         = 0 0access("tmp\0", 0x2, 0x0)         = 0 0unlink("tmp\0", 0x0, 0x0)         = 0 0
Nach dem Login kopieren

可以发现 rm 实际是通过 unlink 完成的。unlink代表删除目录项,以及减少其索引节点的计数。由通用文件模型可知,父目录本身同样是一个文件,也就意味着目录项是其文件数据的一部分。删除目录项等价于从父目录的文件中删除数据,也就意味着首先要打开父目录的文件。那么,删除操作即可理解为:

  1. 删除命令(一个进程)使用 open 操作获得父目录文件对象

  2. 通过 <span style="font-size: 15px;color: rgb(68, 68, 68);">iget</span> 增加 目录文件的索引节点对象计数

  3. 读取目录文件数据

  • 将目录文件数据转化为目录项对象

  • 由于目录项包含文件的索引节点,类似的,需要通过 iget 增加文件的索引节点对象计数

  • 删除目录的目录项

  • 减少文件索引节点对象的硬链接计数i_nlink

  • 通过 <span style="font-size: 15px;color: rgb(68, 68, 68);">iput</span> 结束对文件索引节点对象的操作,使用计数 i_count 减一

    • 判断i_count是否为零,如果为零,则释放内存

    • 然后,判断i_nlink是否为零,如果为零,则释放磁盘空间

  • 通过 iput 结束对目录索引节点对象的操作。

  • Zusammenfassung

    Wenn wir auf die aufgetretenen Probleme zurückblicken, können wir sie tatsächlich aus zwei Perspektiven verstehen:

    Index und Daten

    Dateisystem und Dateien, Datenträgerverwaltung und Dateien, Prozessverwaltung und Dateien, Der Kernpunkt ist der Index der Datei, nicht die Daten der Datei. Die Trennung von Daten und Indizes ist der Schlüssel zum Verständnis von Dateisystemen.


    Beginnen Sie mit lsof und erlangen Sie ein tiefgreifendes Verständnis des virtuellen Linux-Dateisystems

    Caching-Strategie

    Da das Betriebssystem die Write-Back-Strategie verwendet, bedeutet dies, dass die Festplatte nur freigegeben werden kann, wenn zuerst der Speicher freigegeben wird.

    Warum lsof? .

    Warum kann lsof gelöschte und unveröffentlichte Dateien finden?
    lsof, wie der Name schon sagt: Offene Dateien auflisten. Das Prinzip dieses Befehls besteht darin, die Liste der geöffneten Dateien zu finden, sodass Sie gelöschte, aber nicht freigegebene Dateien finden können.

Das obige ist der detaillierte Inhalt vonBeginnen Sie mit lsof und erlangen Sie ein tiefgreifendes Verständnis des virtuellen Linux-Dateisystems. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:Linux中文社区
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage