快速增长的文件

  增加文件系统上的可用空间量的四大策略是:压缩文件、删除文件、增大基于 LVM 的文件系统以及压缩目录。一些文件(如日志文件和临时文件)随着时间的推移会不可避免地增长。例如,核心转储文件占用了大量的空间,但很少需要。此外,用户偶尔运行的程序可能会意外产生巨大的文件。作为系统管理员,必须定期审查这些文件,使其不至失控。

  如果一个文件系统很快耗尽空间(如在一个小时内,而不是几个星期或几个月内),首先弄清楚空间耗尽的原因。可使用 ps – ef 命令来确定用户是否已经创建了失控的进程,并且生成了巨大的文件。评估 ps 的输出时,可寻找一个消耗了大量 CPU 时间的进程。如果这样的进程正在运行,并创建了大文件,那该文件将持续增长以致需要不断腾出空间。如果删除了这个巨大的文件,其占用的空间并不会被释放,除非终止该进程。此时需要尝试联系运行该进程的用户,并要求他终止该进程。如果联系不到该用户,请使用 root 权限自己终止该进程。

  此外,还可以截断大的日志文件而不是删除它,虽然也可以使用 logrotate 来更好地处理这个常见情况。例如,如果由于系统守护进程的错误配置,使得 /var/log/messages 文件变得非常大,可以使用 /dev/null 来截断它:

  # cp /dev/null /var/log/messages

  或

  # cat /dev/null > /var/log/messages

  或无须派生新进程 ,

  # : > /var/log/messages

  如果删除 /var/log/messages,必须重新启动 rsyslogd 守护进程。如果不重新启动 rsyslogd,将不会释放文件系统上的空间。

  当没有任何进程消耗磁盘空间,而容量逐渐被用光时,要找到不需要的文件,并将其删除。在删除之前可以使用 cpio、dump 或 tar 归档这些文件。可以安全地删除大部分已有几天未曾访问的 core 文件。以下命令行可执行这项功能,而不删除必要的 core 文件(如 /dev/core):

  # find / -type f -name core|xargs file|grep 'B core file'|sed 's/:ELF.*//g'|xargs rm -f

  find 命令列出所有名为 core 的普通文件,并将该列表发送到 xargs,xargs 在列表中的每个文件上运行 file.file 实用程序显示一个字符串,其中包含 B core file(创建的核心转储文件)这类需要删除的文件。grep 命令从文件中过滤掉任何不包含此字符串的行。后 sed 删除冒号后的一切,使所有留在行上的只是 core 文件的路径名 ; 然后 xargs 删除该文件。

  为了腾出更多的磁盘空间,可仔细审查 /tmp 和 /var/tmp 目录中的旧临时文件并删除。对 /var/mail、/var/spool 和 /var/log 中的磁盘使用情况保持跟踪。

  删除目录中未使用的空间

  包含太多文件的目录通常效率不高。ext2、ext3 或 ext4 文件系统上的目录在哪一点上变得效率不高的原因不尽相同,但部分取决于它包含的文件的长度。佳做法是保持目录相对较小。一个目录中好包含较少的文件而不是几百个文件(或目录),多达数千个文件通常是很不好的做法。此外,Linux 为经常访问的文件使用了缓存机制,以加速从文件名查找其 inode 的进程。这种缓存机制仅支持多 30 个字符的文件名,所以通常要避免访问文件名非常长的文件。当一个目录变得太大时,通常可以将其分解成几个较小的目录,将其内容移动到那些新目录。移动完该目录内容后,要确保删除原来的目录。

  因为 Linux 目录不会自动收缩,删除目录中的文件也不会收缩该目录,即使它释放了所有的磁盘空间。因此,要删除未使用的空间,并使目录比较小,必须把所有文件复制或移动到一个新目录,并删除原目录。

  下面的过程可删除未使用的目录空间。首先从大目录中删除所有不需要的文件,然后创建一个新的空目录,接下来把所有剩余文件从旧的大目录移动或复制到新的空目录中。记住不要忘了复制隐藏的文件。后删除旧目录,并命名新目录。

  # mkdir /home/max/new
  # mv /home/max/large/* /home/max/large/.[A-z]* /home/max/new
  # rmdir /home/max/large
  # mv /home/max/new /home/max/large