Linux 磁盘满了怎么办?快速排查和清理方法

Linux 磁盘满了,会导致系统无法正常运行,比如无法写入文件、服务停止、甚至系统崩溃。因此,快速排查并清理磁盘空间是非常重要的。以下是详细的排查和解决步骤:


一、快速定位磁盘占用原因

1. 检查磁盘使用情况

使用 df 命令查看磁盘分区的使用情况:

bash

复制

复制代码
df -h
  • 参数说明

    • -h:以人类可读的格式显示(GB、MB)。
  • 输出示例

    plaintext

    复制

    复制代码
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        50G   45G  5G   90% /
    /dev/sda2       100G   95G  5G   95% /home

如果某个分区(如 //home)的 Use% 达到接近 100%,说明该分区已满。


2. 找出大文件和目录

(1) 使用 du 查找占用最多的目录

du 命令用于分析文件和文件夹的磁盘占用情况:

bash

复制

复制代码
du -h --max-depth=1 /
  • 参数说明

    • -h:以人类可读的格式显示。
    • --max-depth=1:只查看顶级目录的大小。
  • 输出示例

    plaintext

    复制

    复制代码
    5.0G   /var
    20G    /home
    15G    /usr
    1.2G   /tmp

根据输出结果,进一步深入到占用空间较大的目录(如 /home):

bash

复制

复制代码
du -h --max-depth=1 /home
(2) 使用 find 查找大文件

查找超过 1GB 的大文件:

bash

复制

复制代码
find / -type f -size +1G 2>/dev/null
  • 参数说明
    • -type f:只查找文件。
    • -size +1G:查找大于 1GB 的文件。
    • 2>/dev/null:忽略权限不足导致的错误。

3. 检查挂载点问题

有时磁盘分区挂载错误可能导致文件写入到了根目录,而不是正确的挂载点:

  1. 检查是否有挂载问题: bash

    复制

    复制代码
    mount
  2. 如果某个挂载点(如 /mnt/data)没有正确挂载,可能会导致根分区被写满。

  3. 解决方法:

    • 确认挂载点: bash

      复制

      复制代码
      df -h
    • 如果未正确挂载,重新挂载分区: bash

      复制

      复制代码
      sudo mount /dev/sdX /mnt/data

二、清理磁盘空间

清理磁盘空间时,应谨慎操作,避免删除系统关键文件。以下是常见的清理方法:


1. 清理系统日志

(1) 检查日志目录

Linux 日志通常存储在 /var/log 中:

bash

复制

复制代码
du -h /var/log
(2) 删除过大的日志文件

如果发现某些日志文件过大(如 syslogjournal 文件),可以清理或压缩:

bash

复制

复制代码
sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/auth.log
(3) 清理 journal 日志

对于使用 systemd 的系统(如 Ubuntu 和 CentOS 7+),日志可能存储在 journal 中:

  • 查看日志占用空间: bash

    复制

    复制代码
    journalctl --disk-usage
  • 清理日志(保留最近 7 天的日志): bash

    复制

    复制代码
    sudo journalctl --vacuum-time=7d

2. 清理缓存文件

(1) 清理 apt 缓存(适用于 Debian/Ubuntu)

APT 会缓存已下载的软件包,占用大量空间:

bash

复制

复制代码
sudo apt-get clean
(2) 清理 yum 缓存(适用于 CentOS/RHEL)

bash

复制

复制代码
sudo yum clean all
(3) 清理临时文件

临时文件通常存储在 /tmp 目录中,可以安全删除:

bash

复制

复制代码
sudo rm -rf /tmp/*

3. 删除未使用的旧内核

(1) 列出已安装内核

在 Ubuntu/Debian 系统中,列出所有内核版本:

bash

复制

复制代码
dpkg --list | grep linux-image
(2) 删除旧内核

保留当前内核和最近的一个版本,其余都可以删除:

bash

复制

复制代码
sudo apt-get autoremove --purge

对于 CentOS 系统:

bash

复制

复制代码
sudo yum remove kernel-oldversion

4. 查找和清理无用文件

(1) 清理大文件

使用 find 找到大文件后,确认是否不再需要这些文件,删除它们:

bash

复制

复制代码
sudo rm -f /path/to/large-file
(2) 清理用户的下载目录

检查 /home 目录下的用户文件:

bash

复制

复制代码
du -h --max-depth=1 /home

删除不需要的文件或备份到其他存储设备。


5. 卸载不必要的大型软件包

(1) 列出已安装的软件包及其大小

在 Debian/Ubuntu 系统中:

bash

复制

复制代码
dpkg-query -W --showformat='${Installed-Size} ${Package}\n' | sort -n

在 CentOS/RHEL 系统中:

bash

复制

复制代码
rpm -qa --qf '%10{SIZE}\t%{NAME}\n' | sort -n
(2) 卸载不需要的软件

例如,卸载某个软件包:

bash

复制

复制代码
sudo apt-get remove --purge package-name

或:

bash

复制

复制代码
sudo yum remove package-name

6. 压缩备份文件

如果某些文件需要保留但不常用,可以压缩后存储:

bash

复制

复制代码
tar -czvf backup.tar.gz /path/to/large-directory

然后将压缩文件移动到其他存储设备或云端。


三、预防磁盘再次占满的策略

  1. 定期监控磁盘使用

    • 使用 cron 定期运行 dfdu,并发送邮件报警:

      bash

      复制

      复制代码
      df -h | mail -s "Disk Usage Report" your-email@example.com
  2. 设置磁盘占用警告

    • /etc/fstab 中启用磁盘配额(Quota)功能,限制用户或目录的磁盘使用量。
  3. 使用独立分区管理

    • 将日志目录(/var/log)、临时目录(/tmp)、用户目录(/home)分区分开,避免单个分区写满后影响整个系统。
  4. 扩容磁盘

    • 如果所有清理措施后仍无法满足需求,可以考虑扩展磁盘(如通过云服务商增加硬盘空间)。

四、总结

当 Linux 磁盘满了时,按照以下步骤操作:

  1. 快速排查 :使用 dfdu 定位问题分区和目录。
  2. 清理无用文件:删除日志、缓存、临时文件和旧内核。
  3. 优化存储:压缩或转移大文件,卸载不必要的软件。
  4. 长期策略:定期监控磁盘使用,分区独立管理或扩容磁盘。

通过上述方法,您可以快速释放磁盘空间并防止磁盘再次被占满。

相关推荐
ZHW_AI课题组31 分钟前
调用阿里云实现文本翻译功能
阿里云·云计算
Jason_chen1 小时前
Linux 6.2 音频机制深度解析:AI驱动的低延迟音频与零信任音频安全架构
linux
下午写HelloWorld1 小时前
Linux系统及Ubuntu常用指令
linux·ubuntu·操作系统
lizhihai_993 小时前
股市学习心得-AI 产业链核心标的梳理清单
大数据·服务器·人工智能·科技·学习
云计算磊哥@3 小时前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
weixin_523185323 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
黄同学real3 小时前
解决 Visual Studio Web Deploy 远程发布报 401 未授权 (ERROR\_USER\_UNAUTHORIZED)
服务器
天天进步20153 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket
凡人叶枫4 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽4 小时前
玩转RK3506SDK
linux·嵌入式硬件