服务器迁移出现 No space left on device 通常是因为磁盘空间耗尽或 inode 节点用完,优先清理包管理器缓存和旧日志文件,避免直接删除系统关键文件。
先说结论:该报错多数情况是磁盘分区满或 inode 耗尽,需先区分空间不足还是节点不足,再针对性清理缓存或大文件。
- 先确认:使用 df -h 检查磁盘使用率,使用 df -i 检查 inode 使用率。
- 先处理:优先清理包管理器缓存(apt/yum)和截断旧日志文件,不要直接 rm 正在写入的日志。
- 再验证:执行 df 命令确认空间释放,重启迁移任务观察是否继续。
命令速用版
以下命令可直接在终端执行,用于快速定位和清理空间。
# 检查磁盘空间使用率
df -h
# 检查 inode 节点使用率
df -i
# 查找当前目录下大于 100M 的文件
find . -type f -size +100M -exec ls -lh {} \;
# 清理 Debian/Ubuntu 包缓存
apt-get clean
# 清理 CentOS/RHEL 包缓存
yum clean all
# 清空指定日志文件(不删除文件)
echo > /var/log/syslog为什么会这样
报错 No space left on device 不一定代表磁盘块用完,也可能是 inode 节点耗尽。
Linux 文件系统将空间分为数据块和 inode 索引节点。如果产生大量小文件,即使总容量未满,inode 用尽也无法写入新文件。此外,如果文件被删除但进程仍持有句柄,空间不会立即释放,导致 df 显示有空间但实际无法写入。
分步处理
按顺序执行以下步骤,确保操作安全且可回滚。
1. 确认瓶颈类型
执行 df -h 查看 Use% 是否接近 100%。执行 df -i 查看 IUse% 是否接近 100%。如果是 IUse% 满,需清理大量小文件;如果是 Use% 满,需清理大文件。
2. 定位大文件目录
在根目录或疑似满的分区挂载点执行 du -sh * 找出占用最大的文件夹。进入该目录重复执行,直到定位到具体文件。
3. 清理包管理器缓存
包管理器下载的安装包缓存通常可安全清理。Debian/Ubuntu 系统运行 apt-get clean,CentOS/RHEL 系统运行 yum clean all。此操作不影响已安装的软件。
4. 处理日志文件
不要直接使用 rm 删除正在写入的日志文件,否则 inode 不会释放。使用 echo > /path/to/log 清空文件内容。对于轮转过的旧日志(如 .gz 结尾),可以直接删除。
5. 释放被占用的删除文件
如果删除了大文件但空间未释放,执行 lsof | grep deleted 查找被删除但仍被进程持有的文件。重启对应服务或进程以释放空间。
怎么验证是否生效
再次运行 df -h 和 df -i,确认 Avail 和 IAvail 列有可用数值。重新运行迁移任务,观察是否不再报错。
常见坑
- 直接 rm 正在写入的日志文件会导致空间不释放,必须使用 truncate 或 echo 清空。
- 不要手动删除 /var/lib/rpm 或 /var/lib/dpkg 等数据库文件,会导致包管理器损坏。
- 清理缓存前确认迁移任务本身没有未完成的临时文件需要保留。
常见问题
删除了大文件为什么 df 还是显示满?
因为文件被进程占用,句柄未释放。使用 lsof 查找 deleted 文件并重启对应服务。
清理 apt 或 yum 缓存会影响已安装的软件吗?
不会。清理的是下载的安装包缓存,已安装的软件文件不受影响。
inode 满了怎么快速清理?
查找文件数量最多的目录,通常是会话文件或小日志目录,删除无用的小文件。