Openwrt 更新 x86_64 固件常见问题记录

1.overlay 分区挂载不上,总被/dev/loop0 占用

每次更新固件版本以后,删掉 sdcard/etc 目录里的文件,然后重启路由器。

https://www.right.com.cn/forum/thread-4058097-1-1.html

备注:建议检查文件,如果/etc/为空,则可以删除,如果有内容还得检查是否需要备份。

建议用 uuid 去挂载,没必要用设备号挂载,因为升级设备之后这个挂在项还会丢失,除非用的网页 web 升级并选择保留配置。

如果没有 sdcard/etc 目录,也可以用更简单的方法挂载,直接修改 /etc/rc.local 在开机启动时挂载:

mount /dev/sda3 /overlay

写入完毕后,重启 reboot,以后每次升级固件也都自动挂载好了。

2.更新系统采用 web 更新和 dd 更新区别

web 更新时,可以选择不保留配置,配置都在 overlay 中,所以不影响。

web 更新

web 更新后会重复挂载一个分区 ,但使用并不影响。

/dev/sda1 => /boot

dd 方案

介绍下默认 dd 后的分区:

分区 作用 /dev/sda1 boot 分区 /dev/sda2 rom 分区 /dev/sda3 overlay 分区(需要自己新建分区,默认不存在)

写入镜像

采用上传文件到 /tmp/upload 目录

dd if=ddd.img of=/dev/sda

也可以更新,不会导致重复挂载。

无论哪种更新方式,都必须选择同一种固件类型,比如旧版本使用不带 efi 标志的,更新版本也不要选择带 efi 标志的,否则会导致分区有问题,存在数据丢失风险。建议选择 efi 格式固件

删除存在的 etc

更新完毕后,进入系统,应该默认会挂载 /dev/sda3 到 /mnt/sda3 这个位置,删除 /mnt/sda3/etc 目录。(可以检查是否存在文件考虑备份,一般没有)然后在挂载点,新增挂载点 /dev/sda3 到 /overlay,删除失效挂载,重启进入系统即可使用。

格式化 overlay

如果是更新系统,存在旧数据在这个分区里,就不要格式化了,只需要把分区建出来就行了,直接可以挂载。

mkfs.ext4 /dev/sda3

3.恢复数据

恢复数据前提是需要自己备份数据

你通过 web 网页中 【备份升级 - 备份/恢复 - 生成备份】下载备份包,这里面包包含两个目录。

你可以手动备份这两个目录,如果是别的目录位置文件,自行备份。

/etc
/usr/share

首先得把 overlay 挂载好,然后再从网页中【备份升级 - 上传备份存档以恢复配置】恢复数据,恢复完数据这个挂载点可能又没了,你又得重新挂载。

重新挂载完毕后,你得确认数据是否还在,如果不在或者不完整,建议使用以下方案。

挂载 overlay 对应分区

如果你是 dd 刷机的,建议你把对应的磁盘重新分区好,如果有数据就不要格式化。

临时命令直接挂载,或者在网页"挂载点"进行挂载

mount /dev/sda3 /mnt/sda3

恢复数据

直接把备份的包传到服务器,解压后,覆盖到 overlay 中配置的位置。

mkdir /mnt/sda3/test && cd /mnt/sda3/test
wget http://你本机 IP/backup-OpenWrt-2022-02-03.tar.gz
tar -xzf backup-OpenWrt-2022-02-03.tar.gz
cp -rf /mnt/sda3/test/etc/* /mnt/sda3/upper/etc/

usr/share 里面的数据我不要,所以不恢复。

覆盖完毕后,在网页端【挂载点】重新挂载 overlay,重启系统

/dev/sda3 => /overlay

开机后查看挂载点是否正常,如果没挂载上,再次把 overlay 挂载,再重启直到挂载上数据就都有了。

千万不要直接覆盖 /etc 因为是 overlayfs 文件系统有一些权限绑定关系,他有自己的一套机制,你只需要把数据写到 /overlay 磁盘里,然后重启让文件系统自己去加载。

4.luci 密码错误

版本跨度太大,luci 密码错误,ssh 却可以连,通过这个修正。

uci set rpcd.@rpcd[0].socket='/var/run/ubus/ubus.sock'
uci commit rpcd
/etc/init.d/rpcd restart

5.dd 刷机失败

先说正确结论:必须使用 dd if=xxx.img of=/dev/sda 的形式进行刷机,否则会有各种各样的问题。

以下为踩坑记录(此过程的目的是想实现一个 U 盘即可重新刷机,而不需要用网线或者第二个 U 盘):

  1. refus 刷固件 img 文件到 u 盘,opewnrt 启动正常,当使用 dd if=/dev/sdb(sdb 是 U 盘) of=/dev/sda 后开机 usb 接口识别失败,卡住无法开机,此时插入原来的 U 盘,立马可以开机。

  2. 同上,通过 dd 把/dev/sdb 磁盘 0-有效分区结束 end 写到文件进行验证,md5sum 计算的和 windows 原始文件不一致,不知道是不是 refus 写入到分区时做了改变。

  3. refus 把这个镜像写入到 U 盘之后,不能再新建分区存放其他文件,然后进系统进行 dd img 到硬盘,只要新建了分区,就会无法识别原始的 openwrt 引导分区,卡在 grub 页面,手动也不能引导。

  4. 以上方案军不可行!!!老老实实用 第二个 U 盘挂载,或者用网线插 LAN 口,用电脑 winscp 或者 webui 的 luci 上传你的固件到/tmp/upload ,然后 dd 刷机就可以。一次过!

还有个猜想,未验证:用 linux dd img 到 u 盘,假设镜像分区只占前 180M,那么 U 盘有 128G,就可以从之后任意磁盘块开始写入 img 数据到 u 盘(dd seek=跳过大小),然后引导成功后再吧对应区块的 img 数据读出来(dd skip=读取跳过大小),再 dd 到磁盘就可以。

6. n2600 x86-64 固件编译成功无法开机

能够成功编译,但是不能开机。开机卡在错误代码:ehci-pci: irq 23, io mem 0xdff05000

最终提 issues 询问,得到答案发现是已经不再支持 n2600,我的这个老古董没法继续玩下去了,只能使用 2022 年的版本了。

/coolsnowwolf/lede/issues/11439

已经测试过:

  • 官方 openwrt 源也不支持 n2600

  • https://github.com/immortalwrt/immortalwrt 源也不支持 n2600

7. 光猫桥接,openwrt 子路由 无法链接到光猫路由页面

解决方案:

新建接口,如名为:WAN_DHCP

协议:DHCP 客户端

使用默认网关:去掉这个勾勾

物理接口:选择 WAN 同在的接口

防火墙: 默认不指定就行

Comments