Linux中du与df
Linux查看磁盘空间一般可以用du,df,但是有些时候两个得到的结果却不一样
1:分别用du,df查看根分区的大小
[root@virtual_host ~]# du -k -d 1 /
107156 /boot
84 /dev
0 /proc
14072 /run
0 /sys
36528 /etc
40 /root
537200 /var
0 /tmp
1512596 /usr
0 /home
0 /media
0 /mnt
0 /opt
0 /srv
2207676 /
[root@virtual_host ~]# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 485800 0 485800 0% /dev
tmpfs 497836 84 497752 1% /dev/shm
tmpfs 497836 14068 483768 3% /run
tmpfs 497836 0 497836 0% /sys/fs/cgroup
/dev/mapper/centos-root 17811456 2138156 15673300 13% /
/dev/sda1 1038336 140372 897964 14% /boot
tmpfs 99568 4 99564 1% /run/user/0
du得到根目录/的大小是2207676KB
df得到根目录/的大小是 2138156KB
df 得到的比du得到的大,下面分析一下原因
2:五种原因
df 命令的全称是Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。
du 命令的全称是 Disk Used ,统计磁盘有已经使用的空间。它是直接统计各文件各目录的大小,而不是从硬盘获得信息的。
1:用户删除了大量的文件后,du命令就不会在文件系统目录中统计这些文件。如果此时还在运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df命令仍会统计这个被删除的文件。通过lsof命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致du和df命令统计结果不一致。可在opt目录下执行如下命令查看。lsof |grep deleted
2:Linux系统磁盘分区有保留区的概念,会给root或指定用户预留5%或更大的空间,当使用到这块保留区的空间时,fdisk命令的计算将会是负数。ext文件系统(包括ext2、ext3、ext4)都会默认预留5%的磁盘空间,使用root用户维护系统或记录系统关键日志使用。
3:当用du -sh *命令来统计目录总容量时,如果该路径下包含隐藏文件,是不会包含在统计结果里的。
4:如果某个正在运行的进程进行io的文件被删除,du不会统计,但因为对应的句柄未释放,文件系统中仍有此句柄,df仍会有对应的统计;
5:由于数据盘挂载前该路径下就存在文件,挂载后用du无法查询到原路径文件。