Gih's Blog

只言片语

AIX下df 与du 显示不一致问题

2011-07-29 by gihnius, tagged as linux, unix

df命令:通过文件系统中未分配的空间来确定文件系统中已分配空间的大小. 

例如: 如果一个文件系统中有 8192 个512-byte 块, 并且4096 个块没有被分配出去, 那么已分配的空间就是4096 个512-byte 块.已分配空间 = 空间总数 - 未分配空间因为基于文件系统总体来计算, 所以df 命令是报告文件系统空间使用情况最可靠的命令.

du 命令:是面向文件的命令, 它计算分配给指定文件或者目录的空间. du 命令只计算被文件占用的空间, 不计算文件系统metadata 占用的空间, 如inodes, inode maps, 或者disk maps.du 命令只计算那些可以访问的文件所占用的存储空间, 有下面两种情况 du 命令不会计算已经分配给文件的空间.

1. 文件被隐藏了.例如: 如果一个文件存放在 /bobby 目录下, 接着有文件系统安装在 /bobby 目录下, 那么, du 命令将不会计算 /bobby 目录下的文件所占用的存储空间,

2. 文件被其他的应用打开了, 接着文件被删除了. 在这种情况下, 文件所占用的存储空间将维持着被分配的状态直到所有对这个文件的访问都被关闭.由于目录中没有这个文件的相关纪录, du 命令将不会计算这个文件的被分配空间, 然而df 命令将计算这部分已分配的空间.系统中经常会出现上面陈述的第二种情况, 结果是df 显示的比 du 统计的, 可以使用fuser命令查找出"占用空间"的进程:

# fuser -dV /Filesystem 
上述命令会给出进程的工作目录,占用的inode,进程号等相关信息.
# df -m
Filesystem    MB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4       10240.00    600.42   95%    10580     1% /
/dev/hd2        4096.00   2105.22   49%    40503     4% /usr
/dev/hd9var     1024.00    423.75   59%     1125     1% /var
/dev/hd3        4096.00   3668.99   11%      278     1% /tmp
/dev/fwdump      384.00    371.91    4%       17     1% /var/adm/ras/platform
/dev/hd1        1024.00    990.42    4%      489     1% /home
/proc                 -         -    -         -     -  /proc
/dev/hd10opt   30720.00  18911.46   39%    28647     1% /opt
/dev/lv_mms1  555776.00 234959.96   58%    24317     1% /ShareDisks1 

# du -xsm /
18.23   /

# fuser -dV /
/: 
inode=40     size=44           fd=0      290822
inode=40     size=44           fd=0      327928
inode=36     size=16802        fd=0      401642 
上面的情况由于出现在 / 根文件系统, 使用du 时记得加 "-x" 选项, 这样才统计根文件系统所在 LV 的空间使用. 发现多个进程时, 可用 ps 找出具体的程序或脚本, 根据程序或脚本的特点判断是哪个"占用空间"!如果AIX上已安装 lsof , 可用结合使用.