如何获得对高清的原始访问权限,并知道该位置是否使用或是自由空间?只是一个例子,我只需在磁盘设备上使用打开和读取即可获得直接访问,目标是知道是否使用了10.000字节。

有帮助吗?

解决方案

忙于注意...

不要忘记,您必须与现有的驾驶员堆栈自己的线程安全规定和内部缓存合作。系统中的许多线程都可以(并且)一直在写入磁盘。要擦拭自由行业,您必须知道它是免费的,并在您陪同下来时保持自由。如果您擦除了文件系统已经决定使用的扇区,但尚未将该决定的证据冲洗给磁盘,这样您就无法知道它正在使用。这可能会导致数据丢失,从而导致愤怒的用户。

如果您可以保证目前未挂式文件系统,则至少可以打开 /dev/sda (大概 不是 您想要的特定方法!)并解析盘盘数据结构,以执行您需要做的任何事情。这实际上就是公用事业 fsckmkfs 已实施。

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

我的建议是使用文件系统本身为您提供所需的保证。打开大文件,并用擦除图案填充它们。将磁盘填充到容量。请注意,如果这可能会对任何假设有一些磁盘空间可用的跑步守护程序产生严重影响,因此可能仍需要在大多数守护程序和杀死的系统上进行。如果您的目标是进行安全的擦拭,您仍然需要担心将书面块实际冲洗到两次通行之间,因为普通文件系统中的所有内容都将尝试优化单个块的多个写入。

其他提示

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

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

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

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

如果您想擦除文件系统中的所有自由空间,则可以用一个装满零的大文件填充文件系统,将其同步到磁盘,然后将其删除。这可能并不能绝对获得所有内容,尤其是如果您要处理伐木文件系统之类的话,但是它将完成大部分。如果您想擦除磁盘以使图像更好地压缩,那么这可能就是您需要做的。如果您想出于安全原因清洁磁盘...欢迎来到内核开发世界,请走进深处,并记住要穿耐火的东西。

有一个叫做的实用程序 Zerofree 要在Ext文件系统中归零自由块,并用于VM图像。请记住,这不是您应该对安装的文件系统做的事情。该页面还具有一些旧的内核补丁程序,这些补丁可能是在实时文件系统上进行此操作的有趣起点。

天啊。

您的代码必须:

  1. 步行分区表,查看落入哪个分区。
  2. 确定它是哪种文件系统。
  3. 对于您支持的每个文件系统,提供这样的例程,以查看该字节是否正在使用
  4. 检查文件系统是否已安装
  5. 如果是这样,请步行内核记录以找出是否尚未写入磁盘。
  6. 哦,如果您使用的是Ext4或Reiser,您将不知道上一个的答案,因此您也可以放弃。

如果我是你,我会重新考虑您要做的事情。

编辑:看到他对他实际要做的事情的评论,

  • 接受分区而不是原始磁盘
  • 需要卸下
  • 致电E3FSCK卷起日记
  • 行走每个Inode,查找最后一个块并擦除该块中的任何自由空间(文件尺寸应告知数据在块中的何处)
  • 走上分配位图,找到任何未分配的块并擦拭它们
  • 现在棘手的部分,擦拭日记。
  • 祝你好运
  • 哦,阅读文件系统文档

您可能能够利用与文件系统和/或磁盘工具使用相同的功能来检查位置是否免费。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top