GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So trennen (entfernen) Sie den speziellen Hardlink . für einen Ordner erstellt?

Es ist technisch möglich, . zu löschen , zumindest auf EXT4-Dateisystemen. Wenn Sie ein Dateisystem-Image in test.img erstellen , mounten Sie es und erstellen Sie eine test Ordner, dann unmounten Sie es wieder, Sie können es mit debugfs bearbeiten :

debugfs -w test.img
cd test
unlink .

debugfs beschwert sich nicht und löscht brav den . Verzeichniseintrag im Dateisystem. Die test Verzeichnis ist immer noch nutzbar, mit einer Überraschung:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

zeigt nur

..

also . ist wirklich weg. Noch cd . , ls . , pwd verhalte dich trotzdem wie gewohnt!

Ich habe diesen Test zuvor mit rmdir . durchgeführt , aber das löscht den Inode des Verzeichnisses (riesig danke an BowlOfRed für den Hinweis), was test übrig lässt ein baumelnder Verzeichniseintrag und ist der wahre Grund für die aufgetretenen Probleme. In diesem Szenario ist die test Ordner wird dann unbrauchbar; Führen Sie nach dem Mounten des Images ls aus produziert

ls: cannot access '/mnt/test': Structure needs cleaning

und das Kernel-Log zeigt

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

Ausführen von e2fsck löscht in dieser Situation auf dem Bild den test Verzeichnis komplett (der Verzeichnis-Inode ist weg, also gibt es nichts wiederherzustellen).

All dies zeigt, dass . existiert als spezifische Entität im EXT4-Dateisystem. Ich habe aus dem Dateisystemcode im Kernel den Eindruck bekommen, dass er . erwartet und .. existieren, und warnt, falls nicht (siehe namei.c ), aber mit dem unlink . -basierter Test Ich habe diese Warnung nicht gesehen. e2fsck mag das fehlende . nicht Verzeichniseintrag und bietet an, das Problem zu beheben:

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

Dadurch wird . neu erstellt Verzeichniseintrag.


Es gibt keine Möglichkeit, diesen Verzeichniseintrag zu entfernen. Der . Eintrag bedeutet "dieses Verzeichnis", der .. Eintrag bedeutet "Elternverzeichnis dieses Verzeichnisses". Sie sind eigentlich keine festen Links, so wird nur die Verzeichnisstruktur erstellt/dargestellt.


Wie in Anmerkungen von Lion zum Unix 6-Quellcode beschrieben Das frühe Unix hatte eine Plattendatei, in der sowohl Dateien als auch Verzeichnisse auf der Platte durch Inode-Strukturen dargestellt wurden. Es gab ein spezielles Bit, das anzeigte, dass der Dateiinhalt ein Verzeichnis war. Jeder Inode hatte einen Link zu seinem eigenen Inode, der es einer Datei ermöglichte zu wissen, in welchem ​​​​Verzeichnis sie sich befand. Die Ausnahme war das '/'-Verzeichnis, das sich selbst besaß. Es gab auch einen Link zu Inhalten. Wenn ein Inode keinen Inhalt hatte, konnte er an die freie Liste zurückgegeben werden. Da ein Verzeichnis nur eine gesegnete Datei war, musste sogar ein leeres Verzeichnis einen Inhalt haben, um zu verhindern, dass es von der Garbage Collection erfasst wurde. Somit war der .. der Link des Inodes zum übergeordneten Inode und der . war da, um anzuzeigen, dass das Verzeichnis noch verwendbar war. rmdir (durch Aufrufen von unlink) könnte die . Verzeichnis, wenn es keine anderen Inhalte gäbe, und der Inode würde dann in die freie Liste verschoben, wenn es keine Verweise mehr darauf gäbe.


Linux
  1. Wie installiere ich R 3.3.1 im eigenen Verzeichnis?

  2. So suchen Sie vom Terminal aus in Ubuntu nach einem Verzeichnis

  3. Wie kann ich den Ordner, in dem gesucht wird, von find ausschließen?

  4. Wie entferne ich alle Symlinks unter dem Verzeichnis?

  5. Wie kann ich den Arbeitsspeicher auf einem ARM-basierten System auf Datenbeschädigung testen?

So entfernen (löschen) Sie eine Datei oder ein Verzeichnis in Linux

So verwenden Sie den Linux-cd-Befehl zum Ändern des Verzeichnisses

So entfernen Sie ein Verzeichnis in Linux

So erhalten Sie die Größe eines Verzeichnisses in Linux

So entfernen (löschen) Sie das Verzeichnis in Linux

Verzeichnis in Linux entfernen – So löschen Sie einen Ordner von der Befehlszeile aus