哪个文件占用 /dev/sda 上的块 123456789?

哪个文件占用 /dev/sda 上的块 123456789?

我想知道哪个文件占用块设备上的给定块。

该过程至少应该支持加密 LVM 上的 ext4,但如果它还解释了如何为其他存储系统执行此操作,那就太好了。

所以我正在寻找类似的东西:

# whichfile /dev/sda 123456789
/var/log/syslog

有可能:

# whichfile -v /dev/sda 123456789
Debug: Block 123456789 is in partition /dev/sda6
Debug: /dev/sda6 is part of LVM /dev/kubuntu-vg/root
Debug: /dev/kubuntu-vg/root is LUKS encrypted
Debug: Decrypted device is: /dev/mapper/kubuntu--vg-root
Debug: Block 123456789 on /dev/sda is block 98765432 on /dev/mapper/kubuntu--vg-root
Debug: File system is: ext4
Debug: Block 98765432 contains inode 2345678
Debug: Inode 2345678 is var/log/syslog
Debug: Mount point is: /
/var/log/syslog

编辑:

@Mark Plotnick 有一个从未加密的块设备到 inode 的部分解决方案。这是朝着正确方向迈出的一步。

另一个部分解决方案:inode -> filename (ext4):

sudo debugfs -R 'ncheck 23456789' /dev/unencrypted_ext4_fs

更一般(慢 - 但可能只适用于任何基于 inode 的文件系统):

sudo find /mountpoint-for-device -xdev -inum 23456789

答案1

通常没有与文件系统中的每个数据块关联的元数据,因此为了实现您所寻找的内容,您通常需要探索恰好使用包含给定块的分区的整个文件系统,并且分析每个文件块,直到找到好的文件块。

您还需要定义您所指的块、逻辑块、物理块、扇区……(512b、1k、4k)并处理特殊情况,例如:

  • 一个块包含多个文件的各个部分(使用 ufs 等片段的文件系统)
  • 一个块包含一个日志,因此可能包含一个或多个文件的一部分
  • 一个块由多个文件共享(重复数据删除文件系统)
  • 块由属于不同文件系统(快照/克隆文件系统)的文件的不同版本共享。
  • ...

无论如何,您都需要为不同的文件系统实现使用算法,并花一些时间分析它们的内部结构。

相关内容