用ls和du显示的文件大小为何有差别

du == disk usage (磁盘使用量,占用的磁盘空间)
ls == apparent sizes(文件长度,file数据结构中定义的文件长度字段)
    一个文件占用的磁盘空间和一个文件的大小是两码事情。占用空间取决于文件系统的块(block)的大小,Linux一般默认是4k(4096) ,因此,一个大小为1个字节的文件,最小也要占用4k,如果你创建文件系统的时候制定块大小是16K,那么即便一个文件只有1个字节,占用空间也是16K。
   通常情况下,ls 显示的文件大小比du显示的磁盘占用空间小,比如文件系统的block是4K,一个13K的文件占用的空间是 13k/4k = 3.25 个block,一个block只能被一个文件占用,因此实际占用空间就是4个block,就是16K。

     

     经常发现rm删除某个文件后,存储并没有被释放

     rm日志文件,但日志文件一直被服务A的进程打开了, rm 后空间并没有释放。rm 其实是删除该文件名到文件真正保存到磁盘位置的链接, 此时该文件句柄还被服务A打开, 因此对应的数据并没有被回收, 其实可以理解为 GC 里面的引用计数, rm 只是减少了引用计数, 并没有真正的进行释放内存, 当引用计数为0的时候, OS 内核才会释放空间, 供其他进程使用。所以当A进程停止(文件句柄的引用计数会变为0)或者重启后, 占用的存储空间才被释放。 (lsof | grep deleted:查找所有被删除的但是文件句柄没有释放的文件和相应的进程,然后再kill掉进程或者重启进程即可)。


  该日志文件是一个稀疏文件,虽然其文件长度很大, 然而其中包含大量的holes并不占用实际的存储空间.


以上是用 dd 等命令创建稀疏文件, 也有同学用 c 代码实现了相同的功能. 其实就是写文件的时候, 改变下当前文件写指针。


If the environment variable BLOCKSIZE is set, and the -k option is not specified, the block counts will be displayed in units of that size block. If BLOCKSIZE is not set, and the -k option is not specified, the block counts will be displayed in 512-byte blocks.

although the apparent size is usually smaller, it may be larger due to holes in (‘sparse’) files, internal fragmentation, indirect blocks, and the like (man du)

Display values are in units of the first available SIZE from –block-size, and the DU_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables. Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set. (du --help)

   可以用修改文件内容的方式在不用重启进程的情况下释放空间,用echo 'hello' > contentutil.log, 然后 df 确认磁盘空间确实已经释放。



参考:http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666540078&idx=2&sn=cacb3bcb3bd9a06cc8cfca16e02bfbd9&chksm=80dce885b7ab619359cb73732a1505b440861af707a2abceed1de5d6496e96e82e1b76dce330&mpshare=1&scene=1&srcid=12061rCRjhAoxF9ctqTcUWEb#rd

   
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值