在 Linux 系统管理与运维中,磁盘空间监控与管理是保障系统稳定、高效运行的核心任务。无论是日志暴增、应用异常写入,还是存储规划不足,都会触发磁盘告急的警报。本文将从实用命令出发,逐步深入到自动化监控、排错技巧与优化策略,助你全面掌控 Linux 存储资源。

一、 基础核心:df 与 du 命令详解

Linux磁盘空间查看实用指南

1. df:文件系统宏观概览

`df` 命令是快速获取磁盘使用率的首选工具。其核心在于展示已挂载文件系统的整体容量、使用量与剩余空间。

关键参数解析:

`-h`(Human-readable):将字节转换为 KB、MB、GB 单位(强烈推荐日常使用

`-T`:显示文件系统类型(如 ext4, xfs, tmpfs)

`-i`:显示 inode 使用情况(文件数量限制,对小文件场景至关重要)

`-x TYPE`:排除指定类型的文件系统

`output=field1,field2`:定制输出字段(如 `source,fstype,size,used,avail,pcent,target`)

经典应用示例:

bash

df -hT /home 查看 /home 分区的空间与文件系统类型

df -hi 查看所有分区的 inode 使用率(警惕 100% 情况)

df -h output=source,size,used,avail,pcent 精简输出关键信息

2. du:目录与文件微观分析

当 `df` 显示空间不足,但无法定位具体“大文件”时,`du` 命令是深入挖掘的利器。它统计目录或文件的磁盘实际占用。

关键参数解析:

`-h`:人性化显示大小

`-s`(Summarize):仅显示总大小(常用于快速获取目录总占用量)

`max-depth=N`:限制递归目录深度(排查大文件的黄金参数

`-a`:显示所有文件的占用(默认只显示目录)

`-c`:最后显示总计

`time`:显示文件修改时间(辅助判断新旧文件)

高效排查技巧:

bash

du -sh /var/log/ 快速查看 /var/log 下各子目录总大小

du -h max-depth=1 /home | sort -h 找出 /home 下占用最大的顶级目录

du -ah /var | sort -hr | head -n 20 列出 /var 中最大的前20个文件/目录

二、 进阶工具:定位空间消耗的利器

1. ncdu:交互式可视化分析

`ncdu` (NCurses Disk Usage) 提供类图形化的终端界面,直观导航文件系统并排序目录大小。

安装与使用:

bash

sudo apt install ncdu Debian/Ubuntu

sudo yum install ncdu CentOS/RHEL

ncdu /path/to/scan 扫描指定目录

进入界面后,使用方向键导航,`d` 删除文件(需权限),`r` 刷新统计。

2. 定位占用空间进程:lsof

当文件被进程占用时,即使删除文件,空间也可能不会立即释放(直到进程关闭文件句柄)。`lsof` 可列出此类文件:

bash

lsof +L1 显示所有链接计数为0(已删除)但仍被打开的文件

lsof /var/log/syslog 查看谁在使用 syslog 文件

3. 工具对比与选择建议

| 工具 | 适用场景 | 优势 | 局限 |

  • | -
  • | - | - |
  • | df | 快速查看分区整体使用率 | 简洁高效,宏观概览 | 无法定位具体目录/文件 |

    | du | 分析目录/文件大小,定位大对象 | 灵活,可深度扫描,结合排序强大 | 递归扫描大目录可能较慢 |

    | ncdu | 交互式探索目录结构,可视化空间分布 | 用户体验极佳,操作直观 | 需要额外安装 |

    | lsof | 查找被进程占用导致空间未释放的文件 | 解决“幽灵”空间问题 | 输出信息较复杂 |

    三、 实战排错:典型磁盘空间问题解决

    案例1:根分区 `/` 即将用满

    1. 宏观定位: `df -h /`

    2. 微观分析:

    bash

    cd /

    sudo du -h max-depth=1 2>/dev/null | sort -h 找出根下最大目录

    3. 常见罪魁祸首:

    `/var/log`:日志文件暴增(使用 `journalctl vacuum-size` 清理)

    `/var/cache`:软件包缓存(`apt clean` 或 `yum clean all`)

    Docker:镜像/容器/卷占用(`docker system prune -a volumes` 谨慎使用)

    用户目录:大文件堆积(结合 `find /home -type f -size +500M` 搜索)

    案例2:inode 耗尽导致磁盘有空间却无法写入

    现象:`df -h` 显示空间充足,但 `df -i` 显示 inode 使用率 100%。

    原因: 文件系统 inode 数量固定(通常在格式化时设定),海量小文件耗尽 inode。

    解决:

    bash

    df -i 确认 inode 耗尽的分区

    find /mount-point -type f | wc -l 统计文件总数(验证)

    find /mount-point -xdev -printf '%h

    ' | sort | uniq -c | sort -nr 找出文件数最多的目录

    根治: 清理无用小文件,或备份后重新格式化并增加 inode 数量(需谨慎操作)。

    四、 深入理解:文件系统与空间管理的本质

    1. 空间分配机制: Linux 文件系统(如 ext4, XFS)采用 inode 管理文件元数据,数据块存储实际内容。`df` 报告的是数据块的使用情况,`df -i` 报告 inode 使用情况。

    2. “已删除”文件的空间释放: 文件被删除(`rm`)后,其数据块仅被标记为“空闲”,空间不会立即被新数据覆盖。若文件正被进程打开(`lsof` 可见),数据块仍被占用,直到进程关闭文件句柄。

    3. `du` vs `df` 差异来源:

    元数据差异: `df` 统计文件系统元数据(superblock)信息,反映整体分配。`du` 统计目录树中文件实际使用的块数。

    挂载点影响: 子目录挂载了其他文件系统时,`du` 默认不跨越挂载点统计。

    稀疏文件 (Sparse Files): `du` 报告实际分配的块,`df` 报告文件逻辑大小(可能大很多)。

    已删除未释放文件: 导致 `df` 显示已用空间高,但 `du` 扫描不到该文件。

    五、 高级策略:自动化监控与空间优化

    1. 自动化监控脚本:

    使用 Shell/Python 编写定期任务,结合 `df` 和 `du` 监控关键分区:

    bash

    !/bin/bash

    CRITICAL=90

    partition="/

    usage=$(df -h "$partition" | awk 'NR==2 {print $5}' | tr -d '%')

    if [[ $usage -ge $CRITICAL ]]; then

    echo "WARNING: Partition $partition usage is ${usage}%!" | mail -s "Disk Space Alert"

    可触发清理脚本或更高级通知

    fi

    2. LVM 弹性扩展:

    使用逻辑卷管理(LVM)可在线扩展分区,无需停机:

    bash

    pvcreate /dev/sdb1 创建物理卷

    vgextend vg_data /dev/sdb1 扩展卷组

    lvextend -l +100%FREE /dev/vg_data/lv_home 扩展逻辑卷

    resize2fs /dev/vg_data/lv_home 调整文件系统大小(ext)

    xfs_growfs /mount-point 调整 XFS 文件系统

    3. 日志管理与轮转:

    配置 `logrotate`(`/etc/logrotate.conf` 及 `/etc/logrotate.d/`),按时间或大小轮转日志。

    对于 systemd 系统:`journalctl vacuum-size=100M` 限制 journal 日志大小。

    4. Docker 存储优化:

    定期清理:`docker system prune -f`

    更改存储驱动或存储路径(修改 `/etc/docker/daemon.json`)。

    使用 `docker builder prune` 清理构建缓存。

    5. 考虑现代文件系统特性:

    Btrfs/ZFS: 提供透明压缩(`compress=zstd`)、写时复制(COW)、快照、内置配额等功能,节省空间并提升管理灵活性。

    六、 最佳实践

    1. 定期检查: 将 `df -h` 和 `df -i` 纳入日常巡检流程,尤其关注 `/`, `/var`, `/tmp` 等关键分区。

    2. 精准定位: 空间告警时,先用 `df` 定位分区,再用 `du` 或 `ncdu` 定位具体目录/文件。

    3. 预防为主: 实施日志轮转、配置缓存清理策略、规划好存储(尤其是 LVM)。

    4. 理解工具差异: 掌握 `df` 与 `du` 结果不同的原因,避免误判。

    5. 善用高级特性: 在合适场景采用 LVM、Btrfs/ZFS 等提升管理效率和空间利用率。

    6. 自动化响应: 配置监控脚本,在空间达到阈值时自动告警或触发清理任务。

    > 深入建议: 面对容器化部署,尤其要警惕日志和镜像存储的失控增长。建议将容器日志输出到外部集中式日志系统(如 Loki, ELK),并为 Docker 配置合理的存储驱动与定期清理策略。对于大型存储池,ZFS 或 Btrfs 的压缩与去重功能可带来显著的存储效率提升,但其复杂度也需评估。

    延伸阅读资源:

    `man df`, `man du`, `man ncdu`, `man lsof` (最权威的文档)

    Linux 文件系统标准 (Filesystem Hierarchy Standard

  • FHS)
  • LVM 官方文档 (`man lvm`)

    Btrfs Wiki:

    ZFS 文档:

    通过掌握这些核心命令、理解底层原理并运用优化策略,你将能游刃有余地应对 Linux 系统中的任何磁盘空间挑战,确保系统高效稳定运行。