---
# System prepended metadata

title: pi router os 建置筆記 (一) -- OpenWRT 架構

---

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 架構

![](https://i.imgur.com/jtmnqk0.png)

1. tools: 包含所有建置映像檔的工具。
![](https://i.imgur.com/J6QiN8K.png)

:::info
autoconf, m4等等。
:::

2. toolchain: 建置所需的Toolchain。
![](https://i.imgur.com/aZStcHn.png) 

:::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).
:::
![](https://i.imgur.com/V75Z2XU.png)

4. package: 所有主要package的Makefile和patch。
![](https://i.imgur.com/SUeJlHQ.png)

5. include: 包含GNU MAKE檔案。
![](https://i.imgur.com/gWgjxTG.png)

6. scripts: 由perl和bash所組成的OpneWRT套件管理。
![](https://i.imgur.com/u3udOi8.png)

7. dl: user-space package的壓縮檔將被下載到這裡。
![](https://i.imgur.com/F2CmMcJ.png)

8. build_dir: 所有user-space tools的跨平台編譯。(通常Embedded system效能不是很好，所以建置通常會在Host machine先建置好)
![](https://i.imgur.com/0hXw9VG.png)

9. staging_dir: 跨平台編譯工具將被安裝在這裡。
![](https://i.imgur.com/XEu89iR.png)

10. feeds: OpenWRT所需要的軟體套件。
![](https://i.imgur.com/4pMc3qp.png)
:::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))。
![](https://i.imgur.com/7RX4Og3.png)
:::info
建置好的映像檔案也放在這裡
:::

---

## 資料夾feeds

如之前所說feeds資料夾包含了OpenWRT所需要的軟體套件。這些套件一開始並不會包含在OpenWRT的資料夾裡，而是在建置過程中透過以下指令，將套件下載到feeds資料夾之中。
```bash=
./scripts/feeds update -a
./scripts/feeds install -a
```

那這些套件下載的位置，都是透過根目錄的feeds.conf.default所管理

![](https://i.imgur.com/5n8y0EB.png)

格式是:
:::info
類型 名稱 網址
:::

每一行都表示套件下載位置，可以在這個檔案最後新增我們套件位置，達到客製化的目的。

在之後筆記會專門討論如何建立自己的feeds。

---

## 資料夾package

所有主要package的Makefile和patch。其中包括Linux kernel, Firmware，基本rootfs等等。

![](https://i.imgur.com/iTIUvjx.png)

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
```

![](https://i.imgur.com/7uxskOH.png)


設定好後，會自動生成.config檔案，供toolchain建置使用

![](https://i.imgur.com/PSqJghQ.png)

在設定完成之後，透過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
```

![](https://i.imgur.com/xv57T1F.png)