我的磁盘上有一些Linux内核已知的文件系统。我需要获取此文件系统上当前可用的所有块的物理块编号。我怎么能这样做?
答案 0 :(得分:2)
获得免费区块计数:
内核方法:
查看文件系统实现的.statfs
超级块挂钩。它们返回一个kstatfs
对象,该对象具有f_bfree
参数,即空闲块的计数。你应该可以调用它。
来自用户空间:
df
命令是最简单的(当然这会导致内核调用statfs
- 它还会在哪里获取信息?:)
修改:您的原始问题只是传达了空闲区块数。
获取块位置:
使用内核的当前结构,以与文件系统无关的方式获取每个空闲块的位置而不仅仅是总数是不可能的(并且它可能保持这种方式)。 VFS没有对文件系统如何维护其位图强加任何通用结构;位图在超级块的文件系统相关部分中保持跟踪。
所以,如果你想要一个适用于所有文件系统的解决方案,那你就不走运了。如果您知道文件系统可能是什么以及它的数量很少,您可以查看每个文件系统的用户空间fsck
代码并添加函数以写出您期望的格式的位图,或者您可以修改{{ 1}}挂钩写出位图。
分配一个分配所有剩余空闲块的大文件的方法根本不是一个好主意,特别是如果涉及到期刊。它也不适用于在执行此操作时写入和删除文件的活动文件系统。
答案 1 :(得分:2)
这取决于文件系统 - 没有统一的接口,而某些文件系统(如JFFS)实际上没有空闲块的概念。此外,如果安装了文件系统,您获得的任何信息都可能会立即过时。期望必须阅读记录不完整的文件系统内部代码。但是,您不必在内核中执行此操作。例如,如果您对获取ext [234]自由空间位图感兴趣,请查看libext2fs中的位图函数。一般来说,如果有用户空间fsck,你可以利用它的代码来获取你想要的信息。
无论如何,你需要什么呢?
答案 2 :(得分:1)
害怕statfs
- 类似的功能只能给我计数的免费fs块,但不能给他们的位置。
我发现获取空闲块位置的最简单方法是创建一个文件,填充(或仅保留fallocate()
调用)所有可用空间,使用{{1}获取块映射} ioctl并删除该文件。但出于某些原因,这样做并不是我想要的。
另一种方法是进入较低级别的具体文件系统并从其驱动程序获取可用空间位图。这对我来说是一个好方法,但它必须依赖于每个文件系统实现,并且它不好:)
也许有一些我找不到的vfs函数或者在那种情况下可以帮助的一些fs ioctl?
无论如何,谢谢大家的答案!
答案 3 :(得分:-1)
你可以去一些旧式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
}
}
希望有所帮助。
答案 4 :(得分:-1)
Capturing stdout from a system() command optimally
系统调用可能就是你要找的,只要确保popen在linux上是标准的。我也忘了提到你应该做的事情:
FILE* test = popen("df","r");
因为df告诉你系统上空闲块的数量。