Contents

在Linux上查找磁盘消耗

1. 简介

一个健康的系统应该有足够的空闲磁盘资源来保持运行。通常最好是至少有一定百分比的磁盘容量在大部分时间保持空闲。当磁盘空间耗尽时,程序输出或日志文件中的No space left on device system 消息将告诉我们问题存在。

在本文中,我们将重点介绍追踪空间去向的方法。这最终将允许我们执行一些清理或归档。

我们将通过一些实际示例讨论可能的方法。

2. 起点

通常,磁盘资源由几个分区组成,每个分区分配给一个挂载点目录。这就是为什么将搜索范围缩小到一个分区或仅安装点是一个好主意的原因。除非我们已经知道分区或目录,否则我们可以使用*df *命令确定分区进行调查:

# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  4.8G   58M  4.5G   2% /
/dev/mapper/centos-home  4.8G  925M  3.7G  20% /home
/dev/mapper/centos-var   3.2G  3.1G  122M  96% /var

从上面的输出中,我们看到*/var*分区已接近其容量限制。因此,这很可能是应该调查的。

3. CLI 方法

3.1. du

可以计算和报告使用统计的第一个也是最常用的命令是*du *,  “磁盘使用情况”的缩写。其目的是计算和报告作为参数传递的目录及其所有子目录的大小。

# du /var

然而,在没有选项的情况下这样运行它可能会导致长时间 未排序的输出,我们很难清楚地指出问题出在哪里。相反,我们希望获得前 5 个列表。为此,我们可以在du命令中添加一些选项,并使用*sort tail * 命令来获得所需的形式:

##    1    2                  3         4
##    v    v                  v         v
# du -BM --max-depth=1 /var | sort -n | tail -n 5 
73M     /var/www
108M    /var/lib
346M    /var/cache
1860M   /var/log
2387M   /var

以下是每个编号点的解释:

  1. –B选项用于指定块大小单位(在这种情况下为兆字节)
  2. –max-depth=1按第一级子目录聚合计算结果
  3. sort实用程序用于对du命令的输出进行排序,-n选项使其将字符串视为数字
  4. 带有*-n选项的tail*会剪切输出,只留下最后五行

我们注意到*/var/log*目录似乎是主要的罪犯。我们可以通过增加深度来获得更多细节:

# du -BM --max-depth=<strong>2</strong> /var | sort -n | tail -n 5
345M    /var/cache/yum
346M    /var/cache
<strong>637M    /var/log/httpd</strong>
1861M   /var/log
2388M   /var

此外,我们可以将更深层次的目录 /var/log传递给du而不仅仅是*/var*:

# du -BM --max-depth=1 <strong>/var/log</strong> | sort -n | tail -n 5
1M    /var/log/vmware-imc
4M    /var/log/anaconda
34M   /var/log/audit
<strong>637M  /var/log/httpd</strong>
1861M /var/log

如我们所见,/var/log/httpd是消费领导者。这是 Apache HTTP 服务器保存其日志文件的目录。也许需要配置日志轮换,或者应该降低日志级别。

通过进一步结合目标目录和深度,我们可以使我们的搜索更加精确。

3.2. find命令

有时,我们可以假设哪种数据最消耗磁盘空间。

例如,我们知道系统可以创建大存档文件。在这种情况下,我们可以直接将搜索处理到文件大小,而不是收集一般的使用统计信息。这就是*find 命令可以替代du*的地方。

当系统空间不足时,查找并删除几个大文件可以快速解决。假设我们要查找大于 100M 的文件。

为此,我们使用*-size选项和-printf选项。在下面的示例中,后一个选项以字节为单位打印文件大小和文件路径。同样,就像上面的du示例一样,我们将输出传递给sort -n*命令以获取按文件大小排序的列表:

# find /var -size +100M -printf '%s %p\n' | sort -n
104958094 /var/log/iptables.log
104958282 /var/log/kern
235536682 /var/log/secure
241433352 /var/log/httpd/ssl-error.log.20191022.gz
277761696 /var/log/messages

3.3. 已删除的文件仍在使用空间

在某些情况下,系统不会将已删除文件使用的空间报告为 free。原因是文件描述符仍然可以被某些进程打开。 例如,用户可以在应用程序仍在运行时删除应用程序日志文件。这不会物理地删除文件,并且应用程序会继续写入该文件。但是,文件不再被ls或文件管理器看到。

这是*lsof *实用程序可以提供帮助的地方。它显示与进程关联的文件描述符并报告标记为已删除的文件。一个实际的示例命令可能如下所示:

# lsof | grep -E '^COM|deleted'
COMMAND   PID   TID   USER   FD    TYPE       DEVICE    SIZE/OFF     NODE NAME
httpd     334         root   10w    REG   182,249585   231932418   527588 /var/log/httpd/error.log (deleted)

在这里我们可以看到删除的*/var/log/httpd/error.log仍然使用了超过 200 MB 的空间。要释放它,我们应该停止或重新启动httpd*进程。

4. TUI 方法

上述 CLI 方法可用于大多数 Linux 系统。即使在最小的系统安装中,dufind也几乎总是可用的。 但是,如果系统安装不仅仅是最小化,或者授予了安装新软件的管理权限,则可能首选TUI 方法。TUI 应用程序允许使用快捷键和鼠标与整个终端屏幕区域进行交互,从而使交互更加方便和人性化。下面提到的命令可从许多 Linux 平台的存储库中获得,并且可以由本机系统包管理器 安装。

4.1. mc文件管理器

mc 是所有 Linux 发行版中最古老的文件管理器之一,它有一个用于计算磁盘使用情况的入站选项。我们可以直观地选择一个文件夹或文件,然后按 Ctrl-Space快捷方式来获取使用摘要。目录名称可以指定为参数:

# mc /var

/uploads/tracking_disk_space/1.png

4.2. ncdu命令

ncdu 是另一个具有友好可视文本界面的工具。我们以与上述du相同的方式指定起始目录:

# ncdu /var

搜索完成后,我们会得到一个按降序排序的摘要

/uploads/tracking_disk_space/2.png

然后我们可以使用箭头键和Enter

与屏幕交互以获取更多详细信息,或者使用d快捷方式在不离开程序的情况下就地删除文件:

/uploads/tracking_disk_space/3.png