OpenWrt 建置 – 使用方法
→ 回到 downloads 或閱讀 →OpenWrt Buildroot – About |
先前準備
- Install OpenWrt Buildroot and its prerequisites on your OS.
程序
![]() | 1. 不要使用 root帳號 2. 所有的命令必須在 <buildroot dir> 目錄底下執行, 如 ~/openwrt/trunk/ |
- 更新OpenWrt原始碼
- 更新並安裝套件
- 設定套件
- 開始編譯。這會自動編譯toolchain,編譯原始碼,封裝套件,最後產生可以刷新的映像擋。
- 開始進行 安裝OpenWrt
更新原始碼
更新原始碼:
svn update
OpenWrt的原始碼很常更新。建議使用最新的原始碼。
更新 Feeds
- 更新feeds:
./scripts/feeds update -a
- 安裝下載的套件:
注意: 在 ./scripts/feeds
中顯示的installing 表示 “讓這個套件可以在 make menuconfig
中選擇”。而不是真的編譯和安裝套件。
- 安裝單一套件:
./scripts/feeds install <PACKAGENAME>
- 或安裝全部的套件:
./scripts/feeds install -a
Image Configuration
開始OpenWrt Buildroot的 ncurses text-based 設定界面:
make menuconfig
就像Linux kernel 設定,每一個選項大致有三種,y, m, n 分別表示:
- 按 y 設定成
<*>
標籤
這個套件將包含在映像檔裡 - 按 m 設定成
<M>
標籤
這個套件會被編譯 (to be installed withopkg
after Flashing OpenWrt) but the package will not be included in the firmware-image - 按 n 設定成
< >
標籤
這個套件不會被編譯
儲存設定後, ~/openwrt/trunk/.config
會依據你所選的設定產生。
編譯環境會提供OpenWrt的 'Backfire' 10.03.1 設定檔,如 for ar71xx.
- 上面這個選單可以讓你選擇目標的平台,你想使用的toolchain以及你想要包進映像檔的套件。
- 更新原始碼和feeds後再執行這個設定界面,以確保是最新的套件設定。
Defconfig
整體設定
Menuconfig
提供一個文字的選單介面,可以選擇要編譯成韌體的目標、套件和一些核心選項。
make menuconfig
會自動更新現存的設定和相依性來建置更新後的映像檔。
為了簡化強大的編譯環境來產生個別的OpenWrt映像檔,發展了'menuconfig'。透過menuconfig的幫助,可以解決客製化的設定需求。依照特定的目標平台,套件需求和核心模組。標準的設定流程修改的部分包含:
- 目標系統(Target system)
- 套件選擇(Package selection)
- 建置系統設定(Build system settings)
- 核心模組(Kernel modules)
目標系統的選擇可以依照你手上的設備選擇支援的平台,可以是通用或特定的設置。 選擇套件可以選'selecting all package'來選定所有的套件,但這或許在特定狀況下才可被實現。預設的套件已經足夠,或可以再選定個別的套件。要注意的是,某些套件的組合會導致建置中斷,所以要做些測試來達到預期的結果。也因此OpenWrt的開發者們只有維護最小的預設套件組合。不過feeds-script可以讓建置過程中的套件整合和維護簡單化。
最常用的三個選項:
- < > 這個原始碼不會被處理
- <M> 這個套件的原始碼會被編譯成二進制檔和一個opkg套件檔。這個套件檔會放在
/buildsystem/bla/bla/bla
,但是ImageGenerator並不會把這個套件放到韌體的映像檔中! - <*> 這個套件會被放入韌體中 (在SqashFS 分割區)
在開始編譯前的最後一步,離開 'menuconfig' – 這包含儲存設定或載入已存在的版本和設定。
離開文字選單並選擇 save
來儲存設定。
核心設定
如果不想要標準的核心設定,你可以用:
make kernel_menuconfig
注意: make kernel_menuconfig
會修改核心設定的模版,清空 build_dir 並不會回復。
修改的部分可以參考 svn diff target/linux/
並可以下 svn revert -R target/linux/
來回復。
原始碼鏡射位置
'Build system settings' 包含會影響套件位置的選項,以便於操控本地端的套件組:
- 套件原始碼的本地端鏡射位置
- 下載資料夾
第一個選項,你只需要輸入那個套件原始碼的完整的ftp或web伺服器位址。下載資料夾會一樣的放在你本地端的路徑資料夾。如果是ftp或web伺服器提供TAR封裝檔,OpenWrt的建置系統會先嘗試下載在Makefile裡描述的位址。也可以指定在建置系統上的下載資料夾。
如果你需要特定或非標準的驅動程式,必須到'Kernel modules'選定。這通常是需要USB模組或是特定的網路介面的驅動程式等。
客製化檔案
在許多狀況,可能需要一個已被預先設定好的客製化映像檔。可以放置你的客製化檔案到
<buildroot dir>/files/
例如,你想要先設定好/etc/config/firewall
,那就把修改好的firewall設定檔放到:
<buildroot dir>/files/etc/config/
例如,你的<buildroot dir> 是 /openwrt/trunk。如果你想把某些檔案放到映像檔中的/etc/config資料夾,就把這些檔案放到 /openwrt/trunk/files/etc/config.
建置映像檔
當全部都準備好可以建置映像檔了,只要下這麼一個命令:
make
這個命令會開始一連串的活動,如你所知的
- 編譯 toolchain
- 用toolchain做跨平台編譯原始碼
- 產生opkg套件
- 產生可以flashed的韌體映像檔
Make 選項
多核心CPU建置
建置的程序可以透過多個非同步的程序來加速,使用 -j
選項:
make -j 3
- 使用標準的公式
<CPU核心數目 + 1>
- 如果會發生不固定建置錯誤,請試著拿掉
-j
選項後再編譯一次。
背景建置
如果你希望建置的過程中還可以使用你的系統,你可以讓建置的程序只使用閒置的 I/O 和 CPU 資源 (雙核心 CPU):
ionice -c 3 nice -n 20 make -j 2
建置單一套件
在開發OpenWrt套件的時候,僅編譯套件是來得方便多的 (例如建置套件 cups
):
make package/cups/compile V=s
如套件 mc (midnight commander)
包含feed packages 的套件:
make package/feeds/packages/mc/compile V=s
注意:啟始路徑為package
目錄和 package/feeds
的或許不會和feeds
的結構相同。 如套件 ~/openwrt/trunk/feeds/packages/net/snort
要用 make ~/openwrt/trunk/package/feeds/packages/snort/compile V=s
來編譯。
建置錯誤
如果因為某些原因建置錯誤了,最簡單的方式就是使用:
make V=s 2>&1 | tee build.log | grep -i error
這個命令會記錄全部的建置輸出到 /openwrt/trunk/build.log
並顯示error的部分到螢幕上。
另一個範例:
ionice -c 3 nice -n 20 make -j 2 V=s CONFIG_DEBUG_SECTION_MISMATCH=y 2>&1 | tee build.log | egrep -i '(warn|error)'
這個命令在雙核心CPU環境用背景建置並記錄全部的建置輸出到 build.log 且顯示warnings和error的部分到螢幕上。
使用beep聲提示
依照你的使用的CPU,建置程序需要一些時間或更久。你可以使用 echo -e '\a
'來做聲音的提示:
make V=s ; echo -e '\a'
映像檔位置
建置成功後,最新的映像檔會放在 <buildroot dir>/bin
資料夾。編譯過的檔案會依照目的平台來放置,如韌體是給ar71xx裝置的,就會被放在 <buildroot dir>/bin/ar71xx
資料夾裡。
例:假設你的 <buildroot dir> 是 /openwrt/trunk 這個二進制檔就在 /openwrt/trunk/bin/ar71xx.
清除編譯
如果需要清除建置環境的時候,以下的make參數可以使用:
清除
make clean
刪除 bin
和 build_dir
目錄內容。
清除目錄
make dirclean
除了刪除 /bin
和 /build_dir
的內容,並包含 /staging_dir
和 /toolchain
(跨平台編譯的工具). 'Dirclean' 是基本的清除指令。
清除編譯
make distclean
消滅所有的已編譯的部分或設定,並刪除以下載的套件和原始碼。
注意: 請小心使用,這個命令會 移除你的建置設定(.config),toolchain和其他所有的原始碼!
在OpenWrt的建置環境中還有很多的功能,以上已包含部分的概念。
建置範例
問題排除
首先使用“make V=s”選項來取得更多資訊。
Missing source code file, due to download problems
先檢查Makefile裡的URL路徑的結尾是否包含斜線,試著將它移除。 或是手動下載原始碼,並放到 “dl” 資料夾。
Compilation errors
試著更新原始碼和所有的feeds (注意! 可能會導致其他問題)。 檢查是否有相關的臭蟲 (TRAC), 可以使用filter來搜尋。 或是直接在那裏回報問題,請提供套件名稱,目的CPU和映像檔等以及原始碼和套件版本。 使用 make -j ... 有時會發生不固定的錯誤。回報前請先不使用-j選項編譯。
Bad environment variables
GREP_OPTIONS
不應該有--initial-tab
或是其他會影響輸出的選項。SED
不應該被設定。如果已存在編譯前請執行 `unset SED` 。 (參照 Ticket 10612.)
I can't find my <package> in menuconfig
- 請先試過這個命令 See this.
./scripts/feeds install <package>
- 也許你找錯子目錄了。請參考套件的
Makefile
。cat package/feeds/packages/<package>/Makefile
找到如下:
define Package/<package>/Default
SUBMENU:=Firewall
SECTION:=net
CATEGORY:=Network
|
Error: No rule to make target...
請確認路徑是以 package
資料夾開始,並確認資料夾存在。feeds
和 package/feeds
資料夾的結構是不一樣的。 See this.
- 錯誤:
make feeds/packages/utils/screen/compile V=s
- 正確:
make package/feeds/packages/screen/compile V=s
WARNING: skipping <package> -- package not selected
執行 make menuconfig
並開啟這個套件。 把它標記為 <*>
或 <M>
讓編譯正常. See this.