通过os.statvfs计算某目录的使用率等
基础知识
通过使用os.statvfs()
可以计算出指定目录的使用情况,下面将其与Linux下的df
命令做一个对比
先看一下os.statvfs调用后的输出结果:
>>> import os
>>> os.statvfs('/')
posix.statvfs_result(f_bsize=4096, f_frsize=4096, f_blocks=25403486, f_bfree=17181744, f_bavail=15885552, f_files=6463488, f_ffree=6056870, f_favail=6056870, f_flag=4096, f_namemax=255)
下面将对输出的这些字段做解释:
字段值 | 字段含义 |
---|---|
f_bsize | 文件系统快大小 |
f_frsize | 分栈大小 |
f_blocks | 文件系统数据块总数 |
f_bfree | 可用块数 |
f_bavail | 非超级用户可获取的块数 |
f_files | 文件节点总数 |
f_ffree | 可用文件节点数 |
f_favail | 非超级用户可用文件节点数 |
f_flag | 挂载标记 |
f_namemax | 最大文件长度 |
在有了这些数据的情况下,就可以进一步计算出当前目录下的硬盘占用情况等
计算方法如下(中括号内表示的是对应于df输出中的哪一列):
- 总容量(KB) = f_bsize * f_blocks / 1024 【1k-blocks】
- 使用量(KB) = f_bsize * (f_blocks - f_bfree) / 1024 【Used】
- 有效容量(KB) = f_bsize * f_bavail / 1024 【Available】
- 使用量(%) = 使用量 / (使用量+有效容量) * 100 【Use%】
案例
使用df
查看根目录的磁盘使用情况:
df
文件系统 1K-块 已用 可用 已用% 挂载点
udev 3917616 0 3917616 0% /dev
tmpfs 788828 9724 779104 2% /run
/dev/sda8 101613944 32908924 63520252 35% /
tmpfs 3944128 107660 3836468 3% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 3944128 0 3944128 0% /sys/fs/cgroup
/dev/loop0 89088 89088 0 100% /snap/core/4917
/dev/loop3 296064 296064 0 100% /snap/pycharm-professional/78
/dev/loop2 89088 89088 0 100% /snap/core/5145
/dev/loop1 301184 301184 0 100% /snap/pycharm-professional/80
/dev/sda7 463724 132903 302360 31% /boot
cgmfs 100 0 100 0% /run/cgmanager/fs
tmpfs 788828 88 788740 1% /run/user/1000
unionfs-fuse 101613944 32908924 63520252 35% /home/yangsijie/.QQ.unionfs
unionfs-fuse 101613944 32908924 63520252 35% /home/yangsijie/.TIM.unionfs
使用os.statvfs
分析根目录的磁盘使用情况:
import os
def disk_info(path):
vfs = os.statvfs(path)
total = vfs.f_bsize * vfs.f_blocks / 1024
used = vfs.f_bsize * (vfs.f_blocks - vfs.f_bfree) / 1024
avail = vfs.f_bsize * vfs.f_bavail / 1024
used_percent = round(float(used) / float(used + avail) * 100, 2)
print ('总容量为: %d' % total)
print ('使用量为: %d' % used)
print ('有效容量为: %d' % avail)
print ('使用率为: %f' % used_percent)
disk_info('/')
执行结果为:
总容量为: 101613944
使用量为: 32909872
有效容量为: 63519304
使用率为: 34.130000
从结果中可以看出,与df
中的指定字段的内容是基本一致的,没有太大的出入
如果想要查看一个目录的使用情况呢?比如说/var/lib/docker
:
disk_info('/var/lib/docker')
执行结果为:
总容量为: 101613944
使用量为: 32910220
有效容量为: 63518956
使用率为: 34.130000
会发现与之前的/
目录情况一致,为什么会有这种情况?
其实细细看一下df
的输出就可以发现,/var/lib/docker
目录下并没有单独挂载一个分区,也就是说/
和/var/lib/docker
是共享分区的,所以他们显示的磁盘信息是相同的