代码之家  ›  专栏  ›  技术社区  ›  Lopoc

Linux:直接访问C中的硬盘

  •  9
  • Lopoc  · 技术社区  · 15 年前

    我如何才能获得一个硬盘的原始访问权,并知道该位置是使用还是自由空间? 仅举一个例子,我只需在磁盘设备上打开和读取就可以直接访问,目标是知道是否使用了10000字节。

    7 回复  |  直到 15 年前
        1
  •  9
  •   RBerteig Keith Adler    15 年前

    再加上警告…

    不要忘记,您必须与现有驱动程序堆栈的线程安全规定和内部缓存进行合作。系统中的许多线程可以(并且将)一直写入磁盘。要想消灭一个自由的领域,你必须知道它是自由的,并且在你有自由的时候保持自由。如果将文件系统已经决定使用的扇区擦除,但尚未将该决定的证据清除到磁盘上,那么情况将很糟糕,因此您无法知道该扇区正在使用中。这可能导致数据丢失,从而导致愤怒的用户。

    如果您可以保证文件系统当前没有安装,那么原则上至少可以打开 /dev/sda (大概 你想要的那个!)并解析磁盘上的数据结构来做任何需要做的事情。实际上,公用事业就是这样 fsck mkfs 执行。

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

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

        2
  •  17
  •   Mehrdad Afshari    15 年前

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

        3
  •  9
  •   slacy    15 年前

    在所有类似的情况下,您不希望通过/dev/sd*或/dev/hd*直接访问块设备。正如其他人所说,您必须了解原始的底层文件系统,这将非常困难。

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

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

        4
  •  6
  •   retracile    10 年前

    如果您想清除文件系统中的所有可用空间,可以用一个满是零的大文件填充文件系统,将其同步到磁盘,然后删除它。这可能无法完全得到所有信息,尤其是当您处理日志文件系统或类似文件时,但它可以完成大部分工作。如果您想擦除磁盘以便更好地压缩图像,这可能是您需要做的全部工作。如果您出于安全原因想清理磁盘…欢迎来到内核开发的世界,请踏入到最深处,记得穿上阻燃的东西。

    有一个叫 zerofree 将ext文件系统中的空闲块归零,并用于vm映像。记住,这不是您应该对已安装的文件系统执行的操作。该页面还包含一些旧的内核补丁,这些补丁可能是在活动文件系统上执行此操作的一个有趣的起点。

        5
  •  5
  •   Joshua    15 年前

    哦,我的。

    您的代码必须:

    1. 浏览分区表以查看属于哪个分区。
    2. 确定它是哪种文件系统。
    3. 对于您支持的每个文件系统,提供这样一个例程来查看该字节是否在使用中。
    4. 检查文件系统是否已安装
    5. 如果是这样,请查看内核记录,以确定是否有尚未写入磁盘的内容。
    6. 哦,如果你用的是ext4或reiser,你不知道前面的答案,所以你最好放弃。

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

    编辑:看到他的评论,他实际上想做什么,

    • 接受分区而不是原始磁盘
    • 需要卸除
    • 致电e3fsck汇总日志
    • 遍历每个inode,找到最后一个块并擦除该块中的任何可用空间(文件大小应告诉数据在块中的结束位置)
    • 浏览分配位图,找到任何未分配的块并清除它们
    • 现在,最棘手的部分,擦擦轴颈。
    • 祝你好运
    • 哦,阅读文件系统文档
        6
  •  2
  •   Community Stefan Steinegger    7 年前
        7
  •  0
  •       15 年前

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