「隨筆」OpenWrt 固件編譯過程:本地編譯

OpenWrt 的編譯可以分為兩種方式:

  1. 本地的物理機/虛擬機/WSL(windows sub-linux)來執行編譯工作。
  2. 利用 GitHub 提供的 Action 功能,編寫 continuous integration (CI) workflows 來實現在線雲編譯。

本篇先介紹一下本地編譯的方法:

第一步:依賴

<code>sudo apt-get install subversion g++ zlib1g-dev build-essential git python rsync man-dbsudo apt-get install libncurses5-dev gawk gettext unzip file libssl-dev wget zip time/<code>

第二步:克隆

源碼可以使用官方的或是第三方維護的,當然你也可以用官方的源碼加上一些你喜歡的 package 來組成自己的特有包來編譯。

OpenWrt 官方:

<code>Git clone https://github.com/openwrt/openwrt.git/<code>

或者第三方維護的:

<code>Git clone https://github.com/coolsnowwolf/lede.git/<code>

由 GitHub 拉取代碼要是沒有代理的話速度會很慢,這裡分享一個技巧:

你可以將倉庫先由 GitHub 拉到國內的 “碼雲” 上,然後再由碼雲拉回本地,這樣中轉一下,速度就快多了碼雲: https://gitee.com/

第三步:更新

在 Openwrt 系統中,“feed”是一系列的軟件包,這些軟件包需要通過一個統一的接口地址進行訪問。“feed”軟件包中的軟件包可能分佈在遠程服務器上、在 SVN 上、在本地文件系統中或者其他的地方,用戶可以通過一種支持 feed 機制的協議,通過同一個地址進行訪問。

在執行更新前,請記得修改 feeds.conf.default 文件裡面的源路徑。(當然要是你的網絡連接國外的速度很快,請忽略)

這是我碼雲上的 openwrt feed 源列表:

<code>src-git packages [email protected]:yfdoor/openwrt-packages.gitsrc-git luci [email protected]:yfdoor/openwrt-luci.gitsrc-git routing [email protected]:yfdoor/openwrt-routing.gitsrc-git telephony [email protected]:yfdoor/openwrt-telephony.git/<code>

然後執行:

<code>./scripts/feeds update -a    // 更新./scripts/feeds install -a   // 安裝/<code>

第四步:配置

<code>make defconfig               // 檢查編譯工具是否全,生成 .config 文件make menuconfig              // 打開編譯菜單,自定義項目,更新 .config 文件/<code>

第五步:下載

編譯前最好先執行一下下載,當然你也可以跳過這步,直接編譯。編譯過程會自動執行下載。下載相關的工具包會放到 dl 文件夾。

<code>make download V=s/<code>

第六步:編譯

<code>make V=99 or V=s   // V = verbose 全部都顯示/<code>

總結:

OpenWRT 源碼是由一堆 makefile 和補丁組成的,源代碼中不包括任何的源代碼或內核代碼,使用腳本與 makefile 來定義需要下載哪些文件與打上補丁。因此一個好的可以科學上網的網絡環境是很重要的。90% 編譯失敗都是網絡的原因,請仔細查看失敗後的報錯信息來逐步 debug。

簡言之,編譯過程如下:

  1. 下載交叉編譯工具,內核頭文件,C 庫等。
  2. 設置 staging_dir 目錄,交叉編譯的 toolchain 會安裝到這裡。
  3. 創建 dl 目錄, 所有的第三方源碼包會被下載到這裡
  4. 創建 build_dir 目錄, 用戶態工具會被編譯到這裡
  5. 創建 build_dir/target-arch/root 和 目標平臺根文件系統
  6. 在根文件系統中安裝所有包,最後生成的鏡象會在 bin/目錄中

注意事項:

  1. 網絡,網絡,可以翻牆的網絡。
  2. 若是使用 WSL 編譯,請注意 openwrt 要求放的磁盤位置區分大小寫。
    fsutil.exe file setCaseSensitiveInfo (path) enable //啟用 NTFS 區分大小寫功能
  3. 若是使用 WSL 編譯,在 windows 和 Linux 文件系統轉移文件的時候請注意文件權限的問題。
  4. 若是使用 WSL 編譯,借用主機的 SSR 的時候,可以使用 proxychains 來實現。
  5. 若編譯過程中卡在某個文件的下載上,可關掉進程,手動將相應的文件下載到 dl 文件夾。

附錄:

<code>make clean     #刪除 bin build_dirmake dirclean  #刪除 bin build_dir staging_dir toolchain logsmake distclean #刪除以上所有文件,dl 和 .configmake package/yfdoor/luci-adb-plus/compile V=s#單獨編譯軟件包 ake clean /<code>


分享到:


相關文章: