两个命令功能相近,放在一块总结
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下的回收站状态。
–
–
–
评论前必须登录!
注册