kinux os pc 出现磁盘空间不足问题有:
问题原因
导致该问题的可能原因包括:
- 磁盘分区空间使用率达到百分之百。
- 磁盘分区inode使用率达到百分之百。
- 僵尸文件:已删除文件因句柄被占用未释放导致相应空间未释放。
- 挂载点覆盖:在原有文件系统的相应目录下已经存在大量文件。挂载了新磁盘后,导致使用
df
命令能统计到相关空间使用,而使用su
命令统计不到处理办法
不同的原因需要通过不同的方法解决:
- 分区容量满
- inode容量满
- 修改inode数量
- 僵尸文件分析删除
- 挂载点覆盖
分区容量满
运行 df -h
查看磁盘使用 以及使用 du -sh * 查看
inode容量满
分析根目录下每个目录下面有多少个文件。
for i in /*; do echo $i; find $i | wc -l; done
df -i 查看实际inode 命令
命令重新建立文件系统,指定inode节点数。
mkfs.ext3 /dev/xvdb -N 1638400
运行以下命令查看修改后的inode节点数。
dumpe2fs -h /dev/xvdb | grep node
僵尸文件分析删除
如果磁盘和inode都没有问题,则需要查看是否存在未被清除句柄的僵死文件。这些文件实际上已经被删除,但是有服务程序在使用这些文件,导致这些文件一直被占用,无法释放磁盘空间。如果这些文件过多,会占用很大的磁盘空间。
lsof |grep delete | more
就可以查看
挂载点覆盖
先取消磁盘挂载,再检查原挂载目录下的空间占用情况。
问题2
df 发现var 目录下没有空间可以用,但是du 发现只使用了很少的空间,这是什么问题?
这就要看df du的实现原理了
2. df 和du 的工作原理
2.1 du的工作原理
du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
2.2 df的工作原理
df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。
du和df不一致情况模拟
常见的df和du不一致情况就是文件删除的问题。当一个文件被删除后,在文件系统 目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件
- du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;
- 而df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数