【问题标题】:What is the most efficient way to traverse a hard disk and determine whether a given block is currently in use?遍历硬盘并确定给定块当前是否正在使用的最有效方法是什么?
【发布时间】:2013-02-05 17:13:03
【问题描述】:

我正在从事一个个人项目,定期(每月)遍历我的硬盘并粉碎(用零覆盖)磁盘上当前未分配给任何 inode 的任何块。

C 考虑到项目的低级性质,似乎是最合乎逻辑的语言,但我不确定如何最好地在文件系统中找到未使用的块。我发现了一些关于 S.O. 的问题。以及与此类似的其他地方,但没有看到关于有效有效找到这些未使用块的最佳方法的任何共识。

df 提出了任何与此类似的问题,但我不相信它具有指定精确块偏移量所需的分辨率,除非我遗漏了什么。我应该研究其他实用程序或其他方向吗?

无论我开发什么解决方案,都需要至少能够处理ext3 文件系统,最好还能够处理ext4

【问题讨论】:

  • 首先,您需要确定要支持的文件系统。
  • 为了争论,假设ext3ext4。我会相应地修改问题。
  • 你不能简单地创建一个足够大的临时文件然后删除它吗?
  • 不是真的,@AkiSuihkonen。目标是删除从系统中“删除”的所有文件的记录。拥有一个大的tmp 目录意味着所有文件,包括未删除的文件,都将被删除。
  • 我不关注。临时文件将如何占用可用空间以外的任何东西?还有其他问题,例如,如果设备上暂时没有可用空间,某些守护进程(或应用程序)可能会因错误而终止并损坏打开的文件。

标签: c linux filesystems


【解决方案1】:

除了编写您自己的实现来读取和解析磁盘文件系统数据(这些数据高度特定于您要支持的文件系统)之外,您实际上并没有任何通用的解决方案来找出正在使用的块。数据在磁盘上的外观通常在该文件系统的代码之外没有记录,并且在记录时,与实际实现相比,文档通常已经过时了。

最好的办法是阅读您想要支持的文件系统的 fsck 实现,因为它或多或少地做了您感兴趣的事情,但请注意,许多 fsck 实现并不总是检查所有属于文件系统的数据。您可能有备用超级块和 fsck 不检查的某些元数据(或仅在主超级块损坏的情况下检查)。

如果你真的想做你说你想做的事,而不仅仅是了解文件系统,你最好的办法是像普通备份一样转储文件系统,擦除磁盘并恢复备份。我非常怀疑其他任何事情都是安全的,特别是考虑到您的磁盘擦除应用程序可能会在您执行任何内核更新时破坏您的文件系统。

【讨论】:

    【解决方案2】:

    Linux 目前支持十几种不同的文件系统,因此答案将取决于您选择哪一种。

    但是,它们都应该有一种简单的方法来查找空闲块,否则创建新文件或扩展当前文件会有点慢。

    例如,ext2 在每个块组的开头都有一个标头,其中包含该块组的空闲列表等。我不相信这在 ext4 中发生了变化,尽管里面有很多额外的东西。

    您可能会更好地遍历这些块头中的空闲块,而不是获取任意块并尝试确定它是使用还是空闲。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多