linux磁盘管理工具df和du的区别

磁盘是Linux系统中一项非常重要的资源,如何对其进行有效的管理直接关系到整个系统的性能问题。磁盘管理有df、du和fdisk三个常用命令:df用于检查文件系统磁盘占用情况,du检查磁盘空间占用情况,而fdisk用于磁盘分区。
1.df
df命令可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息,它也可以显示所有文件系统对i节点和磁盘块的使用情况。

df命令各个选项的含义如下:

-a:显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k:以k字节为单位显示。

-i:显示i节点信息,而不是磁盘块。

-t:显示各指定类型的文件系统的磁盘空间使用情况。

-x:列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。

-T:显示文件系统类型。

2. du(详细使用方法及介绍)
du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小。该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。

df命令的各个选项含义如下:

-s:对每个Names参数只给出占用的数据块总数。
-a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。

-b:以字节为单位列出磁盘空间使用情况(系统默认以k字节为单位)。

-k:以1024字节为单位列出磁盘空间使用情况。

-c:最后再加上一个总计(系统默认设置)。

-l:计算所有的文件大小,对硬链接文件,则计算多次。

-x:跳过在不同文件系统上的目录不予统计。

df与du命令区别解析:
1、句柄相关的基础知识

句柄包含:文件、目录、socket等,一个进程能够打开的文件句柄总数是一定的,可以通过ulimit –n 进行查看,一般是1024个。此参数也可以修改,以root用户运行以下命令:ulimit -HSn 4096 以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile ,把命令ulimit -HSn 4096 加到最后。

2、句柄泄漏的危害

出现句柄泄漏,进程会逐渐消耗完进程可打开的句柄,导致进程再也不能打开新的句柄,系统可能不能再正常工作。

3、句柄泄露,为什么会导致磁盘空间不足:

一个文件创建,就新生成了一个inode节点,且inode节点的引用计数为1。当文件被一个进程打开,则在内存中缓冲建立此inode节点缓存,且其引用计数加1。一个文件可以被多次打开,创建多个文件描述符,但对应的inode节点只有一个,对应的磁盘存储只有一个,只是引用计数每打开一次加1。

当文件被rm,在操作系统内部其实是调用了unlink操作,其目录项被删除,如果其对应的inode节点的引用计数为0,则删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘可被再申请;但如果此文件被其他进程打开,则其对应的inode节点的引用计数不为0,则不会删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘不能被再申请,也就是在lsof下可以看到deleted句柄;当前文件被所有使用进程close后,系统删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘可被再申请。

4、du和df的区别::

du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况。该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。

df命令参数功能:检查文件系统的磁盘空间占用情况,利用所有文件系统对i节点来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

这也是为什么:

一个被进程打开的文件被rm后,其目录项被删除了,在du命令下是不能被统计到,?而其inode没有被删除,在df命令下是可以被统计到的,这就是在du和df存在差别的原因。

1、正常情况下,df和du输出结果都会有差距。

du -sh命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;

df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。

文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。

du命令是用户级的程序,它不考虑Meta Data,

df命令则查看文件系统的磁盘分配图并考虑Meta Data。

因此正常情况下,df计算的USED空间会比du计算的结果要稍大。

2、异常情况下,df计算的USED空间会比du大很多。

原因在于du是以文件名、目录名为依据计算空间使用的,而df是以硬盘块使用情况来计算空间使用的。

当一个应用程序正在写一个大文件的时候,我们RM或者MV了这个文件(UNIX是允许这么干的,WINDOWS在这一点上傻有傻福),应用程序会占有句柄,并根据句柄所指磁盘位置直接写磁盘,而不会检查该文件是否被删除。

上一篇:Linux I/O


下一篇:理解Linux操作系统中的块设备