我有一个磁盘,其中包含一些 Linux 内核已知的文件系统。我需要获取此文件系统上当前空闲的所有块的物理块号。我怎样才能做到这一点?
5 回答
获得空闲块计数:
内核方法:
查看.statfs
文件系统实现的超级块挂钩。它们返回一个kstatfs
具有f_bfree
参数的对象,即空闲块的计数。你应该可以调用这个。
从用户空间:
该df
命令是最简单的(这当然会导致内核调用statfs
- 它还能从哪里获取信息?:)
编辑:您最初的问题传达的是获得空闲块数。
获取块位置:
使用内核的当前结构以独立于文件系统的方式获取每个空闲块的位置而不仅仅是总数是不可能的(并且它可能会保持这种方式)。VFS 没有对文件系统如何维护其位图施加任何通用结构。位图在超级块的文件系统相关部分中被跟踪。
因此,如果您想要一个适用于所有文件系统的解决方案,那么您就不走运了。如果您知道文件系统可能是什么并且数量很少,您可以查看fsck
每个文件系统的用户空间代码并添加函数以您期望的格式写出位图,或者您可以修改.statfs
挂钩以写出位图。
您分配一个分配所有剩余空闲块的大文件的方法听起来根本不是一个好主意,尤其是在涉及日志的情况下。它也不适用于在您执行此操作时正在写入和删除文件的活动文件系统。
这取决于文件系统 - 没有统一的接口,并且一些文件系统(例如 JFFS)并没有真正的空闲块的概念。此外,如果文件系统已挂载,您获得的任何信息都可能立即过时。预计必须阅读记录不佳的文件系统内部代码。但是,您不一定必须在内核中执行此操作。例如,如果您对获取 ext[234] 自由空间位图感兴趣,请查看libext2fs中的位图函数。一般来说,如果有一个用户空间 fsck,你可能可以利用它的代码来获取你想要的信息。
无论如何,你需要这个做什么?
Afraid- statfs
like 函数只能给我免费 fs 块的数量,而不是它们的位置。
我发现获取空闲块位置的最简单方法是创建一个文件来填充(或仅通过调用保留)所有可用空间,使用ioctlfallocate()
获取块映射并删除文件。FIBMAP
但是由于某些原因,这样做并不是我想要的。
另一种方法是进入较低级别的具体文件系统并从其驱动程序中获取可用空间位图。这对我来说是一个好方法,但是它必须依赖于每个文件系统来实现,它并不好:)
也许有一些我找不到的 vfs 功能或一些 fs ioctl 可以在这种情况下提供帮助?
无论如何,谢谢大家的回答!
你可以使用一些老式的 C,fork,然后在 unix 中执行一个名为“stat”的程序。您可以将该输出通过管道传输到一个文件,然后使用一些字符串流来解释它并找到空闲块的数量。(这将涉及获取总 IO 块的数量并减去已使用的 IO 块的数量。
我不确定是否有比这更简单的方法。这是一些伪代码:
main() {
fork()
if child{
execl(stat / %B >> output.txt)
}
if parent {
wait until output.txt is populated
read in data with stringstream
calculate number of free blocks
}
}
希望有帮助。
系统调用可能是您正在寻找的,只需确保 popen 首先在 linux 上是标准的。我还忘了提到您应该执行以下操作:
FILE* test = popen("df","r");
由于 df 告诉您系统上的空闲块数。