重置 LXC 安装的 OpenWrt

之前 在 PVE 用 LXC 安装 OpenWrt 后出问题需要 Factory Reset,但普通的 jffs2reset 会提示 MTD partition 'rootfs_data' not found 而无法工作。

刷写 LVM 磁盘的方式和更新一样 Upgrading rootfs partition | [OpenWrt Wiki] OpenWrt on x86 hardware (PC / VM / server),不过这次改成了直接从互联网下载 rootfs 解压。

不过非特权容器注意需要设置 uid,才能避免映射到容器后的访问权限问题,一般是 100000。
不过 tar 不支持在解压时设置 uid,但 cpio 可以

On PVE Host
# mount rootfs partition
mkdir /mnt/rootfs
mount -v /dev/pve/vm-104-disk-0 /mnt/rootfs
cd /mnt/rootfs
# delete all files on the partition
rm -rf *
# uncompress rootfs.tar.gz on the fly
wget -O- https://downloads.openwrt.org/releases/24.10.4/targets/x86/64/openwrt-24.10.4-x86-64-rootfs.tar.gz | gunzip | cpio -iv --owner=+100000:+100000
# unmount to free disk
cd / && umount /mnt/rootfs && rmdir /mnt/rootfs

LXC 安装的 OpenWrt 在安装 dnsmasq-full 后无法启动 dnsmasq

在调整 DHCPv6 设置时,用 opkg install --force dnsmasq-full 安装了 dnsmasq-full 版本,然后就近似断网了 😓
/etc/init.d/dnsmasq start 再也起不来,日志中有这样的内容。

Mon Oct 27 20:03:07 2025 user.err : jail: failed to clone/fork: Operation not permitted
Mon Oct 27 20:03:58 2025 user.err : jail: failed to mount /dev/log /tmp/ujail-DLLpfI/dev/log: Permission denied
Mon Oct 27 20:03:58 2025 user.err : jail: mount_all() failed
Mon Oct 27 20:03:58 2025 user.err : jail: failed to build jail fs
Mon Oct 27 20:03:58 2025 daemon.info procd: Instance dnsmasq::cfg01411c s in a crash loop 11 crashes, 0 seconds since last crash
Mon Oct 27 20:03:59 2025 daemon.err procd: Got unexpected signal 1

但手动按 /etc/init.d/dnsmasq info 的命令行来启动是正常的,说明并不是配置问题。

一查还真有遇到类似问题的,搜索关键字挺难定位的

看起来和 LXC 虚拟化设置有关,在启用 keyctl 和 nested 之后又有这个错误:

Mon Oct 27 20:19:09 2025 daemon.crit dnsmasq[1]: failed to seed the random number generator: No such file or directory
Mon Oct 27 20:19:09 2025 daemon.crit dnsmasq[1]: FAILED to start up

其实 Issue 里说的没错,OpenWrt 新引入的 procd jail 机制,在 LXD 打包的镜像中是做了 特殊后处理 的。这也是为什么我在 重置 LXC 安装的 OpenWrt 后才遇到这问题,因为这次重装用的是官方未修改版的镜像。
要修正也容易,把后处理做一遍就行

# Disable process isolation to make dnsmasq work
sed -i 's/procd_add_jail/: \0/g' /etc/init.d/dnsmasq
# Disable conflicting sysntpd service to avoid crash loop
rm -f /etc/rc.d/*sysntpd

opkg 批量更新

为了稳定性不建议批量更新,所以直接没提供这个功能。但我就是要

opkg list-upgradable | cut -d' ' -f1 | xargs opkg upgrade