實踐過程
前幾天晚上,宿舍路由器莫名的掉線了,無法認證校園網,每次聯網都提示需要進行身份驗證。
登陸路由后台后,發現“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博客