OpenWRT 編譯過程


 

 

一、使用Ubuntu編譯OpenWRT源碼

第一步:安裝基礎軟件

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

 

第二步:克隆代碼

git clone https://git.openwrt.org/openwrt/openwrt.git/
或者分支 https://github.com/lede-project/source.git cd openwrt ./scripts/feeds update -a // 更新最新的包 ./scripts/feeds install -a // 下載所有安裝所有包 目錄 package/feeds/
# 使用feeds.conf.default 默認配置進行軟件包的更新與安裝

make defconfig // 檢查編譯工具是否全,生成.config文件
make menuconfig // 打開編譯菜單

 

解釋 

OpenWRT Feed 機制

參考文檔: https://openwrt.org/docs/guide-developer/feeds

在Openwrt系統中,“feed”是一系列的軟件包,這些軟件包需要通過一個統一的接口地址進行訪問。

“feed”軟件包中的軟件包可能分布在遠程服務器上、在svn上、在本地文件系統中或者其他的地方,

用戶可以通過一種支持feed機制的協議,通過同一個地址進行訪問。

 

第三步:配置

Target System - 表示目標機器CPU型號

Target Profile - 表示目標機器設備型號

 

第四步:編譯

make V=99    // V = verbose 全部都顯示

 

解釋 

clean 命令

make clean      # rm -rf bin  build_dir

make dirclean  # rm -rf bin build_dir staging_dir toolchain logs 

make distclean # 刪除以上所有文件 , dl 和 .config

 

對於特定組件進行clean

make target/linux/clean V=s

make package/luci/clean

 

 

 

二、OpenWRT BuildRoot 環境

OpenWRT 源碼是由一堆makefile 和 補丁組成的,源代碼中不包括任何的源代碼或內核代碼,使用腳本與

makefile來定義需要下載哪些文件與打上補丁。

代碼結構如下

 

tools - 包含了從網上下載編譯OpenWRT所有的編譯工具

toolchain - 包含了 kernel 頭文件,C庫,binutils, debugger等

target - 包含了特定平台的文件,固件鏡像和內核構建過程的索引,以及生成編譯器個編譯工具。

            其中linux目錄下為各個平台<arch>的相應的內核patches,

            配置文件等,imagebuilder目錄則掃描如何生成這個平台的固件。源碼包就有的。

            用來指導如何編譯firmware和內核,以及sdk。

package - 在openwrt中,基礎的軟件包目錄為package,擴展的軟件包在feeds中,feeds中的軟件擴展了openwrt的基本功能,

                 它將所有的軟件鏈接到package/feeds中。這些軟件大多數都是編譯成.ipk格式的。這里面有內核模塊文件。

                 有各種軟件的源碼,以及patch文件和Makefile用來下載源碼的。源碼包就有。里面是隨openwrt主版本就提供的包。

                 除了用戶態的N多模塊外,還有kernel目錄,用來定義內核模塊

feeds -  make之后的新增目錄。里面存放的就是按照feeds.conf.default文件中列舉的要處理的文件,所展開得到的目錄。

             目錄中存放的東西,和package目錄中大致相似。指導如何下載和編譯對應模塊的)。

scripts - Perl腳本管理OpenWRT包的安裝與卸載

dl - 編譯工具,目標,package所需要的軟件包將從網上下載放到dl目錄中
build_dir - 一個臨時目錄,用來將所有需要編譯的軟件源碼放到這個目錄中進行編譯。它包括一下三個目錄:
                 build_dir/host:  與編譯目標無關的工具的臨時文件夾
                 build_dir/<arch>*: 作為所有目標,package編譯的臨時目錄
                 build_dir/toolchain-<arch>*:  編譯特定體系的交叉編譯鏈的文件夾
         
staging_dir - 用於存放構建目標系統鏡像的工具軟件,包括:
                     staging_dir/host:  宿主系統使用的工具
                     staging_dir/<arch>*:  目標系統使用的軟件軟件包
                     staging_dir/<toolchain-<arch>*: 交叉編譯工具鏈
                     目錄的作用是:build_dir是編譯的地方,那么這里就是把build_dir的結果放在了staging_dir目錄了。
 
bin目錄 - make之后的新增目錄,用來存放make的結果。
               比如我是用來編譯ramips的,則此目錄中會有:ramips子目錄,其中又包含:
               packages子目錄(里面含有各種.ipk文件,以及一個Packages文件用來介紹此目錄中的每個ipk文件)和可以燒入路由器的***.bin固件。
 
Makefile文件:make命令的總入口
rules.mk文件:定義了一系列在make時使用的規則
.config隱藏文件:makemenuconfig后的保存的配置文件。  
.config.old隱藏文件:老的.config文件

 

簡言之,編譯過程如下:

1. 下載交叉編譯工具,內核頭文件,C庫等。

2. 設置 staging_dir 目錄,交叉編譯的toolchain會安裝到這里。

3. 創建 dl 目錄, 所有的第三方源碼包會被下載到這里

4. 創建build_dir目錄, 用戶態工具會被編譯到這里

5. 創建 build_dir/target-arch/root 和 目標平台根文件系統

6. 在根文件系統中安裝所有包,最后生成的鏡象會在bin/目錄中

 

手動編譯過程如下

make download 下載所有已選擇的軟件代碼壓縮包

1. make tools/install

2. make toolchain/install

3. make target/compile

4. make package/cleanup

5. make package/compile   # 編譯包

6. make package/install      #  安裝包

7. make package/preconfig

8. make target/install

9. make package/index

 

單獨編譯軟件包

make package/tcpdump/clean  清除編譯生成的文件

make package/tcpdump/prepare 進行編譯准備

make package/tcpdump/configure  根據設置選項進行配置並生成Makefile

make package/tcpdump/compile   根據生成的Makefile進行編譯

make package/tcpdump/install  生成安裝包

 

 

 

三、OpenWRT In Qemu

1. 配置編譯文件

make menuconfig

 

Target System -  選擇 MIPS Malta CoreLV board(qemu)

Subtarget - Little Endian

Target Profile - Default

Target Image - 選擇 ext4

Global Build Settings - 默認即可

 

2. 編譯 make V=99

 

3. 編譯完成后,在目錄 bin/target/下有一個malta目錄

ubuntu:~/openwrt/bin/targets/malta/le$ ls -l
total 272708
-rw-r--r-- 1 ubuntu ubuntu       329 Sep 10 13:39 config.seed
-rw-r--r-- 1 ubuntu ubuntu      1959 Sep 10 13:59 openwrt-malta-le-default.manifest
-rw-r--r-- 1 ubuntu ubuntu 268435456 Sep 10 13:59 openwrt-malta-le-root.ext4
-rw-r--r-- 1 ubuntu ubuntu   2727322 Sep 10 13:59 openwrt-malta-le-uImage-gzip
-rw-r--r-- 1 ubuntu ubuntu   1940771 Sep 10 13:59 openwrt-malta-le-uImage-lzma
-rwxr-xr-x 1 ubuntu ubuntu   6125260 Sep 10 13:59 openwrt-malta-le-vmlinux.elf
drwxr-xr-x 2 ubuntu ubuntu      4096 Sep 10 13:59 packages
-rw-r--r-- 1 ubuntu ubuntu       556 Sep 10 14:00 sha256sums
ubuntu:~/openwrt/bin/targets/malta/le$ 

 

 

4. 拷貝 openwrt-malta-le-root.ext4 與 openwrt-malta-le-vmlinux.elf 文件

 

5.  安裝軟件

sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin

 

6. 運行

sudo qemu-system-mipsel -M malta -hda openwrt-malta-le-root.ext4 -kernel openwrt-malta-le-vmlinux.elf -nographic -append "root=/dev/sda console=tty50"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM