du和df统计的磁盘分区大小不一致

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了du和df统计的磁盘分区大小不一致相关的知识,希望对你有一定的参考价值。

参考技术A Linux下查看磁盘空间使用情况,最常使用的是du和df。有一次du和df统计的磁盘分区大小不一致,这是为什么呢?二者有什么区别?网上搜索下,大神早有总结,实践后汇总学习下。

du对待统计文件逐个系统调用fstat,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。

1.如果统计目录下挂载了其他文件系统,那么也会对这个文件系统进行统计。计算时记得将这一部分从总和中去掉。

2.如果文件被删除,即使被其他进程引用了,du命令也无法对其统计。因为stat命令找不到这个文件。

3.可以跨分区统计某些你想统计的文件大小总和。因为它们都能被stat找到并统计。

df使用系统调用statfs,直接读取分区的超级块superblock信息来获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块(superblock才占用1024字节),所以运行速度不受文件多少影响。

1. 当某个文件系统下挂载了其他分区,df不会把这个分区也统计进去。

因为df读取的是各自分区的superblock,即使分区1挂载在分区0的目录下,df统计分区0的时候,也只能读取分区0的superblock。

2.由于df每次统计都是读取superblock,所以df对文件系统中的 某个文件 进行统计时,会自动转为统计这个 文件系统(分区)的信息 。 也就是说,df通过文件找到对应的分区挂载点。

[root@xuexi ~]# df -hT /etc/fstab

Filesystem    Type  Size  Used Avail Use% Mounted on

/dev/sda2      ext4  18G  1.7G  15G  11% /

3. df会统计因子挂载点而被隐藏的原目录文件大小。

如果在/mnt目录下有3G的文件,然后在/mnt上挂载了其他文件系统,/mnt下原本那3G的文件就被隐藏起来无法访问,du无法统计这部分数据大小(但du会统计挂载在/mnt上的文件),但df会统计这部分信息。

4.df会统计已删除但却仍有进程引用的文件。

正常情况下,删除文件会立刻释放相关指针,并将imap和bmap中相关的位图标记为未使用。bmap只要一改变,文件系统立刻就能知道每个块组中哪些数据块是空闲的,哪些数据块是被使用的,这些信息都会更新到分区的superblock中。于是df能立刻统计到实时的磁盘空间信息。读写文件的过程以及涉及的imap和bmap,后面再研究。

常见的df和du不一致情况是文件删除的问题。当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不再统计它。然而如果此时还有运行的进程持有这个已经被删除文件的句柄,这个文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

在home下创建一个1G大小的文件test.log,df -h /home和du -sh --max-depth=1 /home查看磁盘空间占用情况。

tail -f  test.log &,然后rm -rf test.log。

# lsof | grep test.log

tail      23955       root    3r      REG          8,1  1048576000      7999 /home/test.log  (deleted) 

使用df -h /home和du -sh --max-depth=1 /home再次查看磁盘空间占用情况。发现df没有变化,而du则不再统计被删除了的文件test.log。

停止进程23955,使用df和du再次查看,数据一致了。

du是用户级的程序,它不考虑Meta Data,而df命令则查看文件系统的磁盘分配图并考虑Meta Data。df命令获得真正的文件系统数据,而du命令只查看文件系统的部分情况。

df和du显示的磁盘空间使用情况不一致的原因及处理

详细分析du和df的统计结果为什么不一样

df命令 du命令 磁盘分区

df命令
df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
df(选项)(参数)
技术分享图片
·
文件系统以pfs结尾的都是临时系统,重启之后里面的文件会自动消失。
-h:以适当的单位显示磁盘的大小。
-m:以兆为单位显示磁盘的大小。
-i:查看分区下有多少个inode以及inode使用情况。
技术分享图片
·
如果磁盘有空间,却写不进去东西,那就是inode满了
·
free查看swap磁盘的使用情况
技术分享图片
·
·
·
·
·
du命令
du:查看文件大小
技术分享图片

s:针对目录本身
-h:以适当的单位显示
du -sh和ls -lh的区别是前者使用一个块的大小为单位的,后者是更精准的大小。如下图该文件实际大小是926b,不过该系统一个的块大小是4k,所以du -sh查看它的大小就是4k。
技术分享图片
·
·
·
·
·
磁盘分区
给服务器增加一块硬盘,并分区
虚拟机:
右键虚拟机当前窗口点设置,点击添加,选择硬盘点下一步,选择硬盘类型保持默认点下一步,继续下一步,然后设置一下大小,继续下一步,然后完成。
fdisk:查看服务区硬盘
-l:列出目前系统有的磁盘
技术分享图片
·
真实的的服务器是支持热插拔的,但是虚拟机不行。所以添加好之后我们需要reboot重启虚拟机。然后就可以识别到了。
技术分享图片
·
fdisk还可以给磁盘分区,fdisk后面直接加磁盘名字就可以开始分区了。
技术分享图片
·
我们可以输入m获取帮助信息
技术分享图片
其中n、p、w、d比较常用,
n=创建一个新的分区。
p=列出来
w=保存
d=删除
·
我们可以先用p查看一下发现没有分区,然后我们使用n新建,之后会出来两个选项让你选择分区类型,p代表主分区,e代表扩展分区。
技术分享图片
·
我们用的fdisk划分分区他有一个格式叫mbi,这个格式有一个特点最高支持给两个T的磁盘分区,并且最多只能有4个主分区,并且主分区的个数加上扩展分区不能大于4,如果我们想多划分区,那么就划分3个主分区,然后再划分一个扩展分区,之后在扩展分区里面再划分逻辑分区。
·
我们输入n来划分一个主分区,然后它会让你输入分区号,默认是1,然后又会让你选择扇区,默认2048开始,然后我们来给它指定大小,我们来给它划分两个G的空间,就是+2G,
技术分享图片
·
然后我们p查看一下就可以看到多了一个分区:
技术分享图片
·
然后我们按照上面的方法再分一个2G的主分区,和2个1G的主分区,这样4个分区就用完了,然后我们再划分就分不了。
技术分享图片
·
如果我们想要再分区就需要使用d删除一个分区,输入d回车会后它会让你选择要删除的分区号,默认为4
技术分享图片
·
然后我们再开始分区,这次我们按e分一个扩展分区,可以看到下图的id位置就是看分区类型的,主分区逻辑分区都是83,5是扩展分区。
技术分享图片
·
然后我们再创建分区,这次没有让你选择分区类型,也就是说只能逻辑分区,然后我们分两个1G的逻辑分区,
技术分享图片
·
如果我们删除逻辑分区5那么原来的逻辑分区6的名字就会变成5,也就是逻辑分区的分区号是不会留空的,也就是说是连续的,并且逻辑分区的分区号是是从5开始的,因为前面4个是留给主分区和扩展分区的,
技术分享图片
·
删除主分区是会留空的。
技术分享图片
·
划分好之后如果不想保存就直接按q退出就好,刚刚的分区操作都不会保存。
·
CTRL+U删除错误指令
·

以上是关于du和df统计的磁盘分区大小不一致的主要内容,如果未能解决你的问题,请参考以下文章

Linux 系统磁盘空间占满,df 和 du 结果不一致

df、du、磁盘分区

df命令 du命令 磁盘分区

查看磁盘分区使用情况

df命令 du命令 磁盘分区 parted分区gpt格式

df,du,磁盘分区