Linux服务器空间不足

我曾经连续两次被问及这个问题,但经过与各个系统pipe理员的研究和检查,我还没有得到很好的答复。 我想知道有人能帮助我。

服务器磁盘空间不足。 您注意到一个非常大的日志文件,并确定它是安全的删除。 您删除该文件,但磁盘仍然显示它已满。 什么会造成这种情况,你将如何补救? 你将如何find哪个进程正在写这个巨大的日志文件?

这是一个常见的面试问题,也是在各种生产环境中出现的情况。

该文件的目录条目已被删除,但日志logging过程仍在运行。 操作系统将不会回收空间,直到所有文件句柄都已closures(例如,进程已被终止),并删除所有目录条目。 要find写入文件的过程,您需要使用lsof命令。

问题的另一部分有时可能是“如何清除正在写入的文件而不会终止进程?” 理想情况下,你可以用类似于“ : > /var/log/logfile ”的方式“清零”或“截断”日志文件 ,而不是删除文件。

还有另一个链接到文件(硬链接或打开的文件句柄)。 删除文件只会删除目录条目; 文件数据和inode挂起,直到最后一个引用被删除。

服务创build一个临时文件并在保持文件打开的同时立即将其删除是一种常见的做法。 这将在磁盘上创build一个文件,但是保证如果该进程exception终止,该文件将被删除,并且还会使其他进程不小心跺跺文件。 例如,MySQL会为其所有的磁盘临时表执行此操作。 恶意软件通常使用类似的手段来隐藏文件。

在Linux下,您可以方便地以/proc/<pid>/fd/<filenumber>访问这些被删除的文件。

我不是一个系统pipe理员,但是从我在Unix.SE上收集的信息来看,一个Linux系统不会删除一个文件(将空间标记为空闲/可重用),直到所有文件描述符指向它们已经closures。 所以要回答第一部分,这个空间还不是免费的,因为一个过程还在阅读中。 要回答第二个问题,你可以看到哪个进程正在使用lsof文件。

如果写入文件的进程是root,则会写入超级用户保留的文件空间。 文件系统有这个空间来保证系统在用户任务填满磁盘的情况下运行。 这个空间(默认为5%)对许多工具是不可见的。

lsof可以告诉你,哪个进程已经locking了文件,ergo正在写入。

除了显而易见的硬链接/打开文件答案之外,还有一个备选答案:该文件是非常稀疏的文件,例如RHEL上的/var/log/lastlog实际上并不占用太多的空间。 删除它几乎没有影响,所以你需要看看下一个最大的文件。

除了由进程打开的文件外,第二种情况是当你有一个文件系统支持快照,如btrfsZFS

例如,你用这个巨大的日志文件存在一个快照。 如果您现在删除文件,则只会删除增量。 只有在文件未被使用时才会删除增量。

也可以看看:

第三种情况是当你有一个支持块级重复数据删除的文件系统,并且大部分文件与另一个文件相同时。 我不希望这种情况发生在一个日志上,除非你有一个容器或虚拟机将日志发送到共享相同FS的系统日志容器或虚拟机,以便日志内容相同。