linux磁盘空间满了怎么办

Step 1. 查找原因

如果做写操作的时候,系统提示“No space left on device”,这个时候就该着急了。尽快清理磁盘吧!
首先,用“df -h”命令查看各个分区的磁盘占用情况。

ubuntu@slave:~/temp$ df -h
Filesystem        Size  Used Avail Use% Mounted on
udev              1.9G  4.0K  1.9G   1% /dev
tmpfs             379M   11M  369M   3% /run
/dev/vda1          50G   50G     0 100% /
tmpfs             1.9G   48K  1.9G   1% /dev/shm
tmpfs             5.0M     0  5.0M   0% /run/lock
tmpfs             1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs             379M     0  379M   0% /run/user/500

下面的统计命令可以派上用场。

#列出当前文件夹的大小
du -sh
#列出当前文件夹中各个文件及子文件夹的大小:
du -h -d1
#列出/home文件夹中各个文件及文件夹的大小:
du -h -d1 /home

du参数说明:

  • -s: --summarize 统计总数
  • -h: --human-readable 用便于阅读的方式输出大小,比如 “1K”, “234M”, “2G”, 等等
  • -d: --max-depth=N 统计的目录层数。如果N=0话,跟s参数一个意思,就是只统计总量。

Step 2. 删除/备份删除消耗磁盘空间的文件

在上一步找到不需要保留在服务器上的文件。

方法1 直接删除文件

需要备份的先通过FTP等工具备份,然后用rm进行删除。记得要备份!

rm -f needDeletefile
方法2 清空日志释放空间

如果是正在使用中的日志文件等,可以在备份之后,清空日志,可以马上获得空间。

echo "" > yourlogfile

Step 3. 真正释放出磁盘空间

一般说来不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等等。最常见的是日志文件。
处理办法:

3.1 找到占用该文件占用的进程ID

找到占用该文件占用的进程ID,比如为 nnnn

sudo lsof -w| grep deleted 

lsof参数说明:

  • -w 忽略错误
3.2 杀掉进程

如果是可以随便关闭的程序,杀死进程。如果误删除了日志文件,只能建议重启该服务吧。

kill -9 nnnn
3.3 为什么没有释放空间?

为什么有的文件删除之后不释放空间,有兴趣的读者可以看看下面的说明。
这张图是linux的系统文件结构。
linux磁盘空间满了怎么办_第1张图片
当一个进程打开一个文件后,便会在内核中创建一个file对象,这个对象主要描述了进程如何与文件进行交互。file对象中将指向一个dentry结构(目录项),目录项中描述了目录项名称,父目录项信息,子目录项信息等。而dentry中的d_inode所指向的inode节点中则包含了实际的文件存储在磁盘上的信息。

当多个进程打开同一个文件时,内核中变会创建相应的file对象,但是他们都公用同一个dentry,只不过每一次打开文件dentry的引用计数d_count加1。并且对于打开的同一个文件而言,inode也是唯一的,inode的引用计数i_count一般为文件硬链接的数目。如果该文件被某个进程写的方式打开,i_count不为0,肯定是释放不了的。如果强行释放了可能会引起系统崩溃。

笔者曾遇到过一个问题,一个大的压缩文件包被rm删除后,空间一直没有释放。通过lsof |grep deleted 命令也查不到有什么进程在使用这个文件。如果程序释放处理不当,进程灭掉了但是连接未释放,也可以导致lsof查不到被占用的情况。这个时候i_count>0,空间基本就没法释放了。需要重启服务器才能解决问题。

下面是释放后的情况。

ubuntu@slave:~$ df -h
Filesystem        Size  Used Avail Use% Mounted on
udev              1.9G  4.0K  1.9G   1% /dev
tmpfs             379M   11M  369M   3% /run
/dev/vda1          50G   46G  2.0G  96% /
tmpfs             1.9G   48K  1.9G   1% /dev/shm
tmpfs             5.0M     0  5.0M   0% /run/lock
tmpfs             1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs             379M     0  379M   0% /run/user/500

参考1:在删除了文件后,磁盘空间却没有释放

你可能感兴趣的:(Linux)