pi router os 建置筆記 (一) -- OpenWRT 架構 === 會有這一篇的原因是因為前陣子研究OpenWRT。該系統透過GUN Make客製化Buildroot,將其變成一個基於網路路由應用的Linux發行版。那我是不是可以透過GUN make包裝OpenWRT,建立起我自己的路由應用的Linux發行版呢?於是開始了研究的過程~~ 由於手上有Raspberry pi 4b,那就拿他當作目標板吧。 目前我規劃的系統有區分成三個部分: * pi router os: 整個OS部分的主體,交由GNU Make客製化整個系統。[PI-ROUTER-OS](https://github.com/sss22213/pi-router-os) * pi-router-os-web-ui: 路由器網頁UI部分,架構是django(PR網址暫不放上來)。 * pi-router-os-middleware: 中介路由器網頁UI和OS之間。[PI-ROUTER-OS-MIDDLEWARE](https://github.com/sss22213/pi-router-os-middleware)。 在客製化之前,先來了解一下OpenWRT的架構。 參考: :::info [openwrt源码框架解析1](https://blog.csdn.net/WXXGoodJob/article/details/80910307) [OpenWrt_Dev_Tutorial](https://www.ccs.neu.edu/home/noubir/Courses/CS6710/S12/material/OpenWrt_Dev_Tutorial.pdf) ::: --- ## OpenWRT 架構  1. tools: 包含所有建置映像檔的工具。  :::info autoconf, m4等等。 ::: 2. toolchain: 建置所需的Toolchain。  :::info gcc, gdb, glibc等等。 ::: 3. target: 建立Firmware映像檔生成程序和Kernel建置程序的指令。build instruction for firmware image generating process and for the kernel building process. :::info * Compiles kernel and firmware image utilities. * Builds firmware image. * Generate Image Generator(former called Image Builder). :::  4. package: 所有主要package的Makefile和patch。  5. include: 包含GNU MAKE檔案。  6. scripts: 由perl和bash所組成的OpneWRT套件管理。  7. dl: user-space package的壓縮檔將被下載到這裡。  8. build_dir: 所有user-space tools的跨平台編譯。(通常Embedded system效能不是很好,所以建置通常會在Host machine先建置好)  9. staging_dir: 跨平台編譯工具將被安裝在這裡。  10. feeds: OpenWRT所需要的軟體套件。  :::info 比較著名的有Luci (OpenWRT預設的GUI介面套件) ::: 11. bin: where the firmware image will be generated and all the .ipk package files will be generated.(OpenWRT使用opkg package,ipk為其應用程式安裝檔案的擴展名[opkg](https://zh.wikipedia.org/wiki/Opkg))。  :::info 建置好的映像檔案也放在這裡 ::: --- ## 資料夾feeds 如之前所說feeds資料夾包含了OpenWRT所需要的軟體套件。這些套件一開始並不會包含在OpenWRT的資料夾裡,而是在建置過程中透過以下指令,將套件下載到feeds資料夾之中。 ```bash= ./scripts/feeds update -a ./scripts/feeds install -a ``` 那這些套件下載的位置,都是透過根目錄的feeds.conf.default所管理  格式是: :::info 類型 名稱 網址 ::: 每一行都表示套件下載位置,可以在這個檔案最後新增我們套件位置,達到客製化的目的。 在之後筆記會專門討論如何建立自己的feeds。 --- ## 資料夾package 所有主要package的Makefile和patch。其中包括Linux kernel, Firmware,基本rootfs等等。  OpenWRT package有自己一套的makefile寫法(這樣說起來似乎不太對,其實是依據標準GNU Make語法,統一寫法,方便管理),方便建置的時候使用。 至於要如何建立自己的package,一樣會在後面筆記介紹。 --- ## OpenWRT 建置系統 當OpenWRT buildroot一旦設定好(例如: 指定目標平台,package選擇等等)。OpenWRT buildroot將自動依據以下步驟建置系統: 1. 下載cross-compilation tools, kernel headers等等。 2. 設定staging_dir目錄。Cross compile將被安裝這裡,也就是說你可以在這裡找到cross compile編譯第三方的package。 3. 建立download目錄(dl/by default)。套件包將被下載到這裡。 4. 建立build目錄(build_dir/)。所以user-space工具將被安裝在這裡。 5. 建立target目錄(build_dir/target-arch/root by default)和檔案系統。這些目錄將包含在最後的rootfs。 6. 安裝user-space package到目標rootfs,並壓縮root file system到目標格式。建置好的映像檔放置在bin目錄。 --- ## 如何建置OpenWRT 這部分詳細可參考我過去的文章。 [OpenWRT on Raspberry pi 4](https://hackmd.io/MctEFOFISZSSKkez7pbY8A) [OpenWRT on CM4](https://hackmd.io/65NTij2PRzi0alkRjXvIbg) 簡單來說,OpenWRT提供menuconfig,給開發者方便客製化系統。 ```bash= make menuconfig ```  設定好後,會自動生成.config檔案,供toolchain建置使用  在設定完成之後,透過GNU MAKE就可以將建置專案了 ```bash= make ``` :::info * 使用is not set表示不會使用。 * 使用 =y,表示會使用。 當然我們可以直接修改.config檔案,達到開啟某個功能的目的。但某些功能具有相依性,例如: nginx-openssl 相依 openssl。 若是僅開啟nginx-openssl,但沒有開啟openssl,在編譯過程中會發生錯誤。 ::: 若是想直接設定Linux kernel某些Feature,OpenWRT buildroot有提供設定方式。操作方法如同menuconfig,儲存後建置專案即可。 ```bash= make kernel_menuconfig ``` 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up