今天我手贱不小心手动 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
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
sudo virsh edit openwrt
sudo virsh shutdown openwrt && sudo virsh start openwrt
ssh [email protected] fdisk /dev/vdb
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