前置條件
- 編譯環(huán)境:Linuxmint 18.2 64-Bit
- 路由器型號:TP-LINK TL-WR720N v3, 改過硬件:16M Flash / 64M Memory
- 編譯過程中會頻繁下載東西,需要有網(wǎng)絡(luò)良好的環(huán)境。整個(gè)編譯過程可能會持續(xù)1到2個(gè)小時(shí)。
注意事項(xiàng)
- 請不要用root用戶編譯!
- 編譯命令請?jiān)贠penWrt編譯環(huán)境的根目錄下運(yùn)行,例如: ~/openwrt
- 編譯環(huán)境所在的每一級目錄的目錄名稱都不要有空格,
OpenWrt的目錄所有者要改成root以外的用戶。 (sudo chown -R user:username /openwrt/)
編譯原因
官方有原版的WR720N固件:https://downloads.openwrt.org/
優(yōu)點(diǎn)是方便,缺點(diǎn)是不能自己定制,因?yàn)槲沂歉倪^ Flash 大小的,必須自己編譯。
最主要的我想在路由器里運(yùn)行ngrok,WR720N的CPU AR9331屬于MIPS架構(gòu),GO直到GO1.6才支持MIPS64,GO1.8才支持MIPS。在此之前也有大神用C語言重寫ngrok,具體可以看大神在github上的項(xiàng)目。雖然說GO1.8之后的版本開始支持MIPS架構(gòu),但是需要系統(tǒng)內(nèi)核開啟FPU(Float Point 語言Unit,浮點(diǎn)運(yùn)算單元)才能使用。這次編譯最主要的就是開啟內(nèi)核的FPU功能。
開始編譯
以下是我對改過硬件的 TL-WR720N 編譯適合的固件的步驟:
1. 獲取最新源碼
如何獲取源碼可查看:https://dev.openwrt.org/wiki/GetSource
git clone git://git.openwrt.org/openwrt.git
也可以獲取特定分支的源碼,例如我們獲取 15.05 branch (Chaos Calmer) 這個(gè)分支 。以下步驟都使用的這份源碼
git clone git://git.openwrt.org/15.05/openwrt.git
2. 修改源碼,使其適用于 16M Flash。
參考的這篇文章: http://wiki.openwrt.org/toh/tp-link/tl-wr703n#mb_flash_mod
進(jìn)入源碼目錄 cd openwrt
打開 target/linux/ar71xx/image/Makefile 這個(gè)文件。將如下內(nèi)容
define Device/tl-wr720n-v3
$(Device/tplink-4mlzma)
BOARDNAME := TL-WR703N
DEVICE_PROFILE := TLWR720
TPLINK_HWID := 0x07030101
CONSOLE := ttyATH0,115200
endef
改為:
define Device/tl-wr720n-v3
$(Device/tplink-16mlzma)
BOARDNAME := TL-WR703N
DEVICE_PROFILE := TLWR720
TPLINK_HWID := 0x07030101
CONSOLE := ttyATH0,115200
endef
打開 tools/firmware-utils/src/mktplinkfw.c 這個(gè)文件。將如下內(nèi)容:
.id = "TL-WR720Nv3",
.hw_id = HWID_TL_WR720N_V3,
.hw_rev = 1,
.layout_id = "4Mlzma",
改為:
.id = "TL-WR720Nv3",
.hw_id = HWID_TL_WR720N_V3,
.hw_rev = 1,
.layout_id = "16Mlzma",
3. 下載和安裝所有可用的 Feeds(可選)
feeds其實(shí)就是外圍的軟件源,如luci就是其中之一,不是OpenWrt核心開發(fā)組的。還是執(zhí)行這一步比較好。feeds的說明參考這篇文章:http://wiki.openwrt.org/doc/devel/feeds。
./scripts/feeds update -a
./scripts/feeds install -a
4. 檢查依賴軟件
運(yùn)行下面的命令(3選1!),讓OpenWrt編譯系統(tǒng)檢查編譯環(huán)境中缺失的軟件包:
make menuconfig # 總體配置,推薦使用此命令
make defconfig # 默認(rèn)配置
make prereq #
# 如果以上3個(gè)命令都運(yùn)行了,編譯會出錯(cuò)!
根據(jù)提示安裝對應(yīng)的軟件。如果以前沒裝過build-essential這個(gè)包的話,這次也要安裝這個(gè)包。
5. 總體配置
make menuconfig
輸入以上命令之后,會進(jìn)入一個(gè)命令行圖形界面,界面最上面是用法。
- <*> 該代碼將被放入固件中 (on the SqashFS partition)
- < > 該代碼將不會被編譯
- <M> 該代碼將被交叉編譯,生成的ipk軟件包將被放在 /buildsystem/bla/bla/bla, 但該軟件包不會放入固件中
以下是我的一些配置。
選擇 CPU 型號
Target System 選為 Atheros ARM7xxx/ARM9xxx選擇路由器型號
Target Profile 選為 TP-LINK TP-WR720N啟用 Web 管理界面 LuCI
LuCI → Collections → 選中 luci添加 LuCI 中文支持
LuCI → Modules → Translations → 選中 Chinese (zh-cn)添加支持USB自動mount功能
添加USB相關(guān)支持
Kernel modules —> USB Support —> <*> kmod-usb-core.
Kernel modules —> USB Support —> <*> kmod-usb-ohci.
Kernel modules —> USB Support —> <*> kmod-usb-uhci.
Kernel modules —> USB Support —> <*> kmod-usb-storage.
Kernel modules —> USB Support —> <*> kmod-usb-storage-extras.
Kernel modules —> USB Support —> <*> kmod-usb2.
添加USB掛載
Base system —> <*>block-mount
添加自動掛載工具
Utilities —> Filesystem —> <*> badblocks
添加文件系統(tǒng)支持
Kernel modules —> Filesystems —> <*> kmod-fs-ext4 (移動硬盤EXT4格式選擇)
Kernel modules —> Filesystems —> <*> kmod-fs-vfat(FAT16 / FAT32 格式 選擇)
Kernel modules —> Filesystems —> <*>kmod-NTFS(NTFS選擇,具體是什么忘記了,總之有NTFS字樣的)
添加UTF8編碼,CP437編碼,ISO8859-1編碼
Kernel modules —> Native Language Support —> <> kmod-nls-utf8
Utilities ---> disc ---> <> fdisk.................................... manipulate disk partition table
Utilities ---> <*> usbutils................................... USB devices listing utilities
6. 內(nèi)核配置
make kernel_menuconfig
進(jìn)入文本行圖形界面后,開啟FPU。
- Kernel type → 選中 MIPS FPU Emulator
7. 編譯
make
更多編譯選項(xiàng)參考文章最后面的鏈接。整個(gè)編譯過程會比較久,這段時(shí)間可以去做點(diǎn)別的事情,比如我打完make命令之后就去洗澡睡覺了。囧......
編譯好了之后可在 bin/ar71xx 目錄找到生成的固件:
- openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin
- openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin
刷機(jī)
(待定,這一步我沒有做。我買路由器的時(shí)候淘寶商家已經(jīng)刷了明月永在的固件和不死uboot,我是直接刷openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin的。而且也沒有出現(xiàn)過刷死的情況。)
我所使用的 U-Boot 是這個(gè):https://github.com/pepe2k/u-boot_mod。
步驟如下:
- 將電腦 IP 設(shè)置為 192.168.1.2, 子網(wǎng)掩碼設(shè)置為 255.255.255.0;
- 斷開路由器的電源,用網(wǎng)線連接好電腦和路由器;
- 按住路由器的 Reset 按鈕,插上電源,待路由器燈閃四次后放開,放開后,路由器燈會快閃一次,代表進(jìn)入了恢復(fù)模式;
- 用電腦瀏覽器打開 http://192.168.1.1/index.html, 打開后,上傳固件;
- 上傳完固件后,等一段時(shí)間,待機(jī)器自動重啟此時(shí)可將電腦 IP 設(shè)置為自動獲取。
配置系統(tǒng)
這里可以參考我的另外一篇筆記。
錯(cuò)誤(后續(xù))處理
- 關(guān)于自己編譯的系統(tǒng)不能安裝官方軟件源的軟件。
安裝不了的軟件大多是跟內(nèi)核相關(guān)的,一般都會帶有kmod字樣,如kmod-fs-ext4。這是因?yàn)楣俜杰浖吹能浖幾g時(shí)用的內(nèi)核和我們自己的不一樣,就算opwnwrt正式版的已經(jīng)發(fā)布,但是github上的代碼還是會更新,包括內(nèi)核版本。比如官方的Chaos Calmer內(nèi)核是3.18.21,我從github上下的內(nèi)核時(shí)3.18.45。這時(shí)候在安裝命令之后加上 --force-depends即可
opkg install kmod-fs-ext4 --force-depends
- 路由器指示燈一直在閃爍
這個(gè)是因?yàn)樵诰幾g固件時(shí)沒有選擇led燈的配置項(xiàng),系統(tǒng)就采用默認(rèn)值??梢杂靡韵碌拿钤O(shè)置LED燈。以下命令最好加入到開機(jī)啟動項(xiàng)中。
LED燈長亮:
echo "1" > /sys/devices/platform/leds-gpio/leds/tp-link:blue:system/brightness
LED燈熄滅:
echo "0" > /sys/devices/platform/leds-gpio/leds/tp-link:blue:system/brightness
LED燈閃爍:
cd /sys/devices/platform/leds-gpio/leds/tp-link:blue:system/
echo timer > trigger
echo 100 > delay_on
echo 100 > delay_off
注意:延時(shí)時(shí)間(delay_on)要小于255。
參考文章: