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 中调整磁盘容量

操作步骤如下:

  1. 正常关闭 OpenWrt 虚拟机。

  2. 在 PVE 管理界面选中对应虚拟机。

  3. 进入“硬件(Hardware)”。

  4. 选中现有虚拟硬盘。

  5. 点击“调整大小(Resize disk)”。

  6. 增加 3 GiB,使总容量达到约 4 GiB。

  7. 启动 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       106496

df -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 镜像布局中,它包含根文件系统相关数据。

错误地格式化或重建分区可能导致系统无法启动。

经验四:不要把所有问题都归结为软件源

遇到安装失败时,应依次检查:

  1. 软件源是否正常。

  2. 软件包及其依赖是否匹配当前系统。

  3. 软件包签名是否可信。

  4. 可写文件系统是否有足够空间。

  5. 是否存在下载不完整或先前安装留下的状态。

只有逐项排查,才能减少重复尝试和误操作。

经验五:扩容之前先备份

网络配置、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 虚拟机排障过程整理。不同镜像、分区方式和硬盘类型可能需要不同的处理步骤,请在操作前核对自己的环境并做好备份。

评论

此博客中的热门博文

nvidia-smi命令在windows上打不开

在 PVE 上安装 OpenWRT

Ubuntu关闭防火墙