2

statvfs曾经有一个非常简单的内部df命令。

除了不知道如何获取文件系统设备路径之外,我的主要问题是可用的 1K 块在我的实现和df输出中有所不同。

这是我的:

Filesystem       1K-blocks            Used       Available           Use%      Mounted on
/dev/x           959863856        21399352       938464504               2      /

df的:

Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda2      959863856 21399352 889636296   3% /

“已使用”和“可用”均以 1K 块为单位。该百分比可能是由于四舍五入所致。如何获得可用空间?

这是我的实现:

int main(int argc, char *argv[]) {
    struct statvfs stats;
    statvfs(argv[1], &stats);

    unsigned long n_1k_blocks = stats.f_blocks * stats.f_frsize / 1024;
    unsigned long avail = stats.f_bfree * stats.f_frsize / 1024;
    unsigned long used = n_1k_blocks - avail;
    printf("%-*s\t%*lu\t%*lu\t%*lu\t%*.0f\t%s\n", 
        spaces, "/dev/x", 
        spaces, n_1k_blocks,
        spaces, used, 
        spaces, avail,
        spaces, 100 - (float)stats.f_bfree * 100.0 / stats.f_blocks,
        argv[1] // e.g. " / "
    );
    return 0;
}

我称之为:./a.out /对于安装在/

旁注:环顾四周,我阅读了busybox的df source;coreutils 现在对我来说有点太复杂了

4

1 回答 1

1

(938464504-889636296)/959863856 = .05

可用块数的差异为 5%。这个数字很可能来自保留块,即标准 df 从输出中排除保留块,因为它们对普通用户不可用。

例如,来自 mkfs.ext4(8) 的解释:

-m reserved-blocks-percentage 指定为超级用户保留的文件系统块的百分比。这避免了碎片,并允许 root 拥有的守护进程,例如 syslogd(8),在阻止非特权进程写入文件系统后继续正常运行。默认百分比为 5%。

编辑:如果你想获得与标准实用程序相同的结果,你应该使用f_bavail而不是。f_bfreedf

于 2019-08-27T19:15:54.020 回答