注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

du、df、ls查看文件大小不同的可能原因  

2013-10-19 12:44:51|  分类: linux知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、文件夹文件大小不一致
这个问题在之前说过为什么df和ls看到的文件大小不一样。因为df是通过statfs系统调用,从文件的超级块中读取文件系统的block的使用情况,du逐个遍历,而ls则纯粹是显示文件夹下文件属性。
二、可能的原因
1、文件被删除但是被进程使用
当一个文件被rm删除,此时这个文件被其它进程打开而未关闭,那么这个目录项将会被从硬盘上删除,但是此时文件的inode依然在磁盘中,文件占用的空间更不会释放。此时文件系统中统计的block数量不会变化,但是通过ls查看时此时已经看不到被删除文件对应的目录项。
ext2超级块结构
struct ext2_super_block {
    __le32    s_inodes_count;        /* Inodes count */
    __le32    s_blocks_count;        /* Blocks count */
    __le32    s_r_blocks_count;    /* Reserved blocks count */
    __le32    s_free_blocks_count;    /* Free blocks count */
    __le32    s_free_inodes_count;    /* Free inodes count */
    __le32    s_first_data_block;    /* First Data Block */
    __le32    s_log_block_size;    /* Block size */
    __le32    s_log_frag_size;    /* Fragment size */
    __le32    s_blocks_per_group;    /* # Blocks per group */
    __le32    s_frags_per_group;    /* # Fragments per group */
    __le32    s_inodes_per_group;    /* # Inodes per group */
结构填充代码linux-2.6.21\fs\ext2\super.c :ext2_statfs
    buf->f_type = EXT2_SUPER_MAGIC;
    buf->f_bsize = sb->s_blocksize;
    buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead;
    buf->f_bfree = ext2_count_free_blocks(sb);
    buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count);空闲block还要减掉保留块。

2、稀疏文件
文件创建时通过truncate声明了大量的地址空间,之后系统并没有为它分配对应的磁盘块,也就是block结构,此时文件系统中感觉不到这个文件逻辑大小,因为df现实的是系统中真实的block的分配和空闲情况。
3、隐藏文件
这一点涉及的内容最为简单,但是也最容易被忽视。通常我们使用ls或者ll显示一个文件下文件内容的时候,此时一些dot(.)开头的文件默认是不会被显示的,包括当前文件夹.和父文件夹..。这个只是传统的ls的实现行为,因为ext文件系统里没有标志位表示文件是不是隐藏属性,所以只是根据文件名的一个略定而已。
对于du来说,它并不会理会这些显示上的问题,会忠诚的将readdir中获得所有内容累加起来,所以如果文件夹下有隐藏文件的时候,du和ls现实文件大小也不一样。
三、例子
1、隐藏文件和du现实不一致
[root@Harry grepfast]# ll
total 0
[root@Harry grepfast]# ll -a
total 51832
drwxr-xr-x.  2 root   root       4096 2013-10-19 12:27 .
drwxrwxr-x. 79 tsecer tsecer     4096 2013-10-18 23:33 ..
-rw-r--r--.  1 root   root   53060000 2013-10-19 00:14 .sampefile.txt
[root@Harry grepfast]# du .
51828    .
[root@Harry grepfast]# du . -b
53064096    .
[root@Harry grepfast]#
2、在读文件被删除
[root@Harry grepfast]# sleep 10000 < .sampefile.txt
^Z
[1]+  Stopped                 sleep 10000 < .sampefile.txt
[root@Harry grepfast]# bg %1
[1]+ sleep 10000 < .sampefile.txt &
[root@Harry grepfast]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg_harry-lv_root
                      28725380  14412400  12853780  53% /
tmpfs                   513584       464    513120   1% /dev/shm
/dev/sda1               198337     38484    149613  21% /boot
[root@Harry grepfast]# rm .sampefile.txt  删除大文件
rm: remove regular file `.sampefile.txt'? y
[root@Harry grepfast]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg_harry-lv_root
                      28725380  14412400  12853780  53% / 由于文件被sleep进程打开,在删除文件之后,df查看空间大小不变
tmpfs                   513584       464    513120   1% /dev/shm
/dev/sda1               198337     38484    149613  21% /boot
[root@Harry grepfast]# du .  du查看文件大小已经变化,readdir看不到被删除的目录项
4    .
[root@Harry grepfast]# ll
total 0
[root@Harry grepfast]# fg %1  关闭引用该文件的进程
sleep 10000 < .sampefile.txt
^C
[root@Harry grepfast]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg_harry-lv_root
                      28725380  14360576  12905604  53% / 文件占用inode释放
tmpfs                   513584       464    513120   1% /dev/shm
/dev/sda1               198337     38484    149613  21% /boot
[root@Harry grepfast]#

所以如果du和df看到的内容不一致,可以通过 lsof 来看下文件被谁占用
[root@Harry grepfast]# which sleep
/bin/sleep
[root@Harry grepfast]# sleep 12345678
^Z
[1]+  Stopped                 sleep 12345678
[root@Harry grepfast]# bg %1
[1]+ sleep 12345678 &
[root@Harry grepfast]# lsof /bin/sleep

COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF  NODE NAME
sleep   8306 root txt    REG  253,0    26000 49195 /bin/sleep
[root@Harry grepfast]#
[root@Harry grepfast]# ll /proc/8306/cmdline
-r--r--r--. 1 root root 0 2013-10-19 12:38 /proc/8306/cmdline
[root@Harry grepfast]# cat /proc/8306/cmdline
[root@Harry grepfast]#
  评论这张
 
阅读(1113)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017