df 和 du 之间的差异

df 和 du 之间的差异

我有一个关于“df -h”和“du -bs”之间的区别的问题。我在这里看到了几个关于它的问题,但问题始终是“df -h”报告的已用空间比“du -bs”多。我遇到了相反的问题:

[root@CDPPRIM01 oracle-dbf]# du -bs
336178610176。

[root@CDPPRIM01 数据文件]# df -h | grep dbf
/dev/sda2 360G 272G 85G 77% /opt/oracle-dbf

[root@CDPPRIM01 数据文件]# ls -la
总计 284550000
drwxrwxr-x 2 oracle oinstall 4096 4 月 9 日 14:13。
drwxr-xr-x 4 root root 4096 4 月 3 日 10:33 ..
-rw-r----- 1 oracle dba 9748480 4月 11 17:01 control01.ctl
-rw-r----- 1 oracle dba 9748480 4月 11 17:01 control02.ctl
-rw-r----- 1 oracle dba 968892416 4月 11 16:20 pn310_admin_DATA22.dbf
-rw-r----- 1 oracle dba 104865792 4月 11 16:20 pn310_admin_DATA.dbf
-rw-r----- 1 oracle dba 32212262912 4月 11 16:20 pn310_DATA11.dbf
-rw-r----- 1 oracle dba 32212262912 4月 11日 17:00 pn310_DATA12.dbf
-rw-r----- 1 oracle dba 32212262912 4月 11 17:00 pn310_DATA13.dbf
-rw-r----- 1 oracle dba 32212262912 4月 11 16:20 pn310_DATA14.dbf
-rw-r----- 1 oracle dba 5242888192 4月 11日 17:01 pn310_DATA15.dbf
-rw-r----- 1 oracle dba 1073750016 4月 11 17:00 pn310_DATA.dbf
-rw-r----- 1 oracle dba 5798633472 4月 11日 16:20 pn310_dwe_DATA20.dbf
-rw-r----- 1 oracle dba 1073750016 4月 11 16:20 pn310_dwe_DATA.dbf
-rw-r----- 1 oracle dba 104865792 4月 3日 10:42 pn310_dwe_TEMP.dbf
-rw-r----- 1 oracle dba 5263859712 4月 3 11:28 pn310_dwe_temp_TEMP9.dbf
-rw-r----- 1 oracle dba 32212262912 4月 11 16:20 pn310_ep_DATA16.dbf
-rw-r----- 1 oracle dba 32212262912 4月 11 16:20 pn310_ep_DATA17.dbf
-rw-r----- 1 oracle dba 32212262912 4月 11 16:20 pn310_ep_DATA18.dbf
-rw-r----- 1 oracle dba 9437192192 4月 11日 16:20 pn310_ep_DATA19.dbf
-rw-r----- 1 oracle dba 1073750016 4月 11 16:50 pn310_ep_DATA.dbf
-rw-r----- 1 oracle dba 104865792 4月 3日 10:42 pn310_ep_TEMP.dbf
-rw-r----- 1 oracle dba 16001277952 4月 3日 11:27 pn310_ep_temp_TEMP8.dbf
-rw-r----- 1 oracle dba 104865792 4月 11日 06:00 pn310_TEMP.dbf
-rw-r----- 1 oracle dba 16001277952 4月 11日 17:01 pn310_temp_TEMP7.dbf
-rw-r----- 1 oracle dba 11811168256 4月 11日 16:51 pn310_xmp_DATA21.dbf
-rw-r----- 1 oracle dba 1073750016 4月 11 17:00 pn310_xmp_DATA.dbf
-rw-r----- 1 oracle dba 104865792 4月 3日 10:42 pn310_xmp_TEMP.dbf
-rw-r----- 1 oracle dba 2042634240 4月 3日 11:29 pn310_xmp_temp_TEMP10.dbf
-rw-r----- 1 oracle dba 566239232 4月 11 17:00 sysaux01​​.dbf
-rw-r----- 1 oracle dba 4802486272 4月 11 16:57 sysaux_DATA24.dbf
-rw-r----- 1 oracle dba 754982912 4月 11 16:58 system01.dbf
-rw-r----- 1 oracle dba 4613742592 4月 11日 17:00 system_DATA23.dbf
-rw-r----- 1 oracle dba 1073750016 4月 10 23:07 temp01.dbf
-rw-r----- 1 oracle dba 1073750016 4 月 3 日 10:38 temp02.dbf
-rw-r----- 1 oracle dba 3221233664 4 月 3 日 11:31 temp_TEMP11.dbf
-rw-r----- 1 oracle dba 1073750016 4月 11 17:01 undotbs01.dbf
-rw-r----- 1 oracle dba 1073750016 4月 11 17:00 undotbs02.dbf
-rw-r----- 1 oracle dba 13958651904 4月 11 17:01 undotbs1_DATA26.dbf
-rw-r----- 1 oracle dba 5251072 4月 11 16:20 users01.dbf
-rw-r----- 1 oracle dba 1068507136 4月 11 16:20 users_DATA25.dbf

将所有文件加起来,我们得到 336178593792,以 GB 为单位等于:336178593792/1024/1024/1024 = 313GB,大于“df -h”报告的 272GB。

我已经执行了 umount 和 fsck 来检查分区,它是干净的。有人知道这种现象背后的原因是什么吗?

答案1

一种可能性是稀疏文件如果给定文件的大部分不包含数据,则无需为文件的这些部分分配物理块,假设操作系统和文件系统支持它。

要检查稀疏文件,请使用带有开关-s(显示硬盘占用的空间)和-k(显示以千字节为单位的块的大小)的调用 ls。

示例输出:

$ df -H /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       118G   38G   75G  34% /
$
$ dd if=/dev/zero of=1GB-normal bs=1GB count=1 # normal file (1 GB)
$
$ df -H /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       119G   38G   75G  34% /
$
$ dd if=/dev/zero of=1GB-sparse bs=1GB count=0 seek=1GB # sparse file (1 GB)
$
$ df -H /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       119G   38G   75G  34% /
$
$ ls -lks
total 976568
976568 -rw-rw-r-- 1 dennis dennis 976563 Apr 11 13:05 1GB-normal
     0 -rw-rw-r-- 1 dennis dennis 976563 Apr 11 13:06 1GB-sparse

由于稀疏文件几乎不占用磁盘上的物理空间,因此创建后 df 的输出不会改变。

答案2

我不太清楚这里发生了什么,但我可以给你一些指点。

  1. du -b暗示了该--apparent-size选项。从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
    -b, --bytes
          equivalent to `--apparent-size --block-size=1'
    
  2. 我不确定 Oracle 如何处理其数据库文件,但如果有些文件确实很稀疏,我也不会感到惊讶。我认为这是最可能的原因,请参阅这里讨论这将如何影响du

  3. 这一页对两个程序计算磁盘使用量的方式的一些差异进行了很好的解释。

  4. 手册页中还有一些相关信息df

    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    Display values are in units of the first available  SIZE  from
    --block-size,  and the DF_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE
    environment variables.  Otherwise, units default to 1024 bytes
    (or 512 if POSIXLY_CORRECT is set).
    
    SIZE  may be (or may be an integer optionally followed by) one
    of following: KB 1000, K 1024, MB 1000*1000, M 1024*1024,  and
    so on for G, T, P, E, Z, Y.
    

相关内容