案例1:正常空间不足; 这种情况最简单,现像:df -h一看,某个磁盘分区使用率达到了100%,如何排查,如何处理? 模拟:创建1个大文件; dd if=/dev/zero of=/var/log/nginx.log bs=1M count=2000 df -h //排查第1步,先整体看一下,磁盘哪里空间没了; du -sh //详细查看目录所占空间 [root@web01 ~]# du -sh / //查看根所占空间,看不了其他的; [root@web01 ~]# du -sh /* //看根下第一级目录所占的空间大小; //找出一级目录,接着找二级目录,一层一层找,直到找到具体的大文件或目录; //找出目录或文件后,确认是否可以删除; 解决:能删就删,不能删就只能加硬盘加空间了;
案例2:inode引起的; 提示:no space left on device 先用df -h,查看磁盘空间发现没有满;可以怀疑inode引起的; 原因:磁盘空间不足,block导致,或者inode导致; 排查:df -i 来查看inode使用情况; 如果发现inode快用完了,找出这个分区中,大目录(目录本身大小大于1MB,du -sh目录所占空间)就行; 找个目录模拟与分析: [root@web01 ~]# mkdir -p /mclind/test-inode [root@web01 ~]# cd /mclind/test-inode/ [root@web01 test-inode]# ll -d /mclind/test-inode/ // ls -l 查看目录大小表示目录下面1层,文件名字大小 // 目录占的磁盘空间:du -sh 查看 目录下面所有文件block大小之和; 解决:确认是否可以删除或处理; 模拟inode满了;创建小文件磁盘,比如,100k,变成分区,挂载使用; dd if=/dev/zero of=/tmp/100k bs=1k count=100 mkfs.ext4 /tmp/100k //xfs不一定成功,磁盘太小的话,不会成功 mkdir -p /mclind/inode mount /tmp/100k /mclind/inode touch /mclind/inode/{1..10} df -h df -i //这种情况不常见;
案例3:文件未彻底删除,磁盘空间不足; 前提: 条件1:删除文件,需要权限,假如有权限,可以删除,如果硬连接数为0,才是成功删除,使用rm命令; 条件2:文件调用数也为0,文件是否被使用中(命令,或服务在使用);
排查:如何知道硬连接数是否为0,一般rm后通过ls,find查看,找不到就是没了; 如何知道进程调用数是否为0, lsof,显示系统调用与使用了哪些文件(list open file),需要用yum安装lsof, lsof | grep 文件名
故障模拟: 现象:提示磁盘空间不足,no space ... df -h ,查看提示磁盘满了; 继续排查:du -sh排查,这种查询,统计总大小,可能发现没有满; 可以怀疑可能是文件未彻底删除导致的; 模拟:dd创建文件 [root@web01 ~]# dd if=/dev/zero of=/var/log/nginx2.log bs=1M count=10000 tail -f /var/log/nginx2.log rm -rf /var/log/nginx2.log df -h du -sh //查看发现空间占用并不是很大 接着就需要使用lsof lsof | grep delete //在lsof中delete是一个标记,表示这个文件没有入口,就是硬连接为0,但是还有进程或服务在调用它; lsof | grep nginx 结束这个服务,就自动释放了这个文件,建议重启服务; ps aux | grep tail kill tail_pid 再次用df -h查看,磁盘已恢复;
|