解决Linux磁盘用量问题,核心在于通过 df 命令定位空间占用分区,利用 du 命令逐级深入查找大目录或大文件,并针对日志文件、软件包缓存、已删除但未释放的文件句柄以及 Inode 耗尽等特定场景进行精准清理。
linux查看磁盘占用情况命令与排查逻辑
在Linux运维过程中,面对磁盘空间告警,第一步并非盲目删除文件,而是建立清晰的“由面到点”的排查逻辑。
快速识别:df 与 du 的应用场景
运维人员必须区分“磁盘空间占用”与“文件目录占用”这两个概念。
- df (Disk Free):用于查看整个文件系统的整体使用情况。
- du (Disk Usage):用于查看特定目录或文件占用的空间大小。
实战操作路径:
- 查看整体分区状态:执行
df -h,这里的-h参数代表 “human-readable”,会将字节数转换为我们易读的 GB、MB 格式,通过该命令,可以迅速判断是哪个挂载点(如 、/var或/home)达到了临界值。 - 定位高占用目录:在确定了问题分区后,进入该分区并执行
du -sh。-s表示只显示总计(summary)。-h表示易读格式。- 代表当前目录下的所有子目录和文件。
- 层级递进排查:如果发现
/var占用过高,则进入/var执行du -sh,重复此过程直到锁定具体的文件夹。
进阶技巧:linux大文件查找命令实战
当磁盘空间告警时,往往是由于个别超大日志文件或备份文件导致的,使用传统的 du 命令逐层查找效率较低,需要使用更高效的搜索手段。
高效查找方案:
- 按文件大小查找:使用
find命令可以快速定位全盘或指定目录下的巨型文件。- 命令示例:
find / -type f -size +500M - 该命令会搜索根目录下所有大于 500MB 的普通文件。
- 命令示例:
- 组合排序查找:结合
du与sort命令,可以直接列出当前目录下占用空间最大的前 10 个文件或目录。- 命令示例:
du -ah | sort -rh | head -n 10 -a表示包含文件,-r表示逆序,-h表示易读格式。
- 命令示例:
linux磁盘空间不足如何清理与深度治理
清理磁盘不只是简单的 rm -rf,不当的操作可能会导致系统服务崩溃或数据丢失。
解决“文件已删但空间未释放”的隐患
这是运维中最常见的“诡异”现象:明明使用 rm 删除了几个 GB 的日志文件,但 df -h 显示的可用空间却没有任何变化。
业内专家指出,这种情况通常是因为该文件仍被某个运行中的进程占用(打开状态),在 Linux 中,一个文件被删除后,如果仍有进程持有该文件的句柄,文件系统的索引节点(Inode)虽然被标记为删除,但数据块(Data Blocks)并不会被释放。
排查与解决步骤:
- 查找已删除但仍被占用的文件:
- 执行命令:
lsof | grep deleted
- 执行命令:
- 识别占用进程:在输出结果中,查看
COMMAND列,确定是哪个服务(如nginx、mysql或syslog)占用了该文件。 - 释放空间:
- 安全做法:重启对应的服务(如
systemctl restart nginx),进程关闭后,系统会自动回收空间。 - 在线做法:如果无法重启服务,可以尝试对该文件句柄进行清空操作(前提是已知文件路径),
echo > /proc/[PID]/fd/[FD_ID]。
- 安全做法:重启对应的服务(如
日志与缓存文件的系统级清理
日志文件是磁盘空间的“头号杀手”。
- 日志文件(/var/log):
- 检查
/var/log/下的.log文件。 - 检查
journald系统日志,使用journalctl --disk-usage查看日志占用情况,使用journalctl --vacuum-time=7d清理 7 天前的日志。
- 检查
- 软件包缓存:
- Debian/Ubuntu 系:执行
apt-get clean清理已下载的安装包。 - RedHat/CentOS 系:执行
yum clean all或dnf clean all。
- Debian/Ubuntu 系:执行
Inode 耗尽:被忽视的磁盘空间危机
据统计,在处理大量小文件(如邮件服务器、Session 文件或大量临时文件)的场景下,经常会出现 “磁盘空间充足,但无法创建新文件” 的情况。
这并非磁盘容量不足,而是 Inode(索引节点) 用尽,每个文件都需要占用一个 Inode,如果文件数量极其庞大,即使磁盘还有几百 GB 剩余,也会因为 Inode 耗尽而报错。
排查方法:
- 执行
df -i查看各分区的 Inode 使用率。 IUse%接近 100%,必须通过find命令查找并删除包含大量小文件的目录(通常在/tmp或/var/spool下)。
架构设计:linux磁盘分区工具对比与扩容方案
当磁盘清理无法从根本上解决问题时,必须考虑扩容。
传统分区与 LVM 逻辑卷的差异化对比
在设计 Linux 服务器架构时,选择何种分区方式决定了后期的运维难度。
| 特性 | 传统物理分区 (Standard Partition) | LVM 逻辑卷管理 (Logical Volume Manager) |
|---|---|---|
| 灵活性 | 极低,扩容通常需要重新分区或移动数据。 | 极高,支持在线扩容,无需停机。 |
| 扩容难度 | 需要调整分区表,存在风险。 | 只需向卷组(VG)添加物理卷(PV)并扩展。 |
| 管理复杂度 |
简单,直接映射硬件。 | 较复杂,多了一层逻辑抽象。 |
| 适用场景 | 简单的单磁盘、静态环境。 | 企业级生产环境、云服务器、动态扩容需求。 |
行业共识认为,对于生产环境的服务器,强烈建议优先使用 LVM 架构,以应对业务增长带来的存储压力。
扩容实操:从物理磁盘到逻辑卷的演进
假设你为服务器增加了一块新的物理硬盘 /dev/sdb,使用 LVM 进行扩容的标准流程如下:
- 创建物理卷 (PV):
pvcreate /dev/sdb
- 扩展卷组 (VG):
- 假设原卷组名为
vg_data,执行vgextend vg_data /dev/sdb。
- 假设原卷组名为
- 扩展逻辑卷 (LV):
- 执行
lvextend -l +100%FREE /dev/vg_data/lv_data,将所有新空间分配给逻辑卷。
- 执行
- 调整文件系统大小:
- 如果是 ext4 文件系统:
resize2fs /dev/vg_data/lv_data - 如果是 XFS 文件系统:
xfs_growfs /mount_point
- 如果是 ext4 文件系统:
Q&A: linux磁盘用量深度问答
linux磁盘空间满了怎么办?
首先使用 df -h 确认是哪个分区满了;接着使用 du -sh / 逐层定位大目录;随后利用 find / -type f -size +100M 查找大文件;最后针对日志、缓存或已删除但未释放的文件句柄进行清理。
如何防止磁盘空间被日志占满?
建议配置 logrotate 工具,通过设置自动轮转、压缩以及保留天数来管理日志;同时对于系统日志,应合理配置 journald 的存储限额(如 SystemMaxUse 参数)。
为什么删除了大文件但df显示空间没变?
这通常是因为该文件仍被某个进程打开,进程持有文件句柄,导致文件系统无法释放数据块,请使用 lsof | grep deleted 找到相关进程并重启该服务。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/488204.html



