openwrt系统错误恢复的折腾历程
问题描述
使用矿渣路由硬件,刷入openwrt操作系统;然后在进行软件安装和配置的过程中因为各种原因导致系统不工作,重启后无法进入正常系统。
问题分析
首先可以确认该问题是单纯的软件问题,硬件不存在任何的损坏(不存在任何影响系统运行的损坏);其次可以确认该问题只是无法进入正常的系统,启动引导程序,安全恢复程序是否可以进入并不能确定;最后采用何种硬件中断才能让引导程序陷入非正常操作系统的方式读者暂时没有掌握。
问题解决
基于上述问题分析的结果,作者推荐采用逆向解题思路,首先应该明确如何人为施加硬件中断,打断引导程序直接去正常操作系统的存储扇区加载init进程。
硬件中断的方法
1、把电脑的IP地址设为:192.168.1.2,子网掩码:255.255.255.0,网线接入路由器的任意一个LAN口;
2、windows下使用附件 recvudp-win32.zip (507.88 KB) 程序;[Linux(MacOS)下,使用如下命令:sudo tcpdump -Ani eth0 port 4919 and udp]
3、插拔一下路由器的电源
4、当附件程序或Linux命令返回 Please press button 字样时,按下reset键
5、使用ssh登入路由器ssh root@192.168.1.1
(不需要密码)
除了上述标准步骤外,一般openwrt操作系统的打包者会提供各式各样的纯硬件中断,在这里笔者举个例子Powered by LuCI Master (git-21.188.53404-317d4ad) / OpenWrt R21.7.1.100
该系统,可在断电情况下,将lan1网口与电脑网口连接,按住reset键然后通电,此时持续按住reset直至路由器led出现跑马灯效果;也可以进入failsafe mode。其他各式各样的硬件中断方式可以根据自己的路由器型号和系统版本号在互联网上搜索,但是别报太大希望。
进入失败安全恢复系统(failsafe)
如果经过一番努力之后,读者成功的进入了安全恢复系统,那么这是一件值得高兴的事情,因为在这里你可以执行绝大多数的恢复任务。例如笔者是误删除了一份动态链接文件,那只需要利用安全恢复系统(readonly)中的命令,访问/tmp目录(该目录是笔者发现的唯一被允许同时在安全恢复系统和正常操作系统间访问的共享目录)。将缺失的共享文件cp到/tmp目录,之后通过mount_root
命令进入操作系统,在操作系统中重定义动态链接目录为/tmp即可。
1.进入failsafe模式:cp -r /lib/* /tmp && cp -r /usr/lib/* /tmp
(虽然squash是只读文件系统,但是/tmp
下面挂载的是另外一个文件系统tmpfs
,它是可以写的)
2.mount_root
:挂载jffs2文件系统(此时原来的/lib目录已经没有了, 被我自己弄坏了)
3.:export LD_LIBRARY_PATH=/tmp
此时下面有了所有的动态链接文件,此时可以执行cp命令了,接下来挽回:cp -r /tmp/* /lib
将动态链接文件复制到原来的地方。
当然如果你完全不了解Linux的命令,并且也没有任何想要学习的想法,你也可以尝试在安全模式下刷机。先将bin文件拷贝到/tmp目录,在使用sysupgrade进行刷机。
笔者不建议这样做,谁知道这会会不会导致failsafe本身被覆盖呢?不过如果实在没办法了就试一下吧。
scp /path/to/your/openwrt_system_file_name.bin root@192.168.1.1:/tmp/
sysupgrade /tmp/openwrt.bin
未进入安全恢复系统
如果因为种种原因你没能进入failsafe mode,也不用担心,openwrt官网为你准备了如下解决方案:
openwrt特别救援方案:https://openwrt.org/docs/guide-user/troubleshooting/vendor_specific_rescue
结论
以上,在问题解决步骤主要分为两大步;第一步是硬件中断进入failsafe system的方式,第二步是在failsafe system中进行救援操作。
这两步中的任意一个步骤都需要耐心仔细寻找和您的设备自适应的方式。本文主要介绍思路而不确保在任意设备任意系统均有效。
参考文章
openwrt 无法找到共享库libgcc_s.so.1
Openwrt一条命令把整个路由器搞蹦了
openwrt 进入failsafe模式
重置 OpenWrt 设置和进入安全模式(Failsafe Mode)