当 Droplet 磁盘空间显示 100% 时,最安全的清理方式是先定位占用最大的日志目录,通常位于 `/var/log` 或 systemd journal,使用 `truncate` 命令清空文件内容而非直接删除,避免 inode 未释放导致空间不回收。
先说结论:清理磁盘空间需优先定位大文件路径,采用安全截断方式清理日志,并验证 inode 使用情况。
- 先确认:使用 df -h 和 du -sh 定位占用最高的分区和目录
- 先处理:对正在写入的日志文件使用 truncate -s 0 而非 rm 删除
- 再验证:执行 df -h 和 df -i 确认 Use% 和 IUse% 下降
命令速用版
以下命令可直接在终端执行,用于快速诊断和清理常见日志占用。
df -h sudo du -sh /* | sort -hr | head -n 10 sudo journalctl `--vacuum-size`=100M sudo truncate -s 0 /var/log/syslog
为什么会这样
磁盘使用率显示 100% 通常是因为日志文件持续写入未轮转,或文件被删除但进程仍占用句柄。
Linux 系统中,应用程序产生的日志默认存储在 `/var/log` 目录下,若未配置 logrotate 轮转策略,单个日志文件可能增长至填满分区。此外,若直接删除正在被进程写入的日志文件,文件系统空间不会立即释放,因为进程仍持有该文件的 inode,需重启服务或清空文件内容才能回收空间。
分步处理
按以下顺序操作可安全释放空间,避免误删系统文件。
1. 确认磁盘占用情况
执行 `df -h` 查看各分区使用率,找到 Use% 为 100% 的挂载点,通常是根目录 `/` 或 `/var`。
2. 定位大文件目录
进入根目录,执行 `du -sh *` 逐级排查占用空间最大的文件夹。常见高占用目录包括 `/var/log`、`/var/lib/docker` 或 `/tmp`。
3. 安全清理日志文件
对于 systemd 日志,使用 `sudo journalctl `--vacuum-size`=100M` 限制日志大小。对于普通文本日志,如 `/var/log/syslog`,使用 `sudo truncate -s 0 文件名` 清空内容,严禁直接使用 `rm` 删除正在写入的文件。
4. 检查被占用已删除文件
若清理后空间未释放,执行 `sudo lsof +L1 | grep deleted` 查找被标记删除但仍被进程占用的文件,重启对应服务释放空间。
怎么验证是否生效
清理操作完成后,需再次执行诊断命令确认空间回收。
执行 `df -h` 检查目标分区的 Use% 是否下降,例如从 100% 降至 80% 以下。同时执行 `df -i` 检查 inode 使用率,排除因大量小文件导致 inode 耗尽的情况。若数值恢复正常,说明清理生效。
常见坑
处理磁盘满问题时,以下操作风险较高,需谨慎执行。
直接 `rm` 删除正在写入的日志文件会导致空间不释放,必须使用 `truncate` 或重启服务。忽略 `df -i` 检查可能导致即使磁盘空间有余,因 inode 耗尽也无法写入新文件。清理 `/var` 目录下未知文件可能破坏系统包管理器或数据库状态,操作前需确认文件用途。
常见问题
为什么删除了文件 df -h 还是显示 100%?
因为文件被进程占用未释放句柄。
文件虽被删除,但若有进程仍打开该文件,空间不会回收。需使用 `lsof` 查找并重启相关服务,或使用 `truncate` 清空原文件。
如何防止日志再次占满磁盘?
配置 logrotate 定期轮转日志。
编辑 `/etc/logrotate.conf` 或对应服务的配置,设置日志保留大小和天数,系统会自动切割和清理旧日志。
参考来源
- linux 中 df-h 命令显示/dev/sdal 容量已用 18g 已用 100%,怎么清理
- Linux 磁盘满了?3 个命令 1 分钟快速清理,服务器瞬间腾出空间
- Linux 磁盘爆满?三步快速识别与安全清理日志方案
- 磁盘用完 Linux 下 df -h 占用 100% , aliyun 官方集成 php 环境下
- 运维故障:在 df -h 和 df -i 显示使用率 100% 解决方法