路漫漫其修远兮
吾将上下而求索

linux磁盘统计:du和df命令

两个命令功能相近,放在一块总结

df命令

        df – report file system disk space usage,用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

1.命令格式:

        df [选项] [文件]

2.命令功能:

        显示指定磁盘文件的可用空间。如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以 1KB 为单位进行显示,除非环境变量 POSIXLY_CORRECT 被指定,那样将以512字节为单位进行显示

3.命令参数:

        必要参数:

                -a 全部文件系统列表,包括假文件系统

                -h 方便阅读方式显示

                -H 等于“-h”,但是计算式,1K=1000,而不是1K=1024,如果文件比较大,差别还是蛮大的

                -i 只显示inode信息

                -k 区块为1024字节,以KB为单位进行输出,默认输出方式

                -m 区块为1048576字节,以MB为单位进行输出

                -T 文件系统类型

        选择参数:

                –block-size=<区块大小> 指定区块大小

                -t<文件系统类型> 只显示选定文件系统的磁盘信息

                -x<文件系统类型> 不显示选定文件系统的磁盘信息

                –help 显示帮助信息

4.例子

默认输出模式为以KB为单位的输出,有很多有用的信息,可以通过脚本将需要的信息提取出来进行监控。

[root@master ~]#df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       50264772 8539920  39164852  18% /
tmpfs             337204     224    336980   1% /dev/shm
/dev/sda1         194241   34193    149808  19% /boot
/dev/sda3       30106576   44992  28525584   1% /test
cm_processes      337204       0    337204   0% /opt/cm-5.6.0/run/cloudera-scm-agent/process

这种方式最适合人来看:df -Th

[root@master ~]#df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda2      ext4    48G  8.2G   38G  18% /
tmpfs          tmpfs  330M  224K  330M   1% /dev/shm
/dev/sda1      ext4   190M   34M  147M  19% /boot
/dev/sda3      ext4    29G   44M   28G   1% /test
cm_processes   tmpfs  330M     0  330M   0% /opt/cm-5.6.0/run/cloudera-scm-agent/process

只显示自己想要看到的文件系统类型的目录使用情况,这种不太好,不一定正常使用的磁盘的类型就是ext4,也有可能是ext3,要注意这种情况,最好是根据多个判别方法来区分是否是物理磁盘

[root@master ~]#df -t ext4 -hT
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sda2      ext4   48G  8.2G   38G  18% /
/dev/sda1      ext4  190M   34M  147M  19% /boot
/dev/sda3      ext4   29G   44M   28G   1% /test

还有一个是inode使用情况,这个也要进行监控,以防出现inode设置少,磁盘里的小文件比较多,导致inode占用多

[root@master ~]#df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda2        3.1M  148K  3.0M    5% /
tmpfs             83K     5   83K    1% /dev/shm
/dev/sda1         50K    38   50K    1% /boot
/dev/sda3        1.9M    11  1.9M    1% /test
cm_processes      83K     1   83K    1% /opt/cm-5.6.0/run/cloudera-scm-agent/process

du命令

du – estimate file space usage,对文件和目录磁盘使用的空间的查看。df是查看系统总体使用情况,这个是查看某个目录或文件磁盘使用量

1.命令格式:

        du [选项][文件]

2.命令功能:

        显示每个文件和目录的磁盘使用空间。

3.命令参数:   

        -b或-bytes  显示目录或文件大小时,以byte为单位。   

        -k或–kilobytes  以KB(1024bytes)为单位输出。默认输出

        -m或–megabytes  以MB为单位输出。   

        -s或–summarize  仅显示总计,只列出最后加总的值。

        -h或–human-readable  以K,M,G为单位,提高信息的可读性。

        -L<符号链接>或–dereference<符号链接> 显示选项中所指定符号链接的源文件大小。   

        -X<文件>或–exclude-from=<文件>  在<文件>指定目录或文件。   

        –exclude=<目录或文件>         略过指定的目录或文件。    

        -H或–si  与-h参数相同,但是K,M,G是以1000为换算单位,如果文件比较大,相差的结果还是蛮大的

4.例子

默认情况下是以KB为单位进行显示的,如果计算的文件里面有目录,会显示出目录里面的每个文件所占的空间,

[root@master ~]#ls
caf  cloudera-manager-el6-cm5.6.0_x86_64.tar.gz  jdk-7u67-linux-x64.rpm

[root@master ~]#du *
16	caf/var/lib/vmware-caf/pme/data/input/certs
20	caf/var/lib/vmware-caf/pme/data/input/providerReg
44	caf/var/lib/vmware-caf/pme/data/input
48	caf/var/lib/vmware-caf/pme/data
52	caf/var/lib/vmware-caf/pme
56	caf/var/lib/vmware-caf
60	caf/var/lib
64	caf/var
68	caf
508276	cloudera-manager-el6-cm5.6.0_x86_64.tar.gz
123884	jdk-7u67-linux-x64.rpm

[root@master ~]#du -b *
8542	caf/var/lib/vmware-caf/pme/data/input/certs
6179	caf/var/lib/vmware-caf/pme/data/input/providerReg
19157	caf/var/lib/vmware-caf/pme/data/input
23253	caf/var/lib/vmware-caf/pme/data
27349	caf/var/lib/vmware-caf/pme
31445	caf/var/lib/vmware-caf
35541	caf/var/lib
39637	caf/var
43733	caf
520468069	cloudera-manager-el6-cm5.6.0_x86_64.tar.gz
126857158	jdk-7u67-linux-x64.rpm

[root@master ~]#du -h *
16K	caf/var/lib/vmware-caf/pme/data/input/certs
20K	caf/var/lib/vmware-caf/pme/data/input/providerReg
44K	caf/var/lib/vmware-caf/pme/data/input
48K	caf/var/lib/vmware-caf/pme/data
52K	caf/var/lib/vmware-caf/pme
56K	caf/var/lib/vmware-caf
60K	caf/var/lib
64K	caf/var
68K	caf
497M	cloudera-manager-el6-cm5.6.0_x86_64.tar.gz
121M	jdk-7u67-linux-x64.rpm

如果想要只显示某个目录的总共大小,不显示里面每个文件大小,使用-s选项

[root@master ~]#du -sh *
68K	caf
497M	cloudera-manager-el6-cm5.6.0_x86_64.tar.gz
121M	jdk-7u67-linux-x64.rpm

如果想要排除某个目录或者文件,下面的是显示的当前目录下文件大小,排除了caf目录

[root@master ~]#du --exclude caf -sh *
497M	cloudera-manager-el6-cm5.6.0_x86_64.tar.gz
121M	jdk-7u67-linux-x64.rpm

显示当前目录的总占用空间大小

[root@master ~]#du -sh ./
637M	./

du和ls显示文件大小不同的原因   

先看一个例子:

[root@master ~]#dd if=/dev/zero of=test bs=1M seek=1024 count=0
0+0 records in
0+0 records out

0 bytes (0 B) copied, 0.00396309 s, 0.0 kB/s

[root@master ~]#du -h test 
0	test

[root@master ~]#ll -h test 
-rw-r--r-- 1 root root 1.0G Apr 13 22:55 test

造成这二者不同的原因主要有两点:

        稀疏文件(sparse file):稀疏文件指文件中有“洞”(hole)的文件

        ls和du显示出的size有不同的含义

使用稀疏文件的优点如下(Wikipedia上的原文):

        The advantage of sparse files is that storage is only allocated when actually needed: disk space is saved, and large files can be created even if there is insufficient free space on the file system.

        即稀疏文件中的“洞”可以不占存储空间。

        简单的说:就是ls查看的是元数据里面显示的数据,对于上面的1GB文件test,在元数据里面写的大小是1GB,没有错,因为test里面的空数据很多,系统给压缩存放在一起了,实际占用的磁盘空间很少。而du命令就是去实际看你的这个test数据占用了几个块大小,就显示占用了多大的空间,也没有错,从两个方面来看问题。


再来看一下ls和du输出的文件大小的含义(Wikipedia上的原文):

        The du command which prints the occupied space, while ls print the apparent size。

换句话说,ls显示文件的“逻辑上”的size,而du显示文件“物理上”的size,即du显示的size是文件在硬盘上占据了多少个block计算出来的。举个例子:

[root@master ~]#echo 1 > file

[root@master ~]#ll file 
-rw-r--r-- 1 root root 2 Apr 13 23:14 file

[root@master ~]#du -h file 
4.0K	file

        这里我们先创建一个文件1B.txt,大小是一个字节,ls显示出的size就是1Byte,而1B.txt这个文件在硬盘上会占用N个block,然后根据每个block的大小计算出来的。这里之所以用了N,而不是一个具体的数字,是因为隐藏在幕后的细节还很多,例如Fragment size,我们以后再讨论。

        当然,上述这些都是ls和du的缺省行为,ls和du分别提供了不同参数来改变这些行为。比如ls的-s选项(print the allocated size of each file, in blocks)和du的–apparent-size选项(print  apparent  sizes,  rather than disk usage; although the apparent size is usually smaller, it may be larger due to holes in (`sparse') files, internal fragmentation, indirect blocks, and the like)。

        此外,对于拷贝稀疏文件,cp缺省情况下会做一些优化,以加快拷贝的速度。

如果是监控磁盘的使用空间大小,要以du命令的结果为准,因为是以磁盘的实际存储的大小为准,只要du命令显示有空间,就可以往里面写入数据,即使ls命令显示的数据已经超过了磁盘的容量。

[root@master /test]#df -h    #查看test目录还有很多空间可以使用
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        48G  8.2G   38G  18% /
tmpfs           330M  224K  330M   1% /dev/shm
/dev/sda1       190M   34M  147M  19% /boot
/dev/sda3        29G   44M   28G   1% /test
cm_processes    330M     0  330M   0% /opt/cm-5.6.0/run/cloudera-scm-agent/process

[root@master /test]#dd if=/dev/zero of=test bs=10M seek=1024 count=0    #使用刚才的命令往里面复制大量的数据
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000148791 s, 0.0 kB/s
[root@master /test]#dd if=/dev/zero of=test1 bs=10M seek=1024 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000146035 s, 0.0 kB/s
[root@master /test]#dd if=/dev/zero of=test2 bs=10M seek=1024 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000148791 s, 0.0 kB/s
[root@master /test]#dd if=/dev/zero of=test3 bs=10M seek=1024 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000146035 s, 0.0 kB/s
[root@master /test]#dd if=/dev/zero of=test4 bs=10M seek=1024 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000148791 s, 0.0 kB/s
[root@master /test]#dd if=/dev/zero of=test5 bs=10M seek=1024 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000146035 s, 0.0 kB/s
[root@master /test]#dd if=/dev/zero of=test6 bs=10M seek=1024 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000146035 s, 0.0 kB/s

[root@master /test]#ll -h    #显示的数据已经超过磁盘的空间大小了
total 16K
drwx------. 2 root root 16K Jul 21  2016 lost+found
-rw-r--r--  1 root root 10G Apr 13 23:24 test
-rw-r--r--  1 root root 10G Apr 13 23:24 test1
-rw-r--r--  1 root root 10G Apr 13 23:25 test2
-rw-r--r--  1 root root 10G Apr 13 23:25 test3
-rw-r--r--  1 root root 10G Apr 13 23:25 test4
-rw-r--r--  1 root root 10G Apr 13 23:25 test5
-rw-r--r--  1 root root 10G Apr 13 23:25 test6
[root@master /test]#df -h    #但是用df命令显示的磁盘容量还是很多
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        48G  8.2G   38G  18% /
tmpfs           330M  224K  330M   1% /dev/shm
/dev/sda1       190M   34M  147M  19% /boot
/dev/sda3        29G   44M   28G   1% /test
cm_processes    330M     0  330M   0% /opt/cm-5.6.0/run/cloudera-scm-agent/process

[root@master ~]#cp cloudera-manager-el6-cm5.6.0_x86_64.tar.gz jdk-7u67-linux-x64.rpm /test/    #还能往里面复制文件

[root@master /test]#ll -h
total 618M
-rw-r--r-- 1 root root 497M Apr 13 23:26 cloudera-manager-el6-cm5.6.0_x86_64.tar.gz
-rw-r--r-- 1 root root 121M Apr 13 23:26 jdk-7u67-linux-x64.rpm
-rw-r--r-- 1 root root  10G Apr 13 23:24 test
-rw-r--r-- 1 root root  10G Apr 13 23:24 test1
-rw-r--r-- 1 root root  10G Apr 13 23:25 test2
-rw-r--r-- 1 root root  10G Apr 13 23:25 test3
-rw-r--r-- 1 root root  10G Apr 13 23:25 test4
-rw-r--r-- 1 root root  10G Apr 13 23:25 test5
-rw-r--r-- 1 root root  10G Apr 13 23:25 test6
[root@master /test]#du -sh ./    #du命令显示的很小
618M	./
[root@master /test]#df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        48G  8.2G   38G  18% /
tmpfs           330M  224K  330M   1% /dev/shm
/dev/sda1       190M   34M  147M  19% /boot
/dev/sda3        29G  662M   27G   3% /test
cm_processes    330M     0  330M   0% /opt/cm-5.6.0/run/cloudera-scm-agent/process

du和df显示占用不一样

有时候df显示磁盘满了,但是du查看磁盘占用量不高,可能情况是进程没有将文件释放

 lsof |grep delete
根据lsof列出的进程号,kill这些进程后,空间就释放出来了.

linux里的文件被删除后,空间没有被释放是因为在Linux系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。

状态为deleted为标记被删除,其实该文件并没有从磁盘中删除,类似windows下的回收站状态。

参考文章1

未经允许不得转载:江哥架构师笔记 » linux磁盘统计:du和df命令

分享到:更多 ()

评论 抢沙发

评论前必须登录!