获取挂载中已用 space 和已用 inode 的百分比

Getting the percentage of used space and used inodes in a mount

我需要计算 Go 中挂载路径(例如 /mnt/mycustommount)已用 space 和已用 inode 的百分比。

这是我的尝试:

var statFsOutput unix.Statfs_t

err := unix.Statfs(mount_path, &statFsOutput)
if err != nil {
    return err
}

totalBlockCount := statFsOutput.Blocks // Total data blocks in filesystem
freeSystemBlockCount = statFsOutput.Bfree // Free blocks in filesystem
freeUserBlockCount = statFsOutput.Bavail // Free blocks available to unprivileged user

现在我需要的比例是这样的:

x : 100 = (totalBlockCount - free[which?]BlockCount) : totalBlockCount

x : 100 = usedBlockCount : totalBlockCount。但我不明白 BfreeBavail 之间的区别('unprivileged' 用户对文件系统块做了什么?)。

对于 inode 我的尝试:

totalInodeCount = statFsOutput.Files
freeInodeCount = statFsOutput.Ffree
// so now the proportion is
// x : 100 = (totalInodeCount - freeInodeCount) : totalInodeCount

如何获取已用存储空间的百分比? 我做的 inode 计算是否正确?

您的评论表达式在 Go 中无效,所以我不能不猜测就真正解释它。 由于猜测,我认为它是正确的,但我猜到了你的实际意思,还是只是我认为你的意思?换句话说,在不显示实际 code 的情况下,我只能想象您最终的 code 会是什么。如果我想象的代码不是实际代码,那么我想象你将编写的代码的正确性是无关紧要的。

除此之外,我可以在这里回答你的问题:

(what's 'unprivileged' user go to do with filesystem blocks?)

Linux statfs call uses the same fields as 4.4BSD. The default 4.4BSD file system (the one called the "fast file system") uses a blocks-with-fragmentation approach to allocate blocks in a sort of stochastic 方式。此分配过程在 文件系统上运行良好,并且在有些满的文件系统上继续运行良好,不会出现极度减速。然而,对其行为的计算机化建模显示,如果块使用率超过 90% 左右,则可能出现病理性减速(或多或少相当于线性搜索)。

(后来,对真实文件系统的分析发现,通常直到块使用率超过 95% 时才会出现减速。但那时 10%“保留”的想法已经很成熟了。)

因此,如果当时流行的 400 MB 大容量磁盘驱动器1 为索引节点提供 10%,为保留块提供 10%,这意味着普通用户可以分配大约 320 MB 的文件数据。那时驱动器是“100% 满”,但它可以通过用完剩余的块来达到 111%。不过,这些块是为超级用户保留的。

如今,人们可以拥有一个可以授予或撤销的 capability,而不是“超级用户”。然而,现在我们也不使用相同的文件系统。所以在你的系统上 bfreebavail 可能没有区别。


1是的,the 400 MB Fujitsu Eagle 当时是一个很大的(从多种意义上说:它使用 19 英寸机架安装设置)驱动器。如今,人们被数 TB 的 SSD 宠坏了。