Linux 磁盘经常出现一些的问题的总结

Linux磁盘空间经常会出现一些或多或少的问题。比如磁盘空间不足。但是有些时候是真的磁盘空间不足吗?

常规流程

在收到一条告警信息的时候,一定要先检查一下磁盘是否真的空间不足。否则,走下去的可能就是一条弯路!

查看信息

优先推荐使用df -h命令,否则用du -h的话,就要遍历磁盘中的所有文件,这是绝对不允许的。

1
2
3
df -h
or
du -sh /xxx

因此我们可以结合着使用,先在根目录下找出那个子目录是最大的,然后使用 du -sh来排查。

查看最大的文件目录

查询当前目录,哪个目录占用空间最大。

1
du -sh --max-depth=1

查看最大的文件

1
ls -lhS

综上所述,如果找到了占用空间最大的文件或者目录。说明这是一般的问题。

特殊情况

已删除文件被进程所占用

有时候文件已经被删除了,但是进程依然在使用它。因此导致,在进程运行期间,Linux并不会释放该文件的存储空间。因此需要找出这个进程,杀死或者重启。

1
lsof |grep deleted

inode不足

文件系统中有一些元数据,用来保存文件的相关信息。文件系统中的inode数量是固定的,因此可能inode已经耗尽了,而文件系统本身还没用完。如果真的不足了,那就删除无用和过去的文件来释放吧。可以用以下命令检查:

1
df -i

inode不足引发的问题

现象

发现6400多的进程都是sleep状态,load值较高,内存使用率持续上升

处理

偶然发现inode使用率到了100%,排查哪个目录下文件过多

  • 检查哪个磁盘出现的问题
  • 检查哪个目录 for i in /*; do echo $i; find $i |wc -l|sort -nr; done
  • 然后逐级查下去

最终发现是/var/spool/maildrop 有问题,直接rm -rf ,但是提示

1
Argument list too long

在linux中删除大量文件时,直接用rm会出现:-bash: /bin/rm: 参数列表过长错误。
这时可以用find命令来结合使用。
例:

1
2
3
4
5
6
# rm * -rf 改为:
find . -name "*" | xargs rm -rf '*'

# rm test* -rf 改为:
find . -name "test*" | xargs rm -rf "test*"

坏块

最后一个很常见的问题就是坏的文件系统块。除非另有标记,否则操作系统很可能会认为这些块都是可用的,这会导致文件系统损坏或者硬盘坏死。最好是使用带 -cc 标志的 fsck 搜索并标记出这些块。记住,你不能使用正在使用的文件系统中的 fsck 命令。你应该会要用到 live CD。最后这种情况,目前的确没有遇到过。

总结

以上内容是常见的磁盘空间不足的处理访问,基本能覆盖绝大部分场景。很多时候单纯处理问题并不困难,复杂的是找出事件的原因。对病下药,才是正道。其实,这个问题还可以延伸一下,比如现在是磁盘空间不足,那么是什么导致不足的呢?之后如何规避呢,写一些脚本,还是某代码有问题。。。。。。

参考资料:[1] Nick Congleton 如何解决 Linux 中“磁盘空间不足”的问题