【问题标题】:Available blocks with `df`带有“df”的可用块
【发布时间】:2019-12-31 23:41:32
【问题描述】:

我正在使用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 现在对我来说有点太复杂了

【问题讨论】:

    标签: c linux filesystems linux-disk-free


    【解决方案1】:

    (938464504-889636296)/959863856 = .05

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

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

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

    编辑:如果您想获得与标准 df 实用程序相同的结果,则应使用 f_bavail 而不是 f_bfree

    【讨论】:

    • f_bavail 确实修复了“Available”,但搞砸了“Used”,它仍然是n_1k_blocks - avail
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多