通过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是共享分区的,所以他们显示的磁盘信息是相同的
