[日记] 记录一下我升级 ImmortalWrt 25 折腾的过程 | 硬盘损坏 | 网络不通 | OpenWRT |

Shikanoko 2026-06-17 02:40 1

今天我手贱不小心手动 sysupgrade 了我的 ImmortalWrt 24 ,把它 upgrade 成 25 ……

重点是我是手动 upgrade 的,ImmortalWrt 不会帮我自动安装任何我在之前安装好的软件包!


一开始我真的超级慌的(因为这样家里云 down time 又要加好多……),然后肯定一大堆东西又要手动配置,超麻烦……

但由于我的 ImmortalWrt 是用 qemu 装在我 All-in-One 小主机上的,所以整体配置下来又省去了很多麻烦🤔️。


观前提示:我下面会把 ImmortalWrt 与 OpenWRT 两个名称混用,因为对我来说这俩是一个东西




1. 硬盘问题


但其实配置的东西总的来说不算多,但麻烦的点是我 ImmortalWrt 升级之后硬盘出了亿点小小的问题。

一开始我登入 ImmortalWrt 后台检查战损(?),看了一圈,其实都还好,除了 DNS 没配置以外这个状态下的网络是通的。

因为我 DNS 服务是用的 podman + dnsproxy 嘛,然后我就去软件包里面下。临时配置了明文 DNS ,点击软件包,开始下载 podman ,下载完以后发现默认 tmpfs 的 overlay 配置的 300M 全部给干光了… 只剩可怜的 8M 给其他软件包(

我总不可能只装 podman 其他都不装了吧?所以我就开始研究 overlay 扩容。


我的硬盘分区大概是这样的:


NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0    2G  0 disk 
├─sda1   8:1    0   32M  0 part /mnt/sda1
│                               /boot
│                               /boot
└─sda2   8:2    0  300M  0 part /rom
vda    254:0    0   32G  0 disk 
├─vda1 254:1    0   16G  0 part /opt
└─vda2 254:2    0   16G  0 part /tmp/lib/containers/storage/overlay
                                /tmp/lib/containers

sda 就是原来 openwrt.img 内置的存储(当时为了扩容 overlay 给它 +1G 了来着),而 vda 是我另外给 OpenWRT 用来装 podman 容器或外置存储的。




1.1 opt 之殇


在这期间,我又去检查其他分区有没有挂载好(ADHD 是这样的),此时我发现了一个蛮致命的问题—— /opt 没有挂载!

因为 /overlay 扩容对我来说还算简单,就先急着去弄 /opt 的事了。

/opt 一般是我用来存储脚本、容器数据的地方,所以这部分数据相较 /overlay 来说重要很多,但它没有挂载属实是不知道怎么回事。

所以我就尝试手动挂载:

mount -t ext4 /dev/vda1 /opt

一顿操作猛如虎,一看,没挂载上……

看看系统日志:

dmesg | tail -20

发现似乎是块数量对不上🤔️?


[  558.891267] EXT4-fs (vda1): bad geometry: block count 8388352 exceeds size of device (4194304 blocks)

然后我想起来,我以前是直接拿一整个 vda 挂载到 /opt 的,后来因为要持久化 podman [ image | storage ] 之类的,就把 vda 劈成两半,前面一半给 /opt 后面一半给 /var/lib/containers,然后报错的块大小也对得上,刚好是一半。

忘记当时怎么分区的了,总之就是问 AI 想办法恢复起来,但 AI 给的回答越来越离谱,越来越看不懂……最后它告诉我,啊数据好像是救不回来了(大概是这么说)。我特么

后面我想到,我宿主机上是不是有备份来着🤔️,然后我就直接从宿主机备份上导出了。


# 关机 & 挂载硬盘
sudo virsh stop openwrt
sudo modprobe nbd
sudo qemu-nbd -c /dev/nbd0 /opt/immortalwrt/opt.qcow2
sudo mount /dev/nbd0p1 /mnt/backup

# 拷贝
sudo mkdir /opt/immorwalwrt/opt.backup
sudo cp -r /mnt/backup /opt/immortalwrt/opt.backup

# 开机
sudo umount /mnt/backup
sudo qemu-nbd -d /dev/nbd
sudo virsh start openwrt

# 导入
ssh [email protected] '
mkfs.ext4 -y /dev/vda1 &&
mount -t ext4 /dev/vda1 /opt'

scp -r /opt/immortalwrt/opt.backup/* [email protected]:/opt
ssh [email protected] apk add openssh-sftp-server # 忘记安装 sftp
scp -r /opt/immortalwrt/opt.backup/* [email protected]:/opt

总之,花了九牛二虎之力终于是把 /opt 给修好了……




1.2 /overlay 扩容


解决完 /opt 了,还得回头看 /overlay 容量不足的问题啊。

我之前是直接给 immortalwrt.img +1G 另外分了一个 sda3 来当 overlay 来着,但不知怎么,升级后 sda3 不见了(?),我猜也许是升级的时候给覆盖了?没办法只能另外添加硬盘给 overlay 了 :(


sudo qemu-img create -f qcow2 /opt/immortalwrt/overlay.qcow2 2G # overlay 给 2G 差不多够用了
sudo virsh edit openwrt
# 添加以下代码:
# <disk type='file' device='disk'>
#  <driver name='qemu' type='qcow2'/>
#  <source file='/opt/immortalwrt/overlay.qcow2'/>
#  <target dev='vdb' bus='virtio'/>
# </disk>
sudo virsh shutdown openwrt && sudo virsh start openwrt
ssh [email protected] fdisk /dev/vdb # n g [Enter] [Enter] w

# 创建分区 & 拷贝 overlay & 添加 fstab
UUID=$(ssh [email protected] lsblk -f | awk '/vdb1 / {print $3}')
ssh [email protected] "
mkfs.ext4 /dev/vdb1 &&

mkdir -p /mnt/vdb1 &&
mount -t ext4 /dev/vdb1 /mnt/vdb1 &&
scp -r /overlay/* /mnt/vdb1 &&
umount /mnt/vdb1 &&

uci add fstab mount # =cfg054d78 &&
uci set fstab.@mount[-1].enabled=\"1\" &&
uci set fstab.@mount[-1].uuid=\"${UUID}\" &&
uci set fstab.@mount[-1].target=\"/overlay\" &&
uci commit &&

/etc/init.d/fstab restart
"


简简单单搞定~


至此,也是完全搞定了 OpenWRT 硬盘挂载的问题!(真实辛苦我自己了)




2. 网络问题


软路由最终还是要用来上网的嘛,所以还得解决一下下网络




2.1 podman 与 DNS


前面说到过,我的 DNS 用的是 podman + dnsproxy 。

podman 储存应该是没什么问题的,毕竟我有单独给 /var/lib/containers 做分区。


# 自 OpenWRT 25.12 起,包管理器从 opkg 切换为 Alpine 同款的 apk
$ apk add podman
...
$ /etc/init.d/dnsproxy start # procd 管理的 podman 守护进程
$ podman ps
CONTAINER ID  IMAGE                              COMMAND               CREATED            STATUS            PORTS       NAMES

efbc4bc9f795  docker.io/adguard/dnsproxy:latest  --listen 127.0.0....  About an hour ago  Up About an hour              dnsproxy
$ dig A google.com @127.0.0.53 +short
-ash: dig: not found
$ apk add bind-tools
...
$ dig A google.com @127.0.0.53 +short
142.251.45.142

完美~

然后再改一下 dnsmasq DNS 转发设置就好


为什么要使用 dnsproxy?

因为众所周知的原因,国内的网络很多会对 DNS 进行污染,如果我的域名被运营商污染了可就不好了,加之也不想漏自己域名解析给国内 DNS 提供商,所以我用 Cloudflare 自建 DNS 服务器 + EDNS0 Subnet 来绕过上述问题并且还能有准确的 DNS 响应,而这正是 dnsproxy 能轻松办到的。




2.2 tailscale 与 luci-app-nikki


因为我是重度外网用户,一天不上外网浑身难受的那种,所以作为身处墙内的我,翻墙用的 OpenWRT 插件就必不可少了我可不想每台设备都配置一遍VPN


# 安装 nikki feed
wget -O - https://github.com/nikkinikki-org/OpenWrt-nikki/raw/refs/heads/main/feed.sh | ash

# 安装 nikki
apk add nikki
apk add luci-app-nikki
apk add luci-i18n-nikki-zh-cn

安装成功!

安装完成之后理应按照我之前保存在路由器上的配置文件启动 mihomo 才對,但不知怎的,一直显示未运行。

一看内核日志,喔,明了,原来是下载 GeoASN 下半天(而且还下载失败)。

手动改一下 GeoASN 获取链接好了。

改完等了一阵子,终于是启动成功了!至此我终于可以软路由上网了!!

我一度以为现在这种情况就已经恢复的差不多,直到我尝试恢复 tailscale ……




我家 OpenWRT 软路由除了上公网,还有上内网的需求(没错,就是上内网)。

我一般会在 OpenWRT 上安装 Tailscale 然后让 LAN <===> Tailscale 互联并开启 masque ,所以这又成了网络复杂度提高的一环。话说好久没有玩异环了


apk add tailscale
tailscale up
tailscale set --accept-dns=false

安装完了,测试从 LAN 测 ping tailnet ,ok 是通的。


这时候我回头去检查 luci-app-nikki 。

本来升级之前我是在玩 luci-app-nikki 的 TUN 模式来着,但由于 TUN 模式性能不是很好,所以我想把它改回 TProxy 模式,就在这时,出错了!

我发现改到 TProxy 之后 LAN 测网络就不通了!然后我疯狂测试,疯狂修改配置,不断重启,发现不论是 TProxy 还是 Redirect 甚至是刚才明明好了的 TUN 都不通!

此时折腾到现在已经过了差不多两个多小时

没办法,只能问 AI ……




我把 nft ruleset 贴给他,他说了一大堆叽里咕噜的也听不太懂…

但我回想 luci-app-nikki 出事前做过的改动是什么🤔️,安装 tailscale 啊!

然后我 tailscale down && apk del tailscale 把 tailscale 删了之后,

TUN 就好了…

TUN 就 好 了 啊 ……!!

但此时 TProxy 似乎还没好,变成是 IPv4 不通但 IPv6 通……

我总不能用 IPv6-Only 的网络吧……

所以我继续测试,继续问 AI ,继续改配置。

嘿,您猜怎么着。最后重启一下系统,它自己就好了嘿!此时的自己已疯




3. 其他一些设置


然后我开始把 natmap ddns 什么的装回来,这倒没有到太复杂,就


apk add natmap
apk add luci-app-natmap
apk add luci-i18n-natmap-zh-cn

搞定了。

然后还得检查一下 natmap reload 脚本,DDNS 脚本什么的。

测试一下发现确实没啥要改的,就不动它了。




4. 后记


总之经过了三小时的折腾加上两小时写这篇日记,终于,终于是弄好了(不容易啊😭️)!

下次再也不乱升级系统了……


用到的软件包:



  • podman

  • luci-app-nikki

  • luci-app-natmap

  • mihomo-meta

最新回复 (13)
  • Residual 06-17 02:46
    1

    我选择 istores


    adg+mosdms+openclash+zerotier

    ^-^

  • Yukimeepo 06-17 03:22
    2

    @Residual #1 一样。 ^-^

  • Residual 06-17 03:23
    3

    @Yukimeepo #2

    ^-^

  • nxygen 06-17 03:33
    4

    换成pve吧,就算aio也不容易一起炸,除非硬件问题

  • Shikanoko 楼主 06-17 04:06
    5

    @nxygen #4 PvE 没这个需求啊,我只有 OpenWRT 是虚拟机来着,其他的服务都用的是 Docker 容器 ^-^

  • 赛博焊工 06-17 04:55
    6

    immortalwrt不是自带个值守式升级吗,我也是前两天升级的,几乎无感

  • 巨龙v 06-17 04:57
    7

    @Residual #1 bd

  • Shikanoko 楼主 06-17 07:34
    8

    @赛博焊工 #6 我乱点的……

    从 immortalwrt 构建镜像那里下载了更新包,然后上传上去想看看能不能直接升级,结果点了之后没让我确认就直接开始安装了 ^-^

    我以为至少会警告哪些软件包在新版固件没有……


    这种上传镜像的方式升级不像自带的职守式那样这么方便,不会给你自动安装软件包……

  • Inklazy 06-17 08:21
    9

    pve底层,24.10好久没更新了,就一个nikki插件

    有啥要更新的直接重刷

  • nxygen 06-17 08:36
    10

    @Shikanoko #5

    就是因为要各司其职啊,你看你现在要重装op,很麻烦一堆东西都得迁移,你用上pve想升级哪个部分就可以升级,而且pve自身是针对虚拟化的,自身升级不会有op这么多麻烦事,基本用到包管理器就足够了 ^-^

  • Shikanoko 楼主 06-17 08:41
    11

    @nxygen #10 我寻思也没啥东西要迁移啊,就是把坏掉的硬盘分区修一修完事了 ^-^

    主要是我没用值守式更新,一堆软件包需要重装,所以看起来很麻烦……




    说起来以前我就是用的 PvE 来着,然后开了两个虚拟机,一个 OpenWRT 一个 Debian 用来装 Docker ,我寻思这样还不如就 Debian 宿主机装 Docker + qemu OpenWRT ^-^

    我现在这样的话其实也算是各司其职,qemu OpenWRT 专门做路由,其他服务(网页、API、后端、smb 存储、密码管理器)就放 Docker 容器里

  • nxygen 06-17 08:59
    12

    @Shikanoko #11

    行,按个人喜好来吧 ^-^

  • lehuoyisheng 06-17 10:00
    13

    学习

* 帖子来源NodeSeek
返回