Linux 磁盘使用优化提示与技巧

作者:Jeff Tranter
半满还是半空?

首先要回答的问题是,你的磁盘有多满?最好的方法是使用 “df” 命令。这是我的系统显示的结果

% df
Filesystem  1024-blocks   Used   Available   Capacity   Mounted on
/dev/hdal   4247          73427    16108       82%               /

在这种情况下,我在 94 兆字节的单个分区上略多于 16 兆字节的可用空间,使其达到 82% 的满度。如果您有多个磁盘分区和/或驱动器,您将在列表中看到每个已挂载分区的条目。

您可能会认为只要低于 100%,一切都很好。但事实并非如此,原因有几个。

首先,您需要预留一些空间用于临时文件。例如,编译需要将各种中间文件存储在临时目录中。如果您没有足够的空间来存储这些文件,命令将失败,可能会以奇怪的方式失败。普通用户甚至可能通过填满根磁盘来使系统崩溃。

其次,一旦您的磁盘接近满容量,性能就会开始下降。文件系统必须花费更多时间在磁盘上寻找可用的空闲块来使用。性能下降的程度取决于磁盘的满度和文件系统的类型。一个好的经验法则是尽可能将磁盘保持在 80% 以下的满度,绝对要低于 90%。

负载均衡

您可能拥有多个磁盘驱动器,并且您可能将一个或多个驱动器划分为单独的分区。例如,这是一种避免根分区被用户数据填满的方法。缺点是您可能会发现一个分区已满,即使其他分区有可用空间。

如果是这种情况,一种选择是重新分区驱动器以更好地平衡负载。这将需要首先备份所有数据,因为重新分区是破坏性的。

第二个选择是将一些文件从一个分区或磁盘移动到另一个分区或磁盘。使用符号链接,您或许可以在不影响其他应用程序的情况下做到这一点。

您可能至少有一个交换分区。选择其大小是在拥有足够的交换空间和丢失宝贵的文件系统空间之间进行权衡。如果您发现您的交换空间超过了需要的量(“free” 命令在这里很有用),那么您可以考虑重新分区以使交换分区更小。如果您只是偶尔需要大量的交换空间(例如,在大型编译期间),一种选择是使用较小的交换分区,并在需要额外交换的场合添加一个交换文件。

如果您的驱动器已负载均衡,但磁盘空间仍然是一个问题,或者如果您只有一个分区,那么您就可以开始学习本文其余部分描述的技术了。

查找大文件

一个有用的概念是帕累托或 80/20 原则。应用在这里,它表示 80% 的磁盘空间包含在 20% 的文件中(或多或少)。您如何找到这 20%?一个工具是 “find” 命令。例如,以下命令行将查找系统上所有大于 100 万字节的文件(您可能需要以 root 身份运行此命令,以便您可以访问所有目录;预计运行需要一段时间,具体取决于磁盘大小)

    % find / -size+1000000c -ls

此命令告诉 find 查找任何大于 100 万字符的文件并打印其目录信息。如果您不熟悉 find 命令,请阅读其手册页。它可以成为识别需要处理的区域的有用工具。

删除文件

释放磁盘空间的显而易见的解决方案是删除文件。通过一些侦查工作,您可能会在您的系统上找到很多您不需要的累赘。但首先,有两个重要的警告

  • 确保您备份了您要删除的所有内容,以防您稍后发现您真的需要它。

  • 准备一张可以从中启动的紧急软盘(例如 SLS A1 磁盘),以防您删除了一些东西(例如 /vmlinuz?)导致您的系统处于不可启动状态。

在 SLS 或 Slackware 系统上,很容易识别和删除软件包。查看您已安装的软件包,查看它们需要多少磁盘空间,并删除您不需要的软件包。

如果不需要,以下一些东西可以节省大量空间

  • 网络,包括 NFS 和 uucp

  • 新闻阅读器 (tin, trn, cnews 等...)

  • 语言工具:p2c, f2c, lisp, smalltalk

  • TeX 和 LaTeX

  • 源代码

您可以删除手册页的 nroff 源代码(在 /usr/man/man? 中),而只保留压缩的、格式化的页面(在 /usr/man/cat? 中)。确保所有手册页都已首先格式化。

emacs lisp 源文件 (*.el) 的完整发行版非常大。您可以只保留字节编译的 (*.elc) 文件。

如果您已编译 Linux 内核,请删除目标文件(例如 cd /usr/src/linux ; make clean)。

您可能在 /lib 和 /usr/lib 中积累了一些旧的库。但有些二进制文件可能仍然需要它们。您或许可以通过在您的二进制文件上运行 ldd 来确定它们是否被使用。这是一个我建议您避免的领域,除非您知道自己在做什么,因为如果您删除所需的库,您很容易导致系统崩溃。

如果您运行 X 窗口系统,字体文件会占用大量磁盘空间(它们通常在 /usr/lib/X11 中)。确保 .pcf 字体文件已压缩。您或许也可以删除一些更晦涩的字体。如果您压缩或删除了任何字体,请务必之后运行 mkfontdir 命令。

我在我的系统上发现 /bin 和 /usr/bin 中有很多重复文件。消除重复项可以节省空间,但要注意您不仅仅是在删除指向同一文件的链接。diff 命令在这里对于比较文件目录很有用(例如 diff /bin /usr/bin)。

某些文件会无限增长,应定期清除。这些文件包括

 /etc/wtmp
 /etc/ftmp
 /var/log/notice

一般来说,您应该将这些文件截断为零长度(例如,cp /dev/null /var/log/notice)而不是删除文件,否则使用它们的程序可能不会创建新文件。

最后,可能有一些文件您需要定期使用,但不需要始终在线(例如 Linux 内核源代码)。考虑将这些文件备份到软盘或磁带,并在需要时恢复它们。

压缩文件

如果您无法删除文件,则有几种使其更小的选项。

压缩程序可以使文件明显变小。GNU gzip 程序提供了出色的压缩。它非常适合压缩诸如文档和源代码之类不需要始终在线的数据文件。zip 的最佳选项将提供最高级别的压缩。

Emacs 也可以配置为在编辑时自动解压缩文件;请参阅 UGN emacs version 19 附带的 lisp 文件 uncompress.el。使用 emacs 节省空间的另一种方法是压缩 info 页面;GNU emacs version 19 自动处理读取压缩的 info 页面。

如果您维护文件的多个修订版本,尤其是源代码,那么诸如 RCS 之类的修订控制系统可以节省空间。只存储文件修订版本之间的差异。

前面提到了压缩手册页。传统上,这是使用标准 compress 程序完成的。一些 man 程序也可以处理 gzip 压缩的手册页(您可能需要继续使用 .Z 文件扩展名)。

现有的二进制文件有时包含调试信息。可以使用 strip 命令使它们更小。例如,我从存档站点上传的 GNU emacs 二进制文件就是这种情况。

对于新的编译,您可以通过在编译时不进行调试并进行完全优化(例如 gcc 的 -O2)来最小化二进制文件的大小(一旦它们被调试)。链接器标志 -s-N 也可能很有用;有关更多详细信息,请参阅 gcc 和 ld 手册页。

高级技巧

更高级的用户可以尝试本节中描述的一些更复杂的技术。

Linux 第二扩展文件系统保留磁盘的一部分仅供 root 用户使用。这对于防止用户填满磁盘很有用,但在某些情况下可能并不理想(例如,仅包含用户文件的磁盘)。默认情况下,磁盘的 5% 被保留。您可以在格式化分区时更改此设置;有关更多详细信息,请参阅 mke2fs 手册页。

透明压缩可执行文件 (TCX) 是一种用于压缩二进制文件的实用程序,它仍然允许执行这些文件。作者是 Stewart Forster。它以略微延迟启动时间为代价节省了磁盘空间。它对于不经常执行的大型程序最有用。我发现这个软件包非常有效且可靠;可以在您本地的 Linux 存档站点找到它。

对于压缩数据文件,可以使用 zlibc 软件包。它的工作原理是修补诸如 open 之类的 Linux 系统调用,这些调用读取数据文件,并动态解压缩文件。我没有使用过这个软件包,但作者声称可以轻松实现 1:3 的压缩比。该软件包可以在 Linux 存档站点以源代码和二进制形式找到;作者是 Alain Knaff。

已经有关于为 Linux 实现压缩文件系统的讨论,其概念类似于 MS-DOS 中已有的文件系统。ext2 文件系统已经有一些钩子来允许添加此功能。这可能是优化磁盘使用的最终解决方案。

更多信息

有关本文讨论的想法的更多信息可以在以下来源中找到。所有这些都在主要的 Linux 存档站点上可用。

Linux 内核黑客指南,Michael K. Johnson

Linux 系统管理员指南,Lars Wirzenius。

Linux 手册页

另请参阅本文中提到的软件包(zlibc、tcx 等...)附带的文档。

白天,Jeff Tranter 是加拿大安大略省卡纳塔(加拿大的硅谷北部)一家大型电信制造商的软件设计师。对他来说,Linux 是实现梦想,在家中拥有一台价格合理的 Unix 兼容系统,可以与商业工作站媲美,并且只是为了玩乐而进行破解。

Jeff Tranter 白天是加拿大安大略省卡纳塔(加拿大的硅谷北部)一家大型电信制造商的软件设计师。对他来说,Linux 是实现梦想,在家中拥有一台价格合理的 Unix 兼容系统,可以与商业工作站媲美,并且只是为了玩乐而进行破解。

加载 Disqus 评论