OpenWrt 安装 PassWall2 时提示空间不足?PVE 虚拟机扩容实战:从 1GB 到 4GB
OpenWrt 安装 PassWall2 时提示空间不足?PVE 虚拟机扩容实战:从 1GB 到 4GB
摘要: 在 PVE 虚拟机中部署 OpenWrt 25.12、安装 PassWall2 和代理核心时,遇到了 No space left on device 错误。起初 /tmp 还有近 1GB 可用空间,却始终无法安装 Sing-Box。经过逐步排查,最终发现问题出在 OpenWrt 的可写 Overlay 文件系统:虚拟磁盘虽然有 1GB,但实际可写空间只有约 87MB。本文记录从问题定位、虚拟磁盘扩容到根分区和 Overlay 扩容的完整过程,供遇到类似问题的朋友参考。
关键词: OpenWrt、PVE、PassWall2、Sing-Box、Xray、Overlay、磁盘扩容、APK
一、问题背景:为什么安装软件会提示空间不足?
我的环境是 PVE 虚拟化平台,在一台 Intel N100 主机上运行 OpenWrt 虚拟机,准备部署 PassWall2,并安装 Xray、Sing-Box 等代理核心。
系统信息如下:
| 项目 | 配置 |
|---|---|
| 虚拟化平台 | Proxmox VE(PVE) |
| 虚拟机系统 | OpenWrt 25.12.5 |
| 系统架构 | x86/generic |
| 虚拟机型号 | QEMU Standard PC(Q35 + ICH9) |
| 原始虚拟磁盘 | 1 GiB |
| 目标磁盘容量 | 4 GiB |
| 软件包管理器 | APK |
| 已安装的代理组件 | PassWall2、Xray |
PassWall2 的 LuCI 管理界面安装成功后,我继续安装 Sing-Box。
执行:
apk add sing-box安装过程中出现了以下报错:
Installing sing-box (1.14.3-r1)
ERROR: sing-box-1.14.3-r1:
failed to extract usr/bin/sing-box: No space left on device
ERROR: wget: exited with error 4
ERROR: sing-box-1.14.3-r1: No space left on device第一反应是下载失败或者软件源有问题。但之前下载软件包时,/tmp 明明还有大量可用空间。
那么,究竟是网络问题,还是磁盘问题?
二、排查第一步:检查文件系统,而不是反复重试
在 OpenWrt 中,首先查看各个文件系统的容量:
df -h当时得到的关键结果如下:
Filesystem Size Used Available Use% Mounted on
/dev/root 5.3M 5.3M 0 100% /rom
tmpfs 1006.2M 9.9M 996.3M 1% /tmp
/dev/loop0 87.1M 67.6M 12.6M 84% /overlay
overlayfs:/overlay 87.1M 67.6M 12.6M 84% /这几行信息揭示了真正的问题。
/rom:只读的基础系统文件系统。/overlay:可写层,安装软件和保存系统配置时会使用它。/:由只读基础系统和可写 Overlay 合并形成的根文件系统。/tmp:临时文件系统,通常使用内存作为存储空间。
虽然 /tmp 有近 1GB 可用空间,但 /overlay 只剩下 12.6MB。
下载文件有空间,不代表安装软件也有空间。
安装软件时,程序文件、配置文件以及相关依赖需要写入可写文件系统。/tmp 的剩余空间不能直接替代 /overlay 的可用空间。
因此,继续反复下载或安装 Sing-Box,并不能解决根本问题。
三、排查第二步:确认虚拟磁盘和分区布局
接下来查看系统识别到的磁盘和分区。
执行:
cat /proc/partitions扩容前的关键结果:
major minor #blocks name
7 0 101184 loop0
8 0 1048576 sda
8 1 16384 sda1
8 2 106496 sda2由此可以看出:
/dev/sda:整个虚拟磁盘,约 1 GiB。/dev/sda1:约 16 MiB,挂载为/boot。/dev/sda2:约 104 MiB,包含根文件系统相关内容。/dev/loop0:从第二分区内部映射出来的 Loop 设备,承载可写 Overlay 文件系统。
进一步查看 Loop 设备的来源:
cat /sys/block/loop0/loop/backing_file
cat /sys/block/loop0/loop/offset
cat /sys/block/loop0/loop/sizelimit实际输出:
/sda2
5439488
0这说明 Overlay 并不是简单地直接挂载整个 /dev/sda2,而是从第二分区的某个偏移位置创建了 Loop 设备。
这也是为什么不能直接对 /dev/sda2 执行格式化操作:分区内还包含系统启动和只读根文件系统所需的数据。
OpenWrt 官方文档也说明,常见的 x86 镜像会把 /dev/sda1 用作启动分区,把 /dev/sda2 用作根文件系统相关分区;初始镜像通常不会自动使用磁盘的全部剩余空间。
参考:OpenWrt 官方文档:OpenWrt on x86 hardware
四、解决方案:先扩大 PVE 虚拟磁盘
确认原始虚拟磁盘只有 1 GiB 后,我决定将它扩大到 4 GiB。
4.1 在 PVE 中调整磁盘容量
操作步骤如下:
正常关闭 OpenWrt 虚拟机。
在 PVE 管理界面选中对应虚拟机。
进入“硬件(Hardware)”。
选中现有虚拟硬盘。
点击“调整大小(Resize disk)”。
增加 3 GiB,使总容量达到约 4 GiB。
启动 OpenWrt 虚拟机。
注意:PVE 的“增加容量”通常是指在现有容量基础上增加指定数值,而不是把总容量设置为该数值。操作前应核对界面中的实际含义。
此外,扩容前建议备份 OpenWrt 配置,并确认备份文件已经下载到电脑或其他安全位置。
4.2 确认 PVE 扩容是否生效
重新登录 OpenWrt,执行:
cat /sys/class/block/sda/size
cat /proc/partitions
df -h扩容后的结果:
8388608对应 /dev/sda 的容量约为 4 GiB。
但此时分区和 Overlay 仍然没有扩大:
sda 4194304
sda1 16384
sda2 106496df -h 仍显示 /overlay 只有约 87MB。
这属于正常现象。
扩容虚拟磁盘,只是增加了虚拟硬盘的总容量;OpenWrt 的分区表和文件系统不会因此自动变大。
接下来还需要扩展分区和文件系统。
五、解决方案:使用 OpenWrt 官方脚本扩展根分区和 Overlay
OpenWrt 官方提供了针对 x86 平台的根分区和文件系统扩容指南,支持 SquashFS 和 ext4 镜像。
参考:OpenWrt 官方文档:Expanding root partition and filesystem
对于 OpenWrt 25.12 及更新版本,官方指南使用 APK 管理软件包。
5.1 先备份配置
执行:
sysupgrade -b /tmp/openwrt-backup.tar.gz
ls -lh /tmp/openwrt-backup.tar.gz通过 WinSCP 将备份下载到电脑保存。
如果已经有可用的配置备份,也要确认它确实保存在虚拟机之外。
5.2 安装扩容工具
执行:
apk update
apk add parted losetup resize2fs blkid这些工具分别用于分区调整、Loop 设备管理、ext4 文件系统扩展,以及块设备信息识别。
在我的实际操作中,扩容工具安装成功了,但安装过程中仍出现了 Sing-Box 的空间不足报错。这是之前未完成的 Sing-Box 安装尝试带来的干扰信息。
因此,遇到类似输出时,不要只看最后一行;应确认具体哪些软件包已经安装成功。
可以执行:
command -v parted
command -v losetup
command -v resize2fs
command -v blkid逐一确认工具是否存在。
5.3 下载官方扩容脚本
在确认网络连接正常、/tmp 空间充足后,执行:
cd /tmp
wget -U "" -O expand-root.sh \
"https://openwrt.org/_export/code/docs/guide-user/advanced/expand_root?codeblock=3"检查文件:
ls -lh /tmp/expand-root.sh
head -n 10 /tmp/expand-root.sh如果下载失败,或者文件内容是网页错误提示,不要继续执行。
5.4 加载脚本并生成扩容配置
执行:
cd /tmp
. ./expand-root.sh根据官方指南,这一步会生成以下配置脚本:
/etc/uci-defaults/70-rootpt-resize
/etc/uci-defaults/80-rootfs-resize其中,前者负责调整根分区,后者负责扩展根文件系统。
检查文件是否存在:
ls -l /etc/uci-defaults/70-rootpt-resize
ls -l /etc/uci-defaults/80-rootfs-resize两个文件都存在后,再继续操作。
5.5 执行扩容
运行:
sh /etc/uci-defaults/70-rootpt-resize根据官方流程,这一步会调整分区并触发重启;随后系统继续扩展文件系统,再次重启。
操作期间应保持 PVE 控制台可用,不要强制关闭虚拟机。
重要提醒:不要跳过备份,也不要将上述命令直接套用到布局不同的系统。 OpenWrt 官方文档特别提醒,NVMe 设备存在相关已知问题,不应盲目使用这套流程。本文实测环境使用的是 /dev/sda,并非 NVMe 设备。
六、验证结果:Overlay 从 87MB 扩大到 3.7GB
完成扩容后,重新执行:
df -h得到的结果如下:
Filesystem Size Used Available Use% Mounted on
/dev/root 5.3M 5.3M 0 100% /rom
tmpfs 1006.2M 216.0K 1006.0M 0% /tmp
/dev/loop0 3.7G 69.1M 3.5G 2% /overlay
overlayfs:/overlay 3.7G 69.1M 3.5G 2% /
/dev/sda1 15.7M 5.5M 9.9M 36% /boot再查看分区:
cat /proc/partitions关键结果:
loop0 4172096
sda 4194304
sda1 16384
sda2 4177408这说明:
虚拟磁盘总容量约为 4 GiB。
第二分区已经扩展到约 4 GiB。
Overlay 文件系统容量达到约 3.7 GiB。
Overlay 可用空间达到约 3.5 GiB。
扩容成功后,原先只有约 12.6MB 的可写空间问题得到解决。
需要说明的是,文件系统显示的容量和虚拟磁盘标称容量之间存在差异,属于正常现象,原因包括分区、只读系统内容、文件系统元数据及其他空间开销。
七、回到最初的问题:Sing-Box 是否已经安装成功?
磁盘扩容后,下一步应该重新安装 Sing-Box。
执行:
apk add sing-box然后检查:
sing-box version
apk info -e sing-box
df -h如果安装成功,sing-box version 应输出版本信息,apk info -e sing-box 应显示已安装的软件包。
需要特别说明:截至本文记录的最后一次验证,已经确认 Overlay 扩容成功,但尚未获得扩容后重新安装 Sing-Box 的最终结果。因此,不能将“扩容后 Sing-Box 已成功安装”写成已经验证的事实。
八、PassWall2、Xray 和 Sing-Box 应该如何选择?
这次排障还涉及 PassWall2 管理界面和代理核心的安装。
PassWall2 是代理管理插件,Xray 和 Sing-Box 则是不同的代理核心。安装管理界面并不意味着代理核心也已安装完成。
本次环境中:
PassWall2 管理界面已经安装成功。
Xray 核心已经安装成功。
Sing-Box 最初因空间不足而安装失败。
扩容后,Overlay 已有约 3.5GB 可用空间。
实际上,PassWall2 并不要求必须同时安装 Xray 和 Sing-Box。如果你的节点协议和功能需求能够由 Xray 满足,可以先用 Xray 配置运行;只有确实需要 Sing-Box 支持的协议或功能时,才需要安装它。
另外,安装第三方 LuCI 插件时,应注意软件包与 OpenWrt 版本、架构是否匹配,并验证软件包签名。遇到 UNTRUSTED signature 等提示时,不要为了安装成功就随意跳过签名验证。
九、这次排障总结出的几个经验
经验一:先看文件系统,再判断网络问题
下载失败、安装失败和磁盘空间不足可能产生相似的表象。
最简单的第一步就是:
df -h如果 /tmp 空间充足,但 /overlay 已经接近满载,就应该优先检查可写文件系统。
经验二:PVE 扩容与 OpenWrt 扩容是两件事
虚拟机管理平台扩大的是虚拟磁盘容量。
操作系统内部还需要调整分区和文件系统,才能真正使用新增空间。
经验三:不要轻易格式化系统分区
/dev/sda2 不只是一个普通的数据盘分区。在本文的 SquashFS 镜像布局中,它包含根文件系统相关数据。
错误地格式化或重建分区可能导致系统无法启动。
经验四:不要把所有问题都归结为软件源
遇到安装失败时,应依次检查:
软件源是否正常。
软件包及其依赖是否匹配当前系统。
软件包签名是否可信。
可写文件系统是否有足够空间。
是否存在下载不完整或先前安装留下的状态。
只有逐项排查,才能减少重复尝试和误操作。
经验五:扩容之前先备份
网络配置、DHCP、防火墙、PassWall2 配置以及系统软件状态,都可能影响后续恢复。
即使是虚拟机,也不应因为操作方便而忽略备份。条件允许时,可以在 PVE 中额外创建一致性良好的虚拟机备份或快照,但不要将快照当作唯一备份。
十、结语
这次问题的根源,并不是 Sing-Box 本身,也不是 /tmp 空间不足,而是 OpenWrt 的可写 Overlay 文件系统容量过小。
整个解决过程可以概括为:
检查文件系统 → 确认虚拟磁盘和分区布局 → 在 PVE 扩大虚拟磁盘 → 使用 OpenWrt 官方脚本扩展分区和文件系统 → 验证容量变化 → 重新安装软件。
最终,虚拟磁盘从 1 GiB 扩大到 4 GiB,Overlay 从约 87MB 增加到 3.7GB,剩余可用空间约 3.5GB。
对于在 PVE 中运行 OpenWrt、并准备安装较多扩展插件的用户来说,这次经历也提醒我们:在安装软件之前,先确认系统的存储布局和可写空间,往往比反复重试更有效。
参考资料:
本文基于一次实际的 OpenWrt 25.12.5、PVE、QEMU x86 虚拟机排障过程整理。不同镜像、分区方式和硬盘类型可能需要不同的处理步骤,请在操作前核对自己的环境并做好备份。
评论