实现原理:
df 命令的全称是Disk Free
,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。
du 命令的全称是 Disk Used
,统计磁盘有已经使用的空间。它是直接统计各文件各目录的大小,而不是从硬盘获得信息的。
返回值可能不同的情况(df>du):
1、 元数据Meta Data
的存在
元数据Meta Data
的存在:
- du命令是用户级的程序,它不考虑元数据,
- df命令则查看文件系统的磁盘分配图因此考虑了元数据,所以df的返回值可能会因此大于du。
文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data
2、用户删除文件
2.1. 如果用户删除了一个正在运行的应用所打开的某个目录下的文件:
- du命令返回的值显示出减去了该文件后的目录的大小。
- df命令并不显示减去该文件后的大小,直到该运行的应用关闭了这个打开的文件,df返回的值才显示出减去了该文件后的文件系统的使用情况。
当我们删除一个文件的时候,这个文件不是马上就在文件系统当中消失了,而是暂时消失了,当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件
2.2. 用户写入已被删除的文件
- du统计不到写入的这些磁盘块:因为目录中已经找不到这个文件
- df 能统计到:因为写的进程还在,磁盘空间没有被释放,所以df能统计到,所以df统计的结果比du大很多。
一个进程要向一个文件里面写东西,那么会得到一个pointer,
然后向指针指向的文件(磁盘区域)写入。假如由于某些原因(也可能人为)被指向的文件被删除了,但是( write call)并不知道文件是否还在,就还会继续向里面写,不管文件是否存在,磁盘块还是被写操作使用。