按顺序、逐块扫描整个磁盘,并获取文件名

按顺序、逐块扫描整个磁盘,并获取文件名

我正在尝试构建一个分区实用程序,但不太确定如何开始。

最终目标是获得像旧的 Windows 磁盘碎片整理程序一样的驱动器图片,这样您就可以看到什么是数据、什么是空等等,还可以检查图像中的特定位置并找出写入那里的文件(或文件的哪一部分)。

可能有一些有用的命令行实用程序,例如od。但是,我不确定如何在特定位置恢复文件名...

答案1

您可以使用debugfs它在非常低的级别上查看和修改 ext2/ext3/ext4 文件系统。

它有一个交互式 shell,您可以在其中手动运行其命令(使用 启动它sudo debugfs /dev/sdXY/dev/sdXY您的分区保存在哪个设备上),但您也可以通过使用参数指定它来让它仅运行单个命令-R

例如,要列出为/bin/ls分区上的文件分配的块/dev/sda2,请尝试以下操作:

$ sudo debugfs -R 'blocks /bin/ls' /dev/sda2
debugfs 1.43.4 (31-Jan-2017)
2922912 2922913 2922914 2922915 2922916 2922917 2922918 2922919 2922920 2922921 2922922 2922923 2922924 2922925 2922926 2922927 2922928 2922929 2922930 2922931 2922932 2922933 2922934 2922935 2922936 2922937 2922938 2922939 2922940 2922941 2922942 2922943 

您可以通过在其手册页中输入 来找到有关此强大工具的更多信息man debugfs。您还可以help在其交互式 shell 中输入以获取可用命令的列表。

注意:我不确定此工具的性能是否足以用于一次检查整个分区。如果您尝试这样做,您可能不应该启动debugfs每个要检查的文件的新实例,而是创建一个命令脚本来运行它并将其与参数一起使用-f


反过来指定块编号并查找它属于哪个文件也是可能的,但更复杂,并且每个步骤也可能需要几秒钟。以下是debugfs显示此情况的交互式会话记录:

$ sudo debugfs /dev/sda2
debugfs 1.43.4 (31-Jan-2017)
debugfs:  blocks /bin/ls
2922912 2922913 2922914 2922915 2922916 2922917 2922918 2922919 2922920 2922921 2922922 2922923 2922924 2922925 2922926 2922927 2922928 2922929 2922930 2922931 2922932 2922933 2922934 2922935 2922936 2922937 2922938 2922939 2922940 2922941 2922942 2922943 
debugfs:  icheck 2922912
Block   Inode number
2922912 914862
debugfs:  ncheck 914862
Inode   Pathname
914862  /bin/ls

相关内容