
当前的情况是:VMware ESXi 虚拟机 安装了 Squashfs 格式的OpenWrt固件,使用时提示No space left on device的错误,本文详细讲解解决此问题的方法。
在 OpenWrt 中,Squashfs 属于只读文件系统。它的特性是:
- 彻底无法在原分区上“拉伸”扩容:它就像一个压缩包,一旦编译出来大小就固定了(通常只有十几兆)。
- “鸡生蛋”死循环:你之前用 apk add 写入的所有新文件,其实都堆在内存或极小的 overlay 缓存里。空间一旦爆满,系统文件系统就会损坏(报错 Stale file handle),这就是为什么之前的扩容脚本对它完全不起作用。
既然是 ESXi 虚拟机跑 Squashfs,最完美的解决办法是 “金蝉脱壳”法:在 ESXi 中加一块全新的独立虚拟硬盘,然后把系统的“家”(Overlay)彻底搬过去。请按照以下步骤操作:
第一步:在 ESXi 中添加一块新硬盘
1、登录 ESXi 后台,关闭 OpenWrt 虚拟机。
2、编辑虚拟机设置,点击 添加新设备 -> 新建标准硬盘。
3、容量设置为你想要的大小(例如 20GB 或更多),保存。
4、开启 OpenWrt 虚拟机。此时,这块新硬盘在系统中会被识别为 /dev/sdb。
第二步:利用内存(RAM)给系统“续命”以安装工具
由于原本的存储已经爆满挂起,我们需要利用内存临时清理出空间来安装格式化工具:
1、通过 SSH 连接 OpenWrt,执行以下命令重启临时释放内存:
reboot
2、重启后立刻连接 SSH,执行以下命令(注意:不要去安装体积庞大的 block-mount 或 yq):
#更新软件源
apk update
#仅安装最核心、体积最小的磁盘和格式化工具
apk add fdisk e2fsprogs
第三步:对新硬盘进行分区与格式化
接着来处理那块 20GB 的新硬盘 /dev/sdb:
1、运行分区命令:
fdisk /dev/sdb
2、在交互界面中,依次输入以下字母(每输一个敲一次回车):
- n (新建分区)
- p (选择主分区)
- 1 (创建第一个分区 /dev/sdb1)
- 直接回车 (默认起始扇区)
- 直接回车 (默认结束扇区,使用全部容量)
- w (保存并退出)
3、将新分区格式化为 ext4 文件系统:
mkfs.ext4 /dev/sdb1
第四步:迁移数据到新硬盘
将目前系统里现有的配置和数据拷贝到这块大硬盘中:
#创建临时挂载点并挂载新硬盘
mkdir /tmp/new_overlay
mount /dev/sdb1 /tmp/new_overlay
#将原只读系统之上的配置数据完整复制过去
cp -a /overlay/. /tmp/new_overlay
#卸载临时挂载
umount /tmp/new_overlay
第五步:在 OpenWrt的Web 后台(LuCI)接管系统
1、打开 OpenWrt 网页后台,进入 系统 (System) -> 挂载点 (Mount Points)。
2、找到 挂载点 (Mount Points) 区域,点击 添加 (Add):
- 启用 (Enable):勾选。
- UUID:在下拉菜单中选择 /dev/sdb1(后面会显示你设置的 20GB 大小)。
- 挂载点 (Mount Point):在下拉菜单中选择 作为外部 overlay 使用 (use as external overlay)。
3、点击页面右下角的 保存并应用 (Save & Apply)。
4、回到 ESXi 或在网页端重启 OpenWrt 虚拟机。
重启完成后,再次进入 OpenWrt 首页,可以发现“路由存储 / 空闲空间”已经变成了 20GB,且由于 Squashfs 的底层保护,未来即使软路由折腾固件崩溃,随时还可以在 ESXi 里拔掉这块新硬盘实现“一键重置配置”。
圈小蛙