我知道 df 应该提供此信息,但是当我运行 df 时,它显示空闲的 1k 块的数量,但我的文件系统正在使用 4k 块。
当然,我可以简单地除以四,但这不一定是正确的,因为粒度不同。例如,四个 1k 文件将在使用 1k 块的文件系统上使用四个 1k 块,但四个 1k 文件将在使用 4k 块的文件系统上使用四个 4k 块。 (因此除以四会产生错误的答案。)
答案1
如果您有一个 1K 文件占用 4K 文件系统块,它将为df
输出贡献 4K。
df
通过向内核询问空闲块计数(使用statfs
/ statvfs
)并将其乘以块大小 / 1024 来计算该数字。
除以 4 即可。有时事情比你想象的要简单。
另一方面,您不应假设每个版本都df
使用 1024 字节块作为其报告单位。有时是512。
答案2
有趣的是,不同版本的选项集df
是多种多样的。
如果您正在使用 GNU df
(例如,使用Linux),您可以说
df -B4K
(或df -B4k
) 来补偿 4KB 块大小。
为了OpenBSD 的df
和Mac的操作系统Xdf
,将环境变量设置BLOCKSIZE
为 4096 以告知df
使用 4KB 块大小。
为了索拉里斯的/usr/bin/df
使用该-v
开关可以找出“分配给文件系统的块总数、分配给现有文件的块数、[和]非特权用户可用于创建新文件的块数”等信息。对于-v
,“大小以每个指定文件系统支持的最小块大小的倍数显示。”
为了AIX 的df
使用-I
开关找出“块总数、已用空间、可用空间、已用空间百分比以及文件系统的挂载点”。 (我不清楚-I
生效时已用空间和可用空间的单位是什么,并且我没有看到任何更相关的开关,除了-i
会显示已用 inode 的数量和 inode 的百分比请注意,/usr/sysv/bin/df -v
在 AIX 上“报告已使用块的百分比以及已使用块和空闲块的数量”,这与 Solaris 的/usr/bin/df -v
行为类似。
这单一 UNIX 规范为了df
正如维基百科中所述,似乎没有相关开关用于df
以块或索引节点显示结果。
答案3
POSIXdf
仅提供 1024 或 512 字节单元,因此答案是特定于系统的,并且很可能也是特定于文件系统的(我将忽略诸如块再分配和内联数据.)
首先要考虑的概念是保留块,根据规范,输出的空闲块计数df
将不包括保留块(通常为根保留,但并非总是如此)。
一种(主要)可移植的无需使用的查找方法df
是使用 Gnu stat
,使用您选择的输出格式:
$ stat -fc "%n type=%T freeblk=%f totalblk=%b blksz=%S" /tmp
/tmp type=ext2/ext3 freeblk=99136 totalblk=494123 blksz=4096
您可以使用%a
(而不是%f
)来输出有效空闲块计数(即排除保留块),如df
在其计算中使用。
其他系统 (*BSD) 的格式化标志和功能有所不同stat
,并且可能仅适用于文件,不适用于文件系统。stat
不是 POSIX(它是 POSIX 函数stat()
和的包装器statvfs()
),GNU 版本(在核心工具包)非常便携。
使用基于 ext2/3/4 的文件系统,您可以作为 root(或更准确地说:具有对块设备节点的读取访问权限)使用以下命令转储此信息tune2fs
:
# tune2fs -l /dev/sda3
tune2fs 1.42.8 (20-Jun-2013)
Filesystem volume name: <none>
Last mounted on: /var/spool
Filesystem UUID: 7b9d93dd-1322-4f54-a302-a0799f4518fb
Filesystem magic number: 0xEF53
[...]
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 7651328
Block count: 30588854
Reserved block count: 305888
Free blocks: 30060629
Free inodes: 7651317
First block: 0
Block size: 4096
Fragment size: 4096
[...]
无论文件系统是否安装,此方法都有效。
答案4
如果有很多文件小于(或小得多)磁盘块大小,则有关 df 函数行为的有用信息。
我遇到了一个问题, df 函数告诉我以下内容:
Filesystem 1K-blocks Used Available Use% Mounted on
udev 89212 0 89212 0% /dev
tmpfs 24396 3236 21160 14% /run
/dev/mmcblk0p1 3583944 1926248 1593516 55% /
tmpfs 121980 0 121980 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 121980 0 121980 0% /sys/fs/cgroup
tmpfs 121980 4 121976 1% /tmp
/dev/zram1 49584 17836 28164 39% /var/log
tmpfs 24396 0 24396 0% /run/user/0
但肯定没有更多的空间,因为我收到创建新文件的错误。解决方案是“df -i”,它返回磁盘上占用的块:
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 22303 338 21965 2% /dev
tmpfs 30495 523 29972 2% /run
/dev/mmcblk0p1 230144 230144 0 100% /
tmpfs 30495 1 30494 1% /dev/shm
tmpfs 30495 2 30493 1% /run/lock
tmpfs 30495 17 30478 1% /sys/fs/cgroup
tmpfs 30495 15 30480 1% /tmp
/dev/zram1 12800 34 12766 1% /var/log
tmpfs 30495 21 30474 1% /run/user/0
因此,这是磁盘的更多可用/已用空间指示器。为了测试,我编写了约 180.000 个 409Byte 大小的文件来填充 4096Byte 大小的块,因此简单的“df”磁盘使用率几乎没有改变,但磁盘已满。