是 inode 耗尽而非磁盘空间不足;需先运行 df -i 查 iuse%≥95%、df -h 确认空间充足,再定位 composer 缓存路径,重点清理 vcs/ 和 /tmp 中的大量小文件,并禁用 cache.vcs 防复发。

确认是不是 inode 耗尽,而不是磁盘块满
报 No space left on device 且卡在 Downloading 或 Extracting 阶段?别急着删项目。先跑这两行:
df -i —— 看 /tmp、/home、/root 所在分区的 IUse%。若 ≥95%,基本就是 inode 耗尽;
df -h —— 对比空间剩余量。哪怕还剩 30GB,IUse% 到 100% 一样会失败。
Composer 同步镜像时会高频写小文件:每个包版本建独立子目录(如 ~/.composer/cache/files/monolog/monolog/1.27.0/),每个目录含 .zip + metadata.json + 解压临时结构,单个就占数个 inode。长期用国内镜像源(尤其频繁 composer update)极易在 /tmp 或缓存挂载点撑爆 inode。
精准定位 Composer 相关 inode 占用大户
别猜路径,先查真实缓存位置:
composer config --global cache-dir —— 输出实际路径,可能被 COMPOSER_CACHE_DIR 或公司 NFS 挂载覆盖(比如 /mnt/nfs/composer-cache);
再针对该路径查 inode 占用:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
-
du --inodes -s $(composer config --global cache-dir)/files 2>/dev/null | sort -n——files/是 ZIP 归档区,文件多但单个大,inode 压力中等; -
du --inodes -s $(composer config --global cache-dir)/vcs 2>/dev/null | sort -n——vcs/是重灾区,每个 Git 裸仓库含成千上万个对象文件,单个就耗数万 inode; -
du --inodes -s /tmp 2>/dev/null | sort -n—— Composer 解压过程默认用/tmp,CI 环境或低配云主机常在此爆满。
安全清理:只动真正吃 inode 的部分
composer clear-cache 默认只清 files/,跳过 vcs/ 和 /tmp —— 这正是你清完还报错的主因。
必须手动干预:
- 停掉所有正在运行的 Composer 进程(尤其是后台 CI job),避免文件被占用导致 inode 不释放;
- 清
vcs/:rm -rf $(composer config --global cache-dir)/vcs/*(Linux/macOS)或 Windows 下手动清空%APPDATA%\Composer\Cache\vcs\; - 清临时目录:
find /tmp -type d -name "composer_*" -mtime +1 -exec rm -rf {} +; - 禁用 VCS 缓存(一劳永逸):
composer config --global cache.vcs false,后续强制走--prefer-dist,不再克隆裸仓库。
注意:rm -rf ~/.composer/cache 全删是危险操作——若缓存路径被重定向,你会删错位置;若曾用 sudo composer,残留权限问题会导致下次 install 失败。
预防镜像同步引发的 inode 雪崩
单纯清理治标。镜像源本身也会加剧问题:国内镜像每分钟拉取 Packagist 元数据并生成 provider 文件,这些文件被 Composer 本地缓存时同样产生大量小文件。
关键控制点:
- 把缓存目录挂到独立分区(如
/opt/composer-cache),格式化时用mkfs.ext4 -T small /dev/sdX1,提升 inode 总数; - 在 CI 脚本开头加
composer config --global cache.vcs false,杜绝 Git 克隆; - 定期清理旧包:
find $(composer config --global cache-dir)/files -type f -name "*.zip" -mtime +60 -delete; - 检查镜像源是否真同步:
curl -sI https://mirrors.aliyun.com/composer/packages.json | grep HTTP,HTTP 200 才可信。
最易被忽略的是:/tmp 分区往往和 / 共享 inode,而 Composer 在解压阶段默认用它 —— 即使你把缓存挪到 SSD,/tmp 仍可能成为单点瓶颈。










