11

如何获得对 HD 的原始访问权限并知道该位置是否已使用或是否为可用空间?举个例子,我可以简单地通过打开和读取磁盘设备来获得直接访问,目标是知道是否使用了例如 10.000 字节。

4

7 回答 7

17

您可以只open使用块设备(例如/dev/sda)并手动读取扇区。但是,这不会直接告诉您它是否为空。是否为空是在文件系统抽象级别定义的。文件系统数据结构存储此类数据,您应该从原始块中深入了解特定的文件系统(不使用任何文件系统提供的功能)。

于 2009-06-10T20:03:04.683 回答
9

很可能,您不想直接通过 /dev/sd* 或 /dev/hd* 访问块设备。正如其他人所说,您必须了解原始的底层文件系统,这将非常困难。

如果您正在编写一个想要将磁盘上的字节视为一个大的线性地址空间的应用程序,那么请查看 mmap() 系统调用。您可以在磁盘上创建一个大的空文件,然后使用 mmap() 将其映射到您的进程空间。从那里,您可以使用常规内存操作来读取和写入底层大文件。请注意,写入是缓冲的,因此保证一致性可能很棘手。

这种方法的优点是即使底层文件是碎片化的,您的访问模式也可以将其视为字节的线性集合。

于 2009-06-10T20:19:28.893 回答
9

继续注意事项...

不要忘记你必须配合现有的驱动程序堆栈自己的线程安全规定和内部缓存。系统中的许多线程可以(并且将)一直在写入磁盘。要擦除一个免费扇区,您必须知道它是免费的,并且在您随心所欲的时候保持免费。如果您擦除了文件系统已经决定使用的扇区,但还没有将该决定的证据刷新到磁盘上,因此您无法知道它正在使用中,那将会很糟糕。这可能会导致数据丢失,从而导致用户愤怒。

如果您可以保证文件系统当前未挂载,那么您至少原则上可以打开/dev/sda(可能不是您想要的特定系统!)并解析磁盘上的数据结构以执行您需要执行的任何操作。这实际上是实用程序喜欢fsckmkfs实现的方式。

剩下的大问题是您必须与您可能遇到的每个文件系统的每个版本保持同步。至少您有可供文件系统本身参考的源代码,但仅将其从内核移植到用户模式应用程序中并不容易。

我的建议是使用文件系统本身来为您提供所需的保证。打开大文件并用您的擦除模式填充它们。将磁盘填满。请注意,如果这可能对假设某些磁盘空间可用的任何正在运行的守护程序产生严重影响,那么它可能仍需要在具有大多数守护程序且此类被杀死的系统上完成。如果您的目标是安全擦除,您仍然需要担心在两次传递之间实际将写入的块刷新到磁盘,因为普通文件系统中的所有内容都会尝试优化单个块的多次写入。

于 2009-06-10T20:46:42.583 回答
6

如果您想擦除文件系统中的所有可用空间,您可以用一个充满零的大文件填充文件系统,将其同步到磁盘,然后将其删除。这可能无法获得绝对的一切,特别是如果您正在处理日志文件系统等,但它会完成大部分工作。如果您想擦除磁盘以便更好地压缩图像,这可能就是您需要做的。如果您出于安全原因想要清理磁盘...欢迎来到内核开发的世界,请深入了解一下,并记得戴上防火的东西。

有一个名为zerofree的实用程序可以将 ext 文件系统中的空闲块清零,并且适用于 VM 映像。请记住,这不是您应该对已挂载的文件系统执行的操作。该页面还包含一些旧内核补丁,这些补丁可能是在实时文件系统上执行此操作的有趣起点。

于 2009-06-10T20:22:15.033 回答
5

天啊。

您的代码必须:

  1. 遍历分区表,查看属于哪个分区。
  2. 确定它是什么类型的文件系统。
  3. 对于您支持的每个文件系统,提供这样的例程以查看该字节是否正在使用
  4. 检查文件系统是否已挂载
  5. 如果是,则遍历内核记录以查明是否有尚未写入磁盘的内容。
  6. 哦,如果你使用的是EXT4或REISER,你不知道前面的答案,所以你还不如放弃。

如果我是你,我会重新考虑你想要做什么。

编辑:看到他对他真正想做的事情的评论,

  • 接受分区而不是原始磁盘
  • 需要下马
  • 调用 e3fsck 来汇总日志
  • 遍历每个 inode,找到最后一个块并擦除该块中的任何可用空间(文件大小应该告诉数据在块中的结束位置)
  • 遍历分配位图,找到任何未分配的块并擦除它们
  • 现在是棘手的部分,擦拭日记。
  • 祝你好运
  • 哦,阅读文件系统文档
于 2009-06-10T20:04:50.483 回答
2

非常依赖于许多因素,例如

  • 文件系统类型
  • 操作系统类型
  • 中型

解决方案:

于 2012-03-25T00:07:42.070 回答
0

您可能能够利用文件系统和/或磁盘工具用于检查位置是否空闲的相同功能。

于 2009-06-10T20:07:51.583 回答