如何使用df和du查看linux系统linux 查看磁盘容量量信息

用户名:wushank
文章数:248
评论数:13
访问量:310595
注册日期:
阅读量:1297
阅读量:3317
阅读量:445105
阅读量:1130833
51CTO推荐博文
&&&&&& 发现一台用户的电脑,df检查出来的/磁盘空间占用了16G,比用du查看得到的磁盘空间大的多,du查看/下所有程序目录加起来还不到5G。这是什么原因呢?即便是有隐藏文件,查了也很小啊。一、df和du的统计机制:&&& 1、du会把指定目录下所有文件、目录、目录下的文件都统计。是建立在文件系统能看到的的确确是有这样一些文件的基础上的。也就是说我们能在文件系统里面看到的文件才会被du统计。&&& 2、df(df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。):&&&&&&& &&&&&& 这要从程序写文件的方式来谈起,一个进程要向一个文件里面写东西,那么会得到一个pointer,然后向指针指向的文件(磁盘区域)写入。假如由于某些原因(也可能人为)被指向的文件被删除了,但是(&write
call)并不知道文件是否还在,就还会继续向里面写,不管文件是否存在,磁盘块还是被写操作使用。于是因为文件没有了,所以du统计不到写入的这些磁盘块,但是因为写的进程还在,磁盘空间没有被释放,所以df却能统计到,所以df统计的结果比du大很多。如何解决呢?1.停止系统上的程序。2.如果还是不行,unmount一下文件系统看看3.重启系统二、ls和du统计机制:&&&&& 一个文件占用的磁盘空间和一个文件的大小是两码事情。&&&&& 占用空间取决于文件系统的块(block)的大小,linux一般默认是4k(4096),因此,一个大小为1个字节的文件,最小也要占用4k,如果你创建文件系统的时候制定块大小是16K,那么即便一个文件只有1个字节,占用空间也是16K。&&&&& 如果一个分区上主要放大文件,那么block可以大一些,有利于减少磁盘碎片,如果主要放小文件,那么block设置小一下,否则太浪费磁盘空间。&&&&& 通常情况下,ls 显示的文件大小比du显示的磁盘占用空间小&&&&& 原因:&& 比如文件系统的block是4K,一个13K的文件占用的空间是 13k/4k = 3.25个block,一个block只能被一个文件占用,因此实际占用空间就是4个block,就是16K。&&&&& 如果一个文件有比较大的黑洞,那么会出现文件大小比磁盘空间占用大的情况&&&&& 原因:&& 首先要理解什么是黑洞,怎么才能产生黑洞?&&&&&&&& 在向一个文件中写数据的时候,文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这一定是允许的。位于文件中但没有写过的字节都被读为0.&& 文件中的空洞并不要求在磁盘上占用存储区。具体处理方式与文件系统的实现有关,当定位超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。&&& 稀疏文件--文件中有“洞”(hole)的文件用Shell也可以创建稀疏文件:$&dd&if=/dev/zero&of=sparse_file.img&bs=1M&seek=1024&count=0
0+0&records&in
0+0&records&out查看方法:&ls -s& : 反应磁盘分配情况,非实际文件大小,以block为单位&&& == du&ls -lh : 反应实际文件大小&&& == du --apparent-size
了这篇文章
类别:┆阅读(0)┆评论(0)介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
df &[-ahikHTm] &[目录或者文件夹]
-h : 以交较易识别的方式展示使用量 &1111000KB -& XXXMB , 默认以KB的方式显示
-i : 不使用磁盘容量,用inode 的数量来显示
-a : 列出所有的文件系统, 包括系统特有的 /proc 等文件系统
-k : 以KB的容量显示 文件系统 (默认)
-m: 以MB的容量显示 文件系统&
-H : 以 1000的进制代替1024的进制方式
-T : 连同该分区的文件系统的名称(ext3)等也列出
df -h [dirname|filename]
===============================================
du [-ahskm] 文件或目录名称
-s : 列出总量而已,而不列出每个个别的目录占用容量 !!!!
-h : 以易读的方式(G/M)显示
-a : 列出所有的文件与目录容量,默认仅统计目录下的文件量
-S: 不包括目录下的总计,与-s 有差别
-k: 以KB列出容量显示
-m: 以MB列出容量显示
以KB的形式列出当前目录下的文件 | 文件夹 占用大小
以人识别的方式列出大小
du -sh ./*
按照KB排序 最终显示前5条, 以KB的单位衡量
本文已收录于以下专栏:
相关文章推荐
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
介绍两个常用的Linux指令 df, dh
df 常用来查看磁盘的占用情况。
du 常用来查看文件夹的大小等。
Linux命令:
[-ahikHTm]
df命令是&span style=&text-decoration: line-height: normal !importan
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)拒绝访问 | www.laozuo.org | 百度云加速
请打开cookies.
此网站 (www.laozuo.org) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(38ca83fb852843cb-ua98).
重新安装浏览器,或使用别的浏览器后使用快捷导航没有帐号?
查看: 1563|回复: 2
系统出现df与du统计结果不一致的情况,解决方法
注册会员, 积分 150, 距离下一级还需 50 积分
论坛徽章:2
核心提示:
由于某些文件在文件系统中使用rm -rf 删除后,仍然被某个进程所占用,由于df与du统计方式的不一致。
处理方法:
1 lsof | grep delete
2 得到占用文件的进程,重启该进程,释放文件。
======================================================================
相关优秀文档:
在下查看磁盘空间使用情况,最常使用的就是du和df了。然而两者还是有很大区别的,有时候其输出结果甚至非常悬殊。1. 如何记忆这两个命令du-Disk Usagedf-Disk Free2. df 和du 的工作原理2.1 du的工作原理du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
2.2 df的工作原理df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。
3 du和df不一致情况模拟常见的df和du不一致情况就是文件删除的问题。当一个文件被删除后,在文件系统 目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。
(1)当前分区sda1的使用情况
[root@centos192 testdu]# df -h /dev/sda1&&文件系统& && && & 容量&&已用&&可用 已用%% 挂载点&&/dev/sda1& && && && &&&49G&&776M& &45G& &2% /var&&
(2)新建一个1GB的大文件
[root@centos192 var]# dd if=/dev/zero of=myfile.iso bs=1024k count=1000&&记录了1000+0 的读入&&记录了1000+0 的写出&&字节(1.0 GB)已复制,24.0954 秒,43.5 MB/秒&&
(3)此时的分区sda1使用情况
[root@centos192 var]# df -h /dev/sda1&&文件系统&span style=&white-spacere&&&&&/span&& && &容量&&已用&&可用 已用%% 挂载点&&/dev/sda1& && && && &&&49G&&1.8G& &44G& &4% /var&&
[root@centos192 var]# du -sh /var/&&1.6G& & /var/&&
此时两者结果基本相同。
(4)模拟一个进程打开这个大文件,然后删除这个大文件
[root@centos192 var]# tail -f myfile.iso &&&[1] 23277&&[root@centos192 var]# rm -f myfile.iso& &
(5)此时,再对比du和df的结果
首先确认有进程持有myfile.iso句柄。
[root@centos192 var]# lsof | grep myfile.iso&&tail& && &23955& && &root& & 3r& && &REG& && && && && & 8,1 & && & 7999 /var/myfile.iso (deleted)&&
[root@centos192 var]# du -sh /var/&&596M& & /var/&&[root@centos192 var]# df -h /dev/sda1&&文件系统& && && & 容量&&已用&&可用 已用%% 挂载点&&/dev/sda1& && && && &&&49G&&1.8G& &44G& &4% /var&&
可以看出,df结果没有变化,而du则不再统计被删除了的文件myfile.iso。
(6)停止模拟进程,再对比du和df结果
首先确认没有进程持有myfile.iso句柄。
[root@centos192 var]# lsof | grep myfile.iso&&[root@centos192 var]#& &
[root@centos192 var]# du -sh /var/; df -h /dev/sda1&&596M& & /var/&&文件系统& && && & 容量&&已用&&可用 已用%% 挂载点&&/dev/sda1& && && && &&&49G&&776M& &45G& &2% /var&&
此时,myfile.iso已经没有进程占有它了,也就从磁盘上删除了,分区的超级块信息已经更改,df也就显示正常了。
4 工作中需要注意的地方(1)当出现du和df差距很大的情况时,考虑是否是有删除文件未完成造成的,方法是lsof命令,然后停止相关进程即可。
(2)可以使用清空文件的方式来代替删除文件,方式是:echo & myfile.iso。
(3)对于经常发生删除问题的日志文件,以改名、清空、删除的顺序操作。
(4)除了rm外,有些命令会间接的删除文件,如gzip命令完成后会删除原来的文件,为了避免删除问题,压缩前先确认没有进程打开该文件。
du和df命令都被用于获得文件系统大小的信息:df用于报告文件系统的总块数及剩余块数,du -s /&filesystem&用于报告文件系统使用的块数。但是,我们可以发现从df命令算出的文件系统使用块数的值与通过du命令得出的值是不一致的。如下例:
# du -s /tmp 返回如下值:
12920 /tmp
而 df /tmp返回如下值:
Filesystem 512-blocks Free %Used Iused %Iused Mounted on/dev/hd3
26% 391 4% /tmp
从上面的值我们可以算出&total from df& - &Free from df& = &used block count&: 57344 - 42208 = 15136. 而15136大于12920。该值差异的存在是由于du与df命令实施上的不同: du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;而df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用
户级的程序来说是不可见的,通常称为Meta Data。
du命令是用户级的程序,它不考虑Meta Data,而df命令则查看文件系统的磁盘分配图并考虑Meta Data。df命令获得真正的文件系统数据,而du命令只查看文件系统的部分情况。例如,一个frag=4096 并且 nbpi=4096的空的大小为4MB的日志文件系统
中Meta Data 的分配情况如下:
1 4k block for the LVM
2 4k super blocks
2 4k blocks for disk maps
2 4k blocks for inode maps
2 4k blocks for .indirect
32 4k blocks for inodes-------------------------
41 4k blocks for meta data on an empty 4MB file system
对于AIX 4.X 版本:
执行 du /foo返回的结果如下:
8 /foo/lost+found
要使du命令输出的结果与df 命令输出的结果匹配,我们必须要加上Meta Data。首先,将41个4k 的块转换为以512字节为单
41 * 8 = 328
328(meta data) + 16(from du) = 344
所以有344个以512字节为单位的块分配给了这个空的文件系统。
而使用 df /foo命令我们可以得到下面的结果:
Filesystem 512-blocks Free %Used Iused %Iused Mounted on
/dev/lv01 % 16 2% /foo从中我们可以得到该文件系统使用的块数:8192(total blocks) - 7848(free blocks) = 344。该值与上面得出的值一致。
上面的换算方法对于空的文件系统很容易实现,但是对于非空的文件系统,由于Meta Data中文件间接块的大小不定,因此较难实现。所以我们不需要查看du 与 df返回的值的匹配关系,而只需要了解du -s命令返回的值反映了分配给文件及目录的磁盘块数,而df命令则反映了文件系统的实际分配情况。df命令反映的实际情况包含了用户数据(文件及目录)和Meta Data。
另一个表现出du与df命令不同之处的例子如下:
如果用户删除了一个正在运行的应用所打开的某个目录下的文件,则du命令返回的值显示出减去了该文件后的目录的大小。但df命令并不显示减去该文件后的大小。直到该运行的应用关闭了这个打开的文件,df返回的值才显示出减去了该文件后的文件系统的使用情况。
======================================================================
df 显示的已使用磁盘占用率比du 统计出来的结果要大很多。原因,主要是由于两者计算结果的方式不同。一、实验情况
1、创建并删除文件
创建文件前的磁盘容量情况:
文件系统& && && && &&&容量&&已用 可用 已用% 挂载点
/dev/sda1& && && && &&&12G&&5.7G&&5.5G&&51% /
tmpfs& && && && && &&&506M& &&&0&&506M& &0% /dev/shm
创建文件:引用
# dd if=/dev/zero of=test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
bytes (1.0 GB) copied, 14.3055 seconds, 73.3 MB/s
现在的磁盘情况:引用
文件系统& && && && &&&容量&&已用 可用 已用% 挂载点
/dev/sda1& && && && &&&12G&&6.7G&&4.6G&&60% /
tmpfs& && && && && &&&506M& &&&0&&506M& &0% /dev/shm
模拟某个进程正在使用该文件: # tail -f /tmp/test.iso
2、删除该文件
打开另一个终端,登陆到系统中。
查看是否有进程正在使用上面创建的文件:引用
# lsof |grep test.iso
tail& && &2175& && &root& & 3r& && &REG& && &&&8,1 & &&&752972 /tmp/test.iso
把该文件删掉,并确认:引用
# rm /tmp/test.iso
rm:是否删除 一般文件 “/tmp/test.iso”? y
# ls /tmp/test.iso
ls: /tmp/test.iso: 没有那个文件或目录
查看是否还有进程在使用(注意结尾的标记):引用
# lsof |grep test.iso
tail& && &2175& && &root& & 3r& && &REG& && &&&8,1 & &&&752972 /tmp/test.iso (deleted)
查看磁盘使用情况:引用
文件系统& && && && &&&容量&&已用 可用 已用% 挂载点
/dev/sda1& && && && &&&12G&&6.7G&&4.6G&&60% /
tmpfs& && && && && &&&506M& &&&0&&506M& &0% /dev/shm
# cat /proc/diskstats |grep sda1
& &8& & 1 sda1
685 5475829
可见,虽然从ls 已经无法找到该文件,但因为tail 进程仍在使用该文件,故实际上内核并没有把这文件所占用的空间释放出来(df 的结果)。
3、停止相关进程
回到第一终端,用Ctrl+C 终止tail 进程,查看结果:引用
文件系统& && && && &&&容量&&已用 可用 已用% 挂载点
/dev/sda1& && && && &&&12G&&5.7G&&5.5G&&51% /
tmpfs& && && && && &&&506M& &&&0&&506M& &0% /dev/shm
# cat /proc/diskstats |grep sda1
& &8& & 1 sda1
226 5476379
至此,文件所占用的空间已完全释放。
从上面的实验,可得出一些情况:引用
<font color="#、若有进程在占用某个文件,而其他进程把这文件删掉,只会删除其在磁盘中的标记,而不会释放其占用的磁盘空间;直到所有访问该文件的进程退出为止;
2、df 是从内核中获取磁盘占用情况数据的,而du是统计当前磁盘文件大小的结果,由于磁盘标记已被删掉,因此du 不会计算上述被删除文件的空间,导致df 与 du的结果不一致。
三、解决问题
通常的解决方法有两个:
1、把占用文件的相关进程关闭
这可通过下面的命令得到这些已被删除,但未释放空间的文件和进程信息:# lsof |grep deleted 找到这些进程后,在安全的情况下把其关闭,空间自会马上释放。
2、以清空的方式替代删除
归根到底,产生问题的原因是,访问该文件的文件指针(句柄),在rm 动作后,因为进程仍在访问,因此,仍处在文件里面(中间或结尾处)。所以,如果用清空的方式,把文件指针重置,该文件所占用的空间也会马上释放出来。引用
# echo & /tmp/test.iso
文件系统& && && && &&&容量&&已用 可用 已用% 挂载点
/dev/sda1& && && && &&&12G&&5.7G&&5.5G&&51% /
tmpfs& && && && && &&&506M& &&&0&&506M& &0% /dev/shm
# tail -f /tmp/test.iso
tail: /tmp/test.iso: file truncated
所以,对于常发生类似问题的文件,如:日志记录文件等。以改名、清空、删除的顺序操作可避免问题。
除rm外,有些不明显的操作,也会产生类似的问题。
例如 gzip 命令,其对某个文件xxx.log进行压缩时,会产生一个新的xxx.log.gz文件,完成后,会把原来的xxx.log删除。
这时,若仍有进程在使用xxx.log文件,那么,实际上,该文件还是只会标记为deleted,其空间也不会释放,问题与上面提到的情况是相同的。所以,在编写脚本时,可先判断是否仍有进程正在使用该文件,然后再进行gzip 操作。五 文件空洞& &文件读写时,如果先文件指针偏移很大一段,然后写入1byte;这样这个文件实际占用1byte空间,但是stat查看文件大小,或者读写时,都会发现文件很大;所有没有写内容的都返回0,且不占用空间,这样的文件叫 'sparse file',即文件空洞& & 容易发生在一个进程在写一个文件,这是人工进行清空文件操作,就会产生。
金牌会员, 积分 1902, 距离下一级还需 1098 积分
论坛徽章:42
不错, 谢谢分享, 总结的很好
注册会员, 积分 139, 距离下一级还需 61 积分
论坛徽章:2
好东西,谢谢分享学写了

我要回帖

更多关于 linux df du 不一致 的文章

 

随机推荐