当 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. 检查挂载点问题
有时磁盘分区挂载错误可能导致文件写入到了根目录,而不是正确的挂载点:
- 检查是否有挂载问题:
bash
复制
mount
- 如果某个挂载点(如
/mnt/data
)没有正确挂载,可能会导致根分区被写满。 - 解决方法:
- 确认挂载点:
bash
复制
df -h
- 如果未正确挂载,重新挂载分区:
bash
复制
sudo mount /dev/sdX /mnt/data
- 确认挂载点:
二、清理磁盘空间
清理磁盘空间时,应谨慎操作,避免删除系统关键文件。以下是常见的清理方法:
1. 清理系统日志
(1) 检查日志目录
Linux 日志通常存储在 /var/log
中:
bash
复制
du -h /var/log
(2) 删除过大的日志文件
如果发现某些日志文件过大(如 syslog
或 journal
文件),可以清理或压缩:
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
然后将压缩文件移动到其他存储设备或云端。
三、预防磁盘再次占满的策略
-
定期监控磁盘使用
- 使用
cron
定期运行df
或du
,并发送邮件报警:bash
复制
df -h | mail -s "Disk Usage Report" your-email@example.com
- 使用
-
设置磁盘占用警告
- 在
/etc/fstab
中启用磁盘配额(Quota)功能,限制用户或目录的磁盘使用量。
- 在
-
使用独立分区管理
- 将日志目录(
/var/log
)、临时目录(/tmp
)、用户目录(/home
)分区分开,避免单个分区写满后影响整个系统。
- 将日志目录(
-
扩容磁盘
- 如果所有清理措施后仍无法满足需求,可以考虑扩展磁盘(如通过云服务商增加硬盘空间)。
四、总结
当 Linux 磁盘满了时,按照以下步骤操作:
- 快速排查:使用
df
和du
定位问题分区和目录。 - 清理无用文件:删除日志、缓存、临时文件和旧内核。
- 优化存储:压缩或转移大文件,卸载不必要的软件。
- 长期策略:定期监控磁盘使用,分区独立管理或扩容磁盘。
通过上述方法,您可以快速释放磁盘空间并防止磁盘再次被占满。