OpenWRT 是一款家用路由器的操作系統(tǒng),可以被描述為一個嵌入式的 Linux 發(fā)行版,路由器安裝了它才能正常的工作。就像國內(nèi)手機(jī)廠商基于開源的 Android 系統(tǒng)開發(fā)出各種 Rom一樣。路由器廠商也可以基于 OpenWRT 這個平臺,進(jìn)行二次開發(fā),增加更多豐富的功能和有廠商特色的路由器系統(tǒng)。獨(dú)立開發(fā)者們同樣也可以基于 OpenWRT 開發(fā)各種各樣的插件,使搭載了 OpenWRT 的路由器具備更豐富的功能。
作為使用者我們可以選擇網(wǎng)上豐富的開源鏡像直接燒錄,但是我們也可以做一高度定制化的固件,今天就來分享一下openwrt編譯開發(fā)過程,幫助大家進(jìn)行openwrt的使用。本文是我openwrt開發(fā)使用的開篇,后續(xù)會有更多文章分享。
歡迎關(guān)注微信公眾號:羽林君,或者添加作者個人微信:become_me
openwrt介紹
什么是 OpenWrt:
OpenWrt(官網(wǎng) www.openwrt.org)可以被描述為一個嵌入式的 Linux 發(fā)行版,目前常用在路由器上,但是作為基于 linux 系統(tǒng)的它,其實(shí)可以做更多的事情。
它是一個高度模塊化、高度自動化的嵌入式 Linux 系統(tǒng),擁有強(qiáng)大的網(wǎng)絡(luò)組件和擴(kuò)展性,還可被用于工控設(shè)備、電話、小型機(jī)器人、遠(yuǎn)程監(jiān)控、智能家居以及 VOIP 設(shè)備中。
它不同于其他許多用于路由器的發(fā)行版(主流路由器固件有 dd-wrt,tomato,OpenWrt 三類),它是一個從零開始編寫的、功能齊全的、容易修改的路由器操作系統(tǒng)。實(shí)際上,這意味著我們能夠使用單獨(dú)想要的功能而不加進(jìn)其他的累贅,而支持這些功能工作的 linux kernel又遠(yuǎn)比絕大多數(shù)發(fā)行版來得新(linux 內(nèi)核中很多源代碼都是由 OpenWrt 社區(qū)提供的)。
openwrt下載編譯燒錄
文件介紹
下載openwrt的源碼,地址如下:https://github.com/openwrt/openwrt.git
git?clone??https://github.com/openwrt/openwrt.git
cd?openwrt/
下載之后進(jìn)入openwrt目錄,可以看到有如下子文件
scripts
存放了一些腳本,使用了 bash,Python,perl 等多種腳本語言.編譯過程中,用于第三方軟件包管理的 feeds 文件也是在這個目錄當(dāng)中.在編譯過程中,使用到的腳本也統(tǒng)一放在這個目錄中
tools
編譯時,主機(jī)需要使用一些工具軟件,tools 里包含了獲取和編譯這些工具的命令.軟件包里面有 Makefile 文件,有的還包含了 patch.每個 Makefile 當(dāng)中都有一句(callHostBuild)),這表明編譯這個工具是為了在主機(jī)上使用的.
config
存放著整個系統(tǒng)的配置文件
docs
包含了整個宿主機(jī)的文件源碼的介紹, 里面還有 Makefile 為目標(biāo)系統(tǒng)生成 docs.使用make -C docs/可以為目標(biāo)系統(tǒng)生成文檔.
toolchain
做過嵌入式的童鞋應(yīng)該都知道交叉編譯鏈,這個文件中存放的就是編譯交叉編譯鏈的軟件包.包括:binutils,gcc,libc 等等.
target
openwrt 的源碼可以編譯出各個平臺適用的二進(jìn)制文件,各平臺在這個目錄里定義了firmware 和 kernel 的編譯過程。
package
存放了 openwrt 系統(tǒng)中適用的軟件包,包含針對各個軟件包的 Makefile。openwrt 定義了一套 Makefile 模板.各軟件參照這個模板定義了自己的信息,如軟件包的版本、下載地址、編譯方式、安裝地址等。在二次開發(fā)過程中,這個文件夾我們會經(jīng)常打交道。事實(shí)上,通過./scripts/feed update -a 和./scripts/feed install -a 的軟件包也會存放在這個目錄之中。
include
openwrt 的很多 Makefile 都存放在這里。文件名為 *.mk 。這里的文件上是在Makefile 里被 include 的,類似于庫文件.這些文件定義了編譯過程
feeds
openwrt 的附加軟件包管理器的擴(kuò)展包索引目錄.有點(diǎn)繞,簡單來說就是下載管理軟件包的.默認(rèn)的 feeds 下載有 packages、management、luci、routing、telephony。如要下載其他的軟件包,需打開源碼根目錄下面的 feeds.conf.default 文件,去掉相應(yīng)軟件包前面的#號,然后更新源:
./scripts/feeds?update?-a
安裝下載好的包:
./scripts/feeds?install?-a
build_dir
在前面的原始目錄中,我們提到了 host 工具,toolchain 工具還有目標(biāo)文件.openwrt
將在這個目錄中展開各個軟件包,進(jìn)行編譯.所以這個文件夾中包含 3 個子文件夾:
-
-
- host
-
-
-
- 在該文件夾中編譯主機(jī)使用的工具軟件toolchain-XXX
-
-
-
- 在該文件夾中編譯交叉工具鏈target-XXX
-
-
-
- 在此編譯目標(biāo)平臺的目標(biāo)文件,包括各個軟件包和內(nèi)核文件.openwrt 系統(tǒng)的 linux 解壓后的源碼在
-
bin
保存編譯完成后的二進(jìn)制文件,包括:完整的 bin 文件,所有的 ipk 文件.
dl
在編譯過程中使用的很多軟件,剛開始下載源碼并沒有包含,而是在編譯過程中從其他服務(wù)器下載的,這里是統(tǒng)一的保存目錄
staging_dir
用于保存在 build_dir 目錄中編譯完成的軟件.所以這里也和 build_dir 有同樣的子目錄結(jié)構(gòu). 比如,在 target-XXX 文件夾中保存了目標(biāo)平臺編譯好的頭文件,庫文件.在我們開發(fā)自己的 ipk 文件時,編譯過程中,預(yù)處理頭文件,鏈接動態(tài)庫,靜態(tài)庫都是到這個子文件夾中.
tmp
從名字來看,是臨時文件夾.在編譯過程中,有大量中間臨時文件需要保存,都是在這里.
更新
./scripts/feeds update -a
./scripts/feeds install -a
安裝時候可能會提示如下錯誤:
出現(xiàn)awk: include/scan.awk: line 21: function asort never defined
這個是缺少插件問題,解決這個問題,直接apt安裝工具,如下:
sudo apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache
再次
./scripts/feeds install -a,這次就不會出現(xiàn)問題
menuconfig
緊接著make menuconfig
進(jìn)入配置
首先就是需要進(jìn)行芯片和機(jī)器型號選擇,大部分人是知道我們購買路由器型號,但是機(jī)器芯片型號是不知道的,這個可以網(wǎng)絡(luò)查詢一下,我是通過ssh登錄機(jī)器進(jìn)行cat /proc/cpuinfo查看的芯片型號,最后一招大家也可以拆機(jī)查看芯片型號。
這是我自己的機(jī)器芯片型號:
第一界面選擇好對應(yīng)的芯片型號Target Profile設(shè)置設(shè)備型號
Target Images ?--->
[*] squashfs ?---> 設(shè)置好編譯輸出的鏡像類型,默認(rèn)也是squashfs,可以不用管
開始編譯
首推make V=s
進(jìn)行編譯源碼,V=s 是用來生成編譯信息的,方便用戶查找出錯原因。不建議加“-j x”(x 為數(shù)字)選項(xiàng),那樣可能會導(dǎo)致有時很難查找錯誤原因。
如果直接make如下所示,這個時候編譯過程都被省略了
而使用V=s編譯過程中會有每個文件編譯信息
編譯過程的分析
這個是在查看編譯時候,我們可以看到,openwrt會下載一堆文件,文件解壓之后發(fā)現(xiàn)會進(jìn)行apply打補(bǔ)丁操作,然后進(jìn)行編譯,這個操作做模塊話編譯很方便,像之前Linux其他設(shè)備編譯時候,我們會看到各種芯片定義文件都有,然后編譯的時候進(jìn)行選擇編譯,而openwrt直接進(jìn)行了精簡,源碼是最精簡的,每次選擇之后網(wǎng)絡(luò)下載包,進(jìn)行打補(bǔ)丁之后編譯,這個操作對很大項(xiàng)目或者項(xiàng)目維護(hù)的方案很執(zhí)行推薦。
Patch補(bǔ)丁打入:
打完補(bǔ)丁之后的文件編譯執(zhí)行細(xì)節(jié)confdata.c文件記錄
執(zhí)行細(xì)節(jié)conf.c文件記錄
編譯完成!
我們可以在package下面的openwrt下的ipk安裝包
bin/target對應(yīng)的芯片名稱下面看到編譯好的鏡像文件
這幾個bin文件的介紹:原文鏈接:https://blog.csdn.net/GK_Ph/article/details/85775737
在下載openwrt系統(tǒng)時,經(jīng)常能看到initramfs-kernel.bin,squashfs-factory.bin,squashfs-sysupgrade.bin等結(jié)尾的文件,factory適用于從原廠系統(tǒng)刷到openwrt,sysupgrade則是從openwrt刷到openwrt(已經(jīng)是openwrt系統(tǒng),在openwrt系統(tǒng)中更新自己),squashfs則是一種文件系統(tǒng),適用于嵌入式設(shè)備。那么initramfs-kernel又是什么呢。
initramfs是放在內(nèi)存RAM中的rootfs 映像文件,跟kernel放在一起。一般來說用不到initramfs-kernel.bin來刷機(jī),因?yàn)閱雍?,所有的配置在路由器重啟后都不能保留(畢竟ram文件系統(tǒng),所有文件放在ram中,斷電就沒了)。但也有用到initramfs-kernel.bin的時候,就是在移植openwrt系統(tǒng)的時候,沒有設(shè)備上的flash閃存的驅(qū)動的時候。
此外對于sysupgrade和uimage對比具體的內(nèi)容大家也可以參考此文:https://www.cnblogs.com/sherlock-merlin/articles/9323572.html
拷貝到機(jī)器中進(jìn)行燒錄
scp?openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin?root@
192.168.1.1:/tmp/
登錄機(jī)器查看
進(jìn)行燒寫
在非openwrt機(jī)器上使用mtd write /tmp/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin kernel1
最后面kernel1是mtd的分區(qū),mtd具體的分區(qū)大家可以通過命令查看。cat /proc/mtd
在已經(jīng)是openwrt機(jī)器上,我們可以使用sysupgrade工具:
sysupgrade -F openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin
- -F是強(qiáng)制覆蓋
燒錄完之后重啟,再進(jìn)行連接,查看自己的修改,進(jìn)行驗(yàn)證自己是否燒錄正常sysupgrade命令的詳細(xì)使用,大家可以參考此文:https://www.cnblogs.com/sammei/p/3973322.html
此外openwrt有l(wèi)uci界面也可以進(jìn)行燒錄
mtd和 systemupgrad都可以
結(jié)語
這就是我自己分享的openwrt編譯使用。如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。
作者:良知猶存,白天努力工作,晚上原創(chuàng)公號號主。公眾號內(nèi)容除了技術(shù)還有些人生感悟,一個認(rèn)真輸出內(nèi)容的職場老司機(jī),也是一個技術(shù)之外豐富生活的人,攝影、音樂 and 籃球。關(guān)注我,與我一起同行。