如何手动修改inode?

Ben*_*ird 2 bash c ubuntu hard-link inode

我使用的Ubuntu Linux和,只是为了好玩,我想创建一个硬连接到一个目录(如图这里)。因为我只是为了好玩而这样做,我不是在寻找其他人编写的任何类型的预先开发的目录硬链接软件,我想知道如何自己做。那么,如何直接手动修改 inode 呢?

理想情况下,我希望答案是可以从 Bash 命令行运行的 Linux 命令,但如果无法从那里执行此操作,我也会接受有关如何在 C 中执行此操作的信息或(作为最后的手段)集会。

Den*_*ker 8

这取决于文件系统。对于 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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您不能直接链接到父级,因此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'.
Run Code Online (Sandbox Code Playgroud)