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

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

如何确定根文件系统满时最大文件夹  

2017-08-18 22:58:16|  分类: 驱动基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、当磁盘空间满了之后
在一个多人共享的环境中,不可避免的会遇到磁盘空间满的问题。典型的使用场景是在构建的时候,突然发现空间不足而导致编译无法继续。解决这个问题的第一个步骤自然而然就是检查下哪个文件夹中文件容量最大。但是它通常不像“座中泣下谁最多?江州司马青衫湿。”这个问题那样简单直观,然而好在也不那么复杂。
二、系统中的文件系统及设备
当磁盘空间满的时候通常的受害者都是根文件系统,同时系统的所有设备都是挂载在根文件系统之下,所以查看根文件系统磁盘使用率的时候,会把这些挂载文件系统的内容也计算在根文件系统中。例如,在我现在使用的redhat虚拟机中,已经挂载的文件系统有这些
tsecer@harry: mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)
/dev/sr1 on /media/RHEL-6.6 Server.i386 type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=500,gid=500,iocharset=utf8,mode=0400,dmode=0500)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
tsecer@harry: 
这个显然只是一个非典型的文件系统,不过至少说明了一个系统中挂载的文件系统的确是多种多样的。这些文件系统中,有些是操作系统虚拟的内存文件,本身并没有占用专门的存储设备(这里假设内存并不是专门的存储设备)。而系统中真正存在的存储设备可以通过df查看
tsecer@harry: df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       18143556 8790628   8424624  52% /
tmpfs             969388     368    969020   1% /dev/shm
/dev/sda1         289293   30703    243230  12% /boot
/dev/sr1         3116336 3116336         0 100% /media/RHEL-6.6 Server.i386
tsecer@harry: 
三、检查磁盘使用的标准工具du
在linux系统下,du是检查磁盘使用的标准工具。不过正如前面说的,它默认会将根文件系统下所有文件系统(设备)的空间都计算在内,所以对du的输出按照大小排序,在前面看到的可能是另一个设备上的文件,并且无法区分哪些在根文件系统所在设备上。
1、首先缩小到根文件系统的直接子文件夹
tsecer@harry: du -s /* | sort -nrk1
6112244 /home
3160808 /media
2240032 /usr
154580 /lib
96156 /var
39740 /etc
28681 /boot
13452 /sbin
7296 /bin
1032 /root
616 /dev
88 /tmp
16 /lost+found
8 /opt
8 /mnt
4 /srv
0 /sys
0 /selinux
0 /proc
tsecer@harry: 
2、使用du自带的-x选项
最近再次遇到这个问题的时候,我想这种常规的问题解决起来应该并不是那么复杂,其实主要判断一个文件夹是否是一个挂节点即可,看了下du的man手册的确有这么个选项
       -x, --one-file-system
              skip directories on different file systems
3、different file systems的意思
这个其实是表示不同的存储设备,从du的实现代码来看,这个判断几乎是一句话的事情,判断的也是设备ID:
coreutils-4.5.3\src\du.c
static uintmax_t
count_entry (const char *ent, int top, dev_t last_dev, int depth)
{
……
  if (S_ISDIR (stat_buf.st_mode))
    {
……
      /* Return `0' here, not SIZE, since the SIZE bytes
 would reside in the new filesystem.  */
      if (opt_one_file_system && !top && last_dev != dir_dev)
return 0; /* Don't enter a new file system.  */
……
4、看下我现在虚拟机的空间使用情况
可以看到挂载的media设备不在这个输出中
tsecer@harry: du -x  / | sort -nrk1 | head
8664686 /
6112244 /home
6112240 /home/tsecer
4101700 /home/tsecer/Downloads
2240032 /usr

四、补充
其实就是一个工具加一个选项的问题,但是在遇到问题时的确好用,在网上简单搜了下还没找到,所以特意记录下。
  评论这张
 
阅读(27)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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