linux下获取磁盘使用情况的命令 (df du )

时间:2021-02-26 05:24:33

1、前言

  在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃。为了捕获硬盘写满的异常场景,我们需要在写日志过程中判断硬盘空间的使用情况,根据硬盘的使用情况,就可以判断是否写满了。如果将要写满了,就给出警告。这样就可以避免程序崩溃。首先看一下linux获取硬盘和目录大小的命令,最后总结一下statfs结构和函数。

2、df命令

  Linux下可以用df命令获取硬盘的使用情况,通过man可以获取df命令的详细情况。df命令经常用的参数为:

  a:显示全部的档案系统和各分割区的磁盘使用情形 
  i:显示i -nodes的使用量 
  k:大小用k来表示 (默认值) 
  t:显示某一个档案系统的所有分割区磁盘使用量 
  x:显示不是某一个档案系统的所有分割区磁盘使用量 
  T:显示每个分割区所属的档案系统名称 
  常用命令:df -hi 

举例截图如下所示

linux下获取磁盘使用情况的命令 (df  du )

3、du命令

  du命令用来查询档案或目录的磁盘使用空间,通过man获取du命令的详细介绍。常用的命令参数如下: 
  a:显示全部目录和其次目录下的每个档案所占的磁盘空间 
  b:大小用bytes来表示 (默认值为k bytes) 
  c:最后再加上总计 (默认值) 
  s:只显示各档案大小的总合 (summarize) 
  x:只计算同属同一个档案系统的档案 
  L:计算所有的档案大小 
  常用命令:du -ah

举例操作如下图所示:

linux下获取磁盘使用情况的命令 (df  du )

简单总结一下:df与du的区别,du查看目录大小,df查看磁盘使用情况。

du -sh命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;
而df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。
文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。
du命令是用户级的程序,它不考虑Meta Data,而df命令则查看文件系统的磁盘分配图并考虑Meta Data。

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

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

这也是之前碰到的问题,df查看结果文件系统100%使用了,而du的结果是还有6GB空闲的,就这么个问题硬件厂商一个SUPPORT居然不知道怎么解释,这也是让我好奇晚上回来查查看究竟的原因,结果GOOGLE一下就有了。

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

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

因此就会产生上述的问题。具体到Oracle层面,可能发生这种情况的有:Oracle因为某种原因在生成很大的TRACE文件,可能导致oracle等目录满,如果此时直接RM或MV掉该TRACE文件会发现空间并不会释放,进而可能导致Oracle数据库DOWN机。

解决办法:使用“> tracefile.trc”命令清空掉该文件,如果需要保留TRACE文件便于事后分析问题,可以使用CP先复制该文件到其他地方,然后清空掉原来的文件。