Linux

如何取消連結(刪除)特殊的硬連結“。”為文件夾創建?

  • October 19, 2016

在 Linux 上,當您創建文件夾時,它會自動創建兩個指向相應 inode 的**硬連結。**一個是您要求創建的文件夾,另一個是.此文件夾的特殊文件夾。

例子:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

如您所見,folder.內部folder具有相同的 inode 編號(顯示為-i選項)。

無論如何要刪除這個特殊.的硬連結?

這只是為了實驗和好奇。 另外我想答案也可能適用於..特殊文件。

我試圖調查rm人,但找不到任何方法。當我嘗試刪除.所有我得到的是:

R M: ”。” 和“..”可能不會被刪除

我真的很好奇這些事情的整個運作方式,所以不要避免在這個問題上非常冗長。

編輯:也許我的文章不清楚,但我想了解負責.文件的底層機制以及無法刪除它們的原因。

我知道 POSIX 標準不允許使用少於 2 個硬連結的文件夾,但不明白為什麼。我想知道是否有可能做到這一點。

.至少在 EXT4 文件系統上,在技術上可以刪除。如果您在 中創建文件系統映像test.img,掛載它並創建一個test文件夾,然後再次解除安裝它,您可以使用以下命令對其進行編輯debugfs

debugfs -w test.img
cd test
unlink .

debugfs不會抱怨並儘職地刪除.文件系統中的目錄條目。該test目錄仍然可用,令人驚訝的是:

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

只顯示

..

所以.真的沒了。然而cd .,,仍然像往常一樣ls .pwd

我之前使用 完成了這個測試rmdir .,但是刪除了目錄的 inode(非常感謝BowlOfRed指出了這一點),這留下test了一個懸空的目錄條目,這是遇到問題的真正原因。在這種情況下,test文件夾將變得不可用;安裝映像後,執行ls產生

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

並且核心日誌顯示

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

e2fsck在這種情況下在映像上執行會test完全刪除目錄(目錄 inode 已消失,因此無法恢復)。

所有這些都表明它.作為 EXT4 文件系統中的特定實體存在。我從核心中的文件系統程式碼中得到了它期望...存在的印象,如果它們不存在就會發出警告(請參閱 參考資料namei.c),但是在unlink .基於 - 的測試中我沒有看到該警告。e2fsck不喜歡失去的.目錄條目,並提供修復它:

$ /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>?

這將重新創建.目錄條目。

引用自:https://unix.stackexchange.com/questions/317226