最近遇到一個問題,openwrt路由器網口無法聯網。
通過WIFI進入到路由器系統後,逐個文件排查,並未發現異常,而且系統參數確實未檢測到網線接入(但可用的網線確確實實是接入了的)。
cat /sys/class/net/eth0/operstate
返回值一直爲down。
此時考慮是否是硬件問題,準備將路由器的固件提取出來,燒錄到另外一臺路由器。
如果按照目錄一個個打包拿出來是不太可行的,一方面工作量大,另一方面可能會有漏掉的文件,因此使用dd指令將系統整個firmware提取出來。
root@OpenWrt:/# cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00001000 "u-boot"
mtd1: 00010000 00001000 "u-boot-env"
mtd2: 00e30000 00001000 "rootfs"
mtd3: 0060e000 00001000 "rootfs_data"
mtd4: 00170000 00001000 "kernel"
mtd5: 00010000 00001000 "art"
mtd6: 00fa0000 00001000 "firmware"
系統固件firmware包括rootfs和kernel,因此在提取時只需提取mtd6即可。
又由於openwrt的固件大小爲16M,因此提取指令爲:
dd if=/dev/mtd6 of=/tmp/test.bin bs=65536 count=250
(65536*250=16M)
提取到bin文件後,就可以通過tftp指令將文件推送到PC,然後燒錄到其他路由器上進行對比了。
上傳過程中發現另外一個異常:
提取到的文件命名是完整的16M,但是通過tftp上傳給windows10電腦後,大小變成了16M+77K,導致燒錄時大小超限。顯然是windows下的tftp server沒好好幹活,或者有些特殊的規則?
由於一般採用Linux電腦搞開發,就直接用Linux電腦重新接收了一遍,大小正常,燒錄OK。
本文主要是介紹固件的提取方法。
順帶說一下問題分析結果:燒錄到其他路由器後,工作正常,說明爲原路由器硬件問題。之後通過硬件測量確認是網口相關引腳電平不正常,導致網卡沒有起來。萬惡的靜電。