天天看點

《智能路由器開發指南》——導讀

《智能路由器開發指南》——導讀

openwrt成功的秘密

可以實作路由器功能的開源軟體很多,為什麼隻有openwrt成功了?openwrt軟體成功的關鍵在于3個方面:上司者、基礎設施以及實作軟體的技術。通常上司者是最重要的,因為上司者決定着社群的規則和技術方向,但是每個人都是獨特的而且是無法複制的,是以通常無法借鑒。基礎設施和實作軟體的技術則是可以借鑒的。

openwrt社群采用六大基礎設施工具支撐整個社群的運轉,這六大基礎設施工具分别是代碼管理工具git、郵件清單、自動建構工具buildbot、文檔管理工具wiki、trac和技術論壇。

代碼管理工具git可以跟蹤檔案和目錄的曆史資訊,包含4個w(who、when、why和what),即誰做了修改,什麼時間做了修改,為什麼修改以及修改的内容是什麼。此外,git還支援分布式代碼倉庫,适合開源軟體項目的跨地域開發,這個工具可以讓每個人看到代碼的變化過程。openwrt經過了12年的發展,代碼倉庫還保留了最初的送出記錄。

郵件清單是代碼審查及代碼送出內建的地方,開發人員将修改代碼生成更新檔發送給所有的郵件訂閱者,每個人都可以進行代碼評審,核心開發人員看到後會将代碼內建到代碼倉庫中。郵件内容可以永久儲存到郵件清單中。郵件清單和普通郵件的主要差別在于訂閱機制和存檔機制,每個人都可以自由訂閱并檢視曆史郵件。

自動建構工具buildbot的核心是一個作業排程系統,它會将任務排隊,當提供了任務所需的資源時,執行任務并報告結果。buildbot不僅僅支援持續內建及自動化測試,還支援應用程式的自動化部署和軟體釋出的管理。同時在多個平台開發時,通常最後的編譯驗證都是重複的,編譯機器人(buildbot)将這一部分接管過來,每日自動下載下傳代碼進行編譯驗證,并将安裝包上傳到檔案伺服器上,如果編譯失敗則将用郵件通知感興趣的人。

文檔管理工具wiki的特點是具有開放性,可以讓任何參與人員非常友善地進行編輯、通路和搜尋。大多數軟體公司的軟體文檔均儲存為二進制格式,在經過一段時間和人員流動之後,這些文檔就會成為固定的資料,因為它會被遺落在某個角落而無法找到,而openwrt社群的軟體開發文檔和使用手冊均儲存到wiki上。wiki是一個協同寫作和分享平台,允許所有人修改頁面。wiki使用簡化的文法來代替複雜的html語言,降低了内容維護的門檻。

trac是一個內建wiki和問題跟蹤管理系統的項目管理平台,可以幫助開發人員更好地管理軟體開發過程,進而開發出高品質的軟體。任何人都可以使用該系統來送出bug并查詢目前的進展。trac采用面向進度的項目管理模型,采用裡程碑的方式來組織開發。裡程碑是以ticket(問題)來組織的,所有的問題都解決了,就到達了裡程碑。但社群并不完全遵從這個标準,因為其開發人員全部是志願者,通常到了一定時間會釋出一個版本。

技術論壇是一個技術讨論的平台,每個注冊使用者均可發帖參與讨論。在開發過程中,每個新版本的說明通過該平台釋出。

社群的運轉是通過以上所述的六大基礎設施工具來實作的,我們通過這些工具可以了解到,開源軟體和社群的精髓在于其開放性,任何人員均可以通過網絡自由地擷取其資訊并參與其中,這樣可以激勵每個人貢獻出自己的力量,開發人員同時也從社群獲得回報。開源社群的工具大多都是相同的,掌握這些工具可以幫助你深入了解開源社群和openwrt。

openwrt技術上成功的秘訣在于:統一編譯架構、統一配置接口(unified configuration interface,uci)、開放的軟體包管理系統及其讀寫分區系統、系統總線ubus和程序管理子產品procd。

統一編譯架構使得數千個軟體以相同的方式進行編譯,并且可以在幾十個平台編譯。每個軟體子產品按照相同的步驟進行代碼下載下傳、解壓縮、打更新檔、配置、編譯及生成安裝包。

統一配置接口使得數千個軟體在幾十個平台上以相同的方式來存取配置資料,配置以統一格式的文本檔案進行管理。

開放的軟體包管理系統和讀寫分區系統使得軟體管理非常友善,并且能夠友善地處理軟體包的依賴關系。讀寫分區系統可以自由地安裝軟體,而不像大多數專有系統需要全部重新編譯才能安裝新的軟體。

系統總線ubus。每個程序均可以注冊到系統總線上進行消息傳遞,并且提供指令行工具來通路系統總線。

程序管理子產品procd。每一個程序交給procd來啟動,并在意外退出之後再次調用。

所有的這些功能并不是一次性設計出來的,而是随着時間的推進,根據使用者和開發進展逐漸發展起來的,每一種技術都有其獨特的價值。

寫作本書的目的

我從寫下第一行c語言代碼到現在已經有近20年了,實際從事嵌入式軟體開發也有12年的時間了。由于在工作中經常會分析一些開源軟體,是以在接觸openwrt的過程中,我發現它的設計和實作思路非常好。但是在實際工作中往往會受到時間進度、項目研發人員的水準以及研發人員的更疊等因素的影響,導緻軟體架構存在種種不足或者過度設計的問題,但并沒有很好的解決方法,開發進度一再延遲,是以有了寫出本書的想法。

本書可以幫助各種嵌入式裝置開發工程師對openwrt技術有一個清晰的認識,并能夠幫助他們對開源的openwrt進行借鑒,提高軟體開發水準。

openwrt始終在發展,本書中所提到的系統使用openwrt 12.09和openwrt 15.05.1來介紹,大部分不區分版本,如有區分,我會特别說明。

希望大家通過學習本書能夠掌握openwrt各種技術的應用,同時在一定程度上可以參考openwrt的技術架構,使自己的職業技能有一個質的提高,進而加快企業産品項目的開發,提高開發效率。

讀者對象

本書的讀者對象如下:

軟體架構師;

軟體開發工程師;

軟體測試工程師;

計算機相關專業的學生。

如何閱讀本書

本書的結構是按照通常對路由器的認識順序來編寫的,全書内容共分為15章。

第1章對路由器進行了概述,主要介紹了openwrt的發展曆史,openwrt的主要功能和幾種開源路由器作業系統的對比。

第2章介紹了開發環境的搭建以及如何編譯代碼,并對常用編譯腳本和編譯選項進行了分析,也講述了virtualbox虛拟網絡環境的設定。

第3章介紹了opkg軟體包管理系統。opkg用于管理軟體包的下載下傳、安裝、更新、解除安裝和查詢等,并處理軟體包的依賴關系。

第4章介紹了統一配置接口,openwrt數千個軟體均采取該該配置接口,它包含3個部分:配置檔案、通路api和指令行工具。

第5章介紹了如何在openwrt中新增一個軟體包,提供了一個簡易子產品供參考,還介紹了openwrt的軟體啟動機制和更新檔檔案的格式以及更新檔工具的使用。

第6章介紹了gdb的使用。首先介紹了如何使用gdb啟動程式調試,然後介紹了在gdb中如何設定斷點以及檢視程式的運作狀态,最後介紹了使用gdb對運作中程式的執行流程進行修改,這樣能以最快的速度定位問題所在。

第7章介紹了tcp/ip網絡模型,從下到上依次講述了資料鍊路層、ip層和傳輸層協定,并以一個綜合案例來講述封包的網絡處理流程。

第8章介紹了openwrt路由器最近幾年新增的核心子產品,包括系統總線ubus、網絡裝置和接口管理子產品netifd、程序管理子產品procd等。

第9章介紹了在各種領域内的常用軟體子產品,例如cwmp用于遠端網絡管理,ssh用于使用者登入,qos用于保障服務品質,uhttpd用于提供web服務,smtp用于發送郵件,ntp用于網絡時間協定,pppoe用于網絡撥号服務等。

第10章介紹了路由功能,包括普通的路由及源位址路由群組播路由。

第11章介紹了域名系統和動态主機服務,并講述了動态域名更新系統。

第12章和第13章講述防火牆。首先介紹了iptables,它是用來設定、維護和檢查linux核心的防火牆ip封包過濾規則和網絡位址轉換規則。netfilter是在核心中依據規則對封包進行處理。uci防火牆設定了一個易用的防火牆模型來對防火牆進行管理。

第14章介紹了upnp标準架構和upnp工作流程,并以增加端口映射為例講述了internet網關如何實作廣域網通路區域網路提供的服務。

第15章首先介紹了網絡調試和診斷的“瑞士軍刀”netcat,它可以用來進行傳輸檔案,掃描端口等;其次介紹網絡流量分析工具tcpdump,它可以輸出網卡接口上的網絡封包,也可以根據選項将封包儲存為檔案。

大家可以根據自己的需求選擇閱讀的側重點,不過我還是建議你首先通讀前8章,再根據自己的需求來閱讀其他章節,這樣可以對openwrt架構上有一個清晰的認識,還可以對架構中的技術有一個簡單的對比。

緻謝

感謝本書的第二作者李章明,他負責upnp一章和wi-fi一節的編寫。另外,還要感謝程晶對本書的貢獻。

感謝本書編輯胡俊英對本書的仔細審讀,她耐心地幫助修改了很多文字錯誤,使本書的寫作品質有了很大的提高。

感謝openwrt開發社群,沒有邁克·貝克和格裡·羅澤馬創立的openwrt社群,這本書就不能完成。本書的很多資料都參考了社群郵件清單、wiki以及代碼,感謝openwrt社群所有人員的貢獻。同時,本書有一些素材來自linux社群,也感謝林納斯和他所建立的linux。

最後感謝在工作和生活中曾經幫助過我的所有人,感謝你們,正是因為有了你們,才有了本書的面世。

[第1章 智能路由器概述

<a href="https://yq.aliyun.com/articles/97618/">1.2 整體功能元件</a>

1.2.1 整體架構

1.2.2 網絡功能

1.2.3 系統管理

1.2.4 狀态監控

<a href="https://yq.aliyun.com/articles/97632/">1.3 開源嵌入式作業系統比較</a>

1.3.1 和android比較

1.3.2 和其他wrt比較

<a href="https://yq.aliyun.com/articles/97641/">1.4 參考資料</a>

[第2章 開發環境及編譯分析

2.1.1 ubuntu安裝

2.1.2 安裝編譯工具

2.1.3 下載下傳代碼

2.1.4 配置及編譯

<a href="https://yq.aliyun.com/articles/97705/">2.2 編譯腳本分析</a>

2.2.1 頂層目錄概述

2.2.2 編譯腳本

2.2.3 下載下傳工具

2.2.4 patch-kernel.sh腳本

2.2.5 編譯擴充機制feeds

<a href="https://yq.aliyun.com/articles/97719/">2.3 使用virtualbox部署</a>

<a href="https://yq.aliyun.com/articles/97727/">2.4 編譯部署出現問題的解決方法</a>

<a href="https://yq.aliyun.com/articles/97749/">2.5 virtualbox虛拟機網絡設定</a>

2.5.1 網絡位址轉換模式

2.5.2 橋接網絡模式

2.5.3 内部網絡模式

2.5.4 僅主機網絡模式

2.5.5 網絡模式比較

2.5.6 組建路由器實驗環境

<a href="https://yq.aliyun.com/articles/97753/">2.6 參考資料</a>

第3章 openwrt包管理系統

第4章 openwrt配置

第5章 軟體開發

第6章 gdb調試

第7章 網絡基礎知識

第8章 路由器基礎軟體子產品

第9章 常用軟體子產品

第10章 ip路由

第11章 dns與dhcp

第12章 iptables防火牆

第13章 uci防火牆

第14章 upnp

第15章 網絡測試及分析工具