Bash

如何手動修改inode?

  • May 19, 2017

我正在使用 Ubuntu Linux,只是為了好玩,我想創建一個指向目錄的硬連結(如此處所示。因為我這樣做只是為了好玩,我不是在尋找其他人編寫的任何類型的預先開發的目錄硬連結軟體,我想知道如何自己做。那麼,我如何直接手動修改inode?

理想情況下,我希望將答案作為可以從 Bash 命令行執行的 Linux 命令,但如果無法從那裡執行此操作,我也會接受有關如何在 C 中執行此操作的資訊,或者(作為最後的手段)元件。

這取決於文件​​系統。對於 ext4,您可以使用 debugfs 執行此操作,如下所示:

dennis@lightning:/tmp$ dd if=/dev/zero of=ext4.img bs=1M count=100
104857600 bytes (105 MB) copied, 0.645009 s, 163 MB/s
dennis@lightning:/tmp$ mkfs.ext4 ext4.img 
mke2fs 1.42.5 (29-Jul-2012)
ext4.img is not a block special device.
Proceed anyway? (y,n) y
...
Writing superblocks and filesystem accounting information: done 
dennis@lightning:/tmp$ mkdir ext4
dennis@lightning:/tmp$ sudo mount ext4.img ext4
dennis@lightning:/tmp$ mkdir -p ext4/test/sub/
dennis@lightning:/tmp$ sudo umount ext4
dennis@lightning:/tmp$ debugfs -w ext4.img 
debugfs 1.42.5 (29-Jul-2012)
debugfs:  link test test/sub/loop
^D
dennis@lightning:/tmp$ ls ext4/test/sub/loop/sub/loop/sub/loop/sub/loop/sub/loop/
total 1
drwxrwxr-x 2 dennis dennis 1024 mrt 26 12:15 sub

筆記:

  • 您不能直接連結到父級,因此foo/bar不能連結到foo,因此是額外的目錄。
  • 你不應該在掛載的文件系統上執行 debugfs。如果這樣做,您將需要在進行更改後解除安裝/掛載。

find 和 ls 之類的工具仍然不會循環:

dennis@lightning:/tmp$ find ext4
ext4
ext4/lost+found
find: `ext4/lost+found': Permission denied
ext4/test
ext4/test/sub
find: File system loop detected; `ext4/test/sub/loop' is part of the same file system loop as `ext4/test'.

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