实践过程
前几天晚上,宿舍路由器莫名的掉线了,无法认证校园网,每次联网都提示需要进行身份验证。
登陆路由后台后,发现“xxxxclient没有运行”的提示。一开始我还以为是路由器的校园网身份验证插件坏了,于是将路由器恢复了出厂配置。
接着让我预想不到的事情发生了,路由器的校园网认证工具在初始化设置后不见了!不见了!不见了!不!见!了!
查看路由器系统的信息发现,路由器刷入的是openwrt系统,于是,我通过百度“xxxxclient openwrt”后发现,可以通过离线安装ipk将认证插件重新安装回系统中,于是作死之旅开始。。。
我在github上找到了xxxxclient的源码,然而,作者没有将xxxxclient编译成ipk发布在github上,这应该也是出于openwrt的ipk需要单独针对路由器CPU架构进行编译的缘故。如果将每种CPU型号对应的的ipk都编译好,也是一个比较麻烦的事情。
于是,我开启了自行编译ipk的坑,首先是编译环境,ipk的编译需要在linux环境下进行,而我的电脑是win10的,显然不满足要求。一开始我想过通过VM虚拟机安装一个ubuntu,毕竟我对ubuntu比较熟悉一些,实验室跑深度学习的机器就是ubuntu的。
通过ubuntu官网,我了解到ubuntu已经出了WSL版本,可以在win自带的虚拟机上运行,于是果断选择了WSL版本的,这个版本的ubuntu貌似是没有图形用户界面的,安装文件大约在500M左右。
然而,问题又来了,安装完成后,打开ubuntu后被提示“0x8007019e”错误,通过搜索,终于找到了问题根源是我的windows系统虚拟机没开,按照方法:打开控制面板》程序》开启或关闭windows系统功能》勾选“适用于Linux的Windows子系统”》重启;我终于成功进入了ubuntu系统。[1]
接着,就是按照“xxxxclient”github说明页中的方法,先下载并解压openwrt官方提供的编译工具,然后将xxxxclient的Makefile文件复制到package/xxxxclient目录下(xxxxclient文件夹需要自己创建)。[2]使用windows的linux虚拟机的好处就是可以直接在windows资源管理器下操作,免去出入代码的步骤,ubuntu的文件放在
C:\Users\windows用户名\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_代码串\LocalState\rootfs
路径下。当然,这里给一个找ubuntu文件地址的快速方法,就是可以通过在ubuntu环境中创建一份独特命名的文件夹,比如“whereisubuntu”,然后在everything中搜索这个文件夹,就可以快速定位ubuntu的路径了。
接着,只需要运行编译命令,即可开始ipk的编译过程。
make defconfig
make package/xxxxclient/compile V=s
然而,在实际编译过程中又遇到了问题了,由于学校网络会时常出现访问不了github的情况,而xxxxclient编译时,需要从github上下载源码,这样,编译时就会出现无法从github中下载源码而终止的情况,为了解决这个问题,我通过编辑Makefile文件中的git地址,将git的地址修改为了国内的github镜像站【hub.fastgit.org】,终于成功的编译出来了ipk。
正当我以为大功告成的时候,在安装ipk时又出现了问题,按照方法,我先利用winscp将ipk文件上传到路由器的tmp目录中(注意连接路由器时使用的是SCP文件协议),然后在tmp目录中运行ipk安装命令
opkg install ipk文件名.ipk
发现提示错误
Packages for *** found, but incompatible with the architectures configured
大概的意思是说我的ipk与当前的openwrt系统不兼容。按照方法,可以对系统的etc\opkg.conf文件进行修改,修改的方法是将ipk的架构添加到opkg.conf文件中,比如ipk的架构是mips_24kc的,就在opkg.conf文件中添加一行
arch mips_24kc 10
其中最后一个数字代表优先级,数字越小优先级越高。
可以先通过运行,一下命令查看目前系统支持的ipk架构。
print-architecture
更多的opkg命令可以参考openwrt的官方使用说明[3],也可以ssh登陆路由器后运行一个错误的opkg命令获得系统的提示说明,比如直接运行opkg而不带参数。
以下操作存在风险,请勿模仿
通过修改opkg,系统没有再提示不兼容,却提示当前安装的文件与libc冲突,于是,我到ipk的编译工具目录下找到了和我编译ipk一样架构的ipk文件,对系统的libc进行覆盖安装,这时候又提示安装的libc与系统的libgcc冲突,嗯,,,当时我以为这两个东西只是普通的系统软件,于是将需要安装的libc同样架构libgcc进行覆盖安装。终于,路由器的openwrt系统在我的“不懈努力”下无法运行了,ssh命令运行提示找不到“libc.so”文件,路由的管理页面也无法访问~~~
---------分割线----------
最后,我只能通过戳路由器的恢复孔将路由器进行恢复了。
这时,不幸又幸运的一幕发生了,我的访问192.168.1.1时,没有出现熟悉的openwrt管理界面,而是进入了breed web界面,这意味着,路由器的openwrt系统没了,幸运的是,我根据我以前给newifi路由刷机的经验,这个界面还可以将路由器的系统重新刷入openwrt[4],于是,我到openwrt官网[5]中找来了路由器适合的固件。然后通过breed重新刷入了openwrt系统。固件的下载页面参考[6],注意,下载时下载的是安装固件而不是升级固件。
在利用ssh重新连接openwrt,发现系统提示远程验证变了,无法连接,这时候通过运行命令[7]
ssh-keygen -R IP地址
例如: ssh-keygen -R 192.168.1.1
对原来的ssh-keygen进行清除,就可以重新利用命令
ssh 用户名@地址
例如:ssh root@192.168.1.1
连接路由器了。
这次连上路由后,我打算先看一下系统的libc是什么架构的,然后再去编译对应的架构ipk进行安装,避免出现一开始的状况。
root@OpenWrt:~# opkg info libc
Package: libc
Version: 1.1.19-2
Depends: libgcc
Status: install hold installed
Essential: yes
Architecture: mips_24kc
Installed-Time: 1605125398
通过opkg info命令得知libc的架构取决于libgcc,且新的openwrt系统中libgcc的架构为mips_24kc,这刚好与我编译的xxxxclient的架构是一样的,我可以不用再去编译新的ipk,而且理论上同样架构应该可以正常的安装了。
果然,上传,运行命令opkg install,成功安装,没有再提示错误!!!!
接着,通过登陆路由web管理后台,将wan网卡的mac地址修改为系统中的地址,将IP的地址和网关也设置为对应的地址,然后根据xxxxclient的使用方法,运行命令
xxxxclient --username 用户名 --password 密码 -i, --iface 网卡名
路由器成功验证校园网,并开启心跳包进行保活。
最后,只需要到路由后台设置一下WIFI,将其依附在lan中就可以让其他设备通过WIFI进行上网了。
这里列举几个xxxclient认证时遇到的错误以及对应的解决方法:
- 反复提示MD5校验后提示UDP端口占用:可能是路由器网线没插好,接触不良,重新插上网线或换个墙上别的网口试试
- IP地址占用:可以试试拔掉路由器电源,1分钟后重新上电,这是3.1版本的xxxxclient已经具备上电重连的功能,稍等片刻可能就可以了
- 别的问题,检查一下路由器的MAC地址以及IP地址是否正确,或者是否欠费
总结
- openwrt的系统固件可以在openwrt官网找到,通过下载页面搜索路由器型号即可,不同型号的固件不要互刷
- 利用ipk给openwrt安装插件时,需要注意openwrt系统允许的ipk架构,可以参考libc的架构,与其保持一样的架构一般不会出大问题
- libgcc不要用其他架构的ipk覆盖安装,这样容易导致openwrt系统崩溃
- 注意软件的使用说明
参考
[1] Windows下安装Linux子系统的0x8007019e错误_嗨呀丶的博客-CSDN博客_0x8007019e
[2]GitHub - xxxxclient/xxxxclient: XXXX network client on Linux
[3]OPKG Package Manager [Old OpenWrt Wiki]
[4]路由器刷固件教程,刷机OpenWrt第三方固件,路由器升级固件方法_哔哩哔哩_bilibili
[5][OpenWrt Wiki] Welcome to the OpenWrt Project
[6][OpenWrt Wiki] 硬件列表:固件下载
[7]Linux SSH 远程登录WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 解决方法_wybnmsl的博客-CSDN博客