本文描述buildroot的詳細使用步驟,以恩智浦imx6ull處理器為運行平臺。
一、獲取buildroot
從https://buildroot.org/鏈接中下載buildroot:
這里小生選擇buildroot-2022.02.6.tar.xz版本:
在Ubuntu20.04下解壓縮軟件包后,其目錄結(jié)構(gòu)大致如下所示:
還是習慣性的剖析一下其目錄中的內(nèi)容:頂層目錄下放置了一些都很常見的文件,還是一樣的,makefile最重要,Config.in文件是一個makefile文件的配置輸入,該文件由makefile讀取解析,README文件中描述了buildroot的使用方法:
(1)在arch目錄下,以arch.xx的命名方式編寫了針對特定架構(gòu)的配置選項和對應的參數(shù):
(2)在board目錄下,大概放置了關于有些芯片廠家硬件平臺相關的文件,以目錄進行劃分和規(guī)劃。
(3)在boot目錄下,放置了關于bootloader的相關目錄,目錄中放置的是一個Config.in配置輸入描述文件和一個具體的makefile描述文件。
(4)在configs目錄下,放置了許多與具體芯片廠商板卡的默認配置,在配置buildroot時,可以使用該目錄下的文件。
(5)docs目錄,肯定是放置了與buildroot的描述文檔,熟悉buildroot的必看目錄。
(6)在fs目錄下,放置buildroot支持的文件系統(tǒng),以文件系統(tǒng)名稱命名,目錄中同樣放置了Config.in配置輸入描述文件和一個具體的makefile文件:
(7)在linux目錄下,放置與linux相關的配置文件。
(8)package目錄,是buildroot的軟件包管理目錄,我們知道buildroot支持很多軟件包的自動編譯構(gòu)建,不同的軟件包如果需要加入到buildroot中,則需要在該目錄下添加。該目錄下的子目錄太多啦。
(9)在system目錄下,放置了描述編譯構(gòu)建出的文件系統(tǒng)的配置文件。
(10)在toolchain目錄下,放置與編譯構(gòu)建套件相關的配置文件。buildroot支持內(nèi)部自動編譯構(gòu)建出編譯套件,也支持外部的編譯構(gòu)建套件。
(11)在utils目錄下,該目錄下包含各種與buildroot編譯構(gòu)建相關的工具。
至此,buildroot的目錄結(jié)構(gòu)描述完了,可以明確知道在沒有開始編譯構(gòu)建之前,她是一個非常小的目錄,目錄中也沒有包含具體的軟件包的工程程序,也沒有編譯過程文件和目標文件等,靠著一系列的配置文件和makefile完成整個構(gòu)建過程,小而精美。
二、配置buildroot
在buildroot目錄下打開終端(一定是要在buildroot目錄路徑下),輸入make menuconfig將編譯構(gòu)建出宿主機上的圖形配置界面:
在上圖中,可以看見10個配置選項:
(1)Target options:用于為構(gòu)建目標選擇特性和配置參數(shù)。
(2)Build options:該選項用于配置編譯構(gòu)建相關的配置參數(shù)。
(3)Toolchain:該選項用于配置工具鏈和編譯器特性。
(4)System configuration:該選項用于配置生成的文件系統(tǒng)的配置文件和啟動特性。
(5)Kernel:該選項用于配置linux內(nèi)核特征和參數(shù)。
(6)Target packages:該選項用于選擇和配置所需要的軟件包和軟件環(huán)境。
(7)Filesystem images:該選項用于配置經(jīng)buildroot編譯構(gòu)建后的文件系統(tǒng)的鏡像格式。
(8)Bootloaders:該選項用于選擇和配置啟動加載程序。
(9)Host utilities:該選項用于配置是否構(gòu)建編譯出宿主機上的一些工具套件。
(10) Legacy config options:隨著歷史版本更迭原因,該選項用于配置一些遺留下來的特性。
1、在實際使用中,有些芯片原廠會基于buildroot來進行特定芯片的嵌入式linux軟件環(huán)境構(gòu)建。這時候他們往往會創(chuàng)建一個比較大的開發(fā)目錄,將linux內(nèi)核、bootloader、buildroot和其他的開發(fā)庫歸入一個目錄中,并在該目錄下編寫自己的構(gòu)建腳本,形成一個軟件開發(fā)的SDK,發(fā)布給硬件板卡提供商或者第三方的合作商使用。在這種情況下,直接使用寫好的腳本構(gòu)建linux開發(fā)環(huán)境即可,但是其體量很大,也不知道在里面搞了些啥事情,有時候還要單獨構(gòu)建,哈哈。
2、當然,也有將linux內(nèi)核和bootloader單獨使用的情況,這種情況下,只需要使用buildroot構(gòu)建出根文件系統(tǒng),然后再配置自己的軟件開發(fā)棧就可以了。本文就基于這種情況來描述、記錄buildroot的使用。
三、配置過程記錄
本文基于恩智浦的imx6ull平臺使用buildroot構(gòu)建根文件系統(tǒng)。小生使用得是 MCIMX6Y2CVM08AB。
MCIMX6Y2CVM08AB是一款主頻800MHz的工業(yè)級Cortex-A7核心的處理器芯片。自帶32KB的L1指令和數(shù)據(jù)Cache、128KB的L2 Cache,集成NEON,集成雙精度硬件浮點計算單元VFPv3,并具有128KB OCRAM、2個通用定時器(GPT)、4個周期定時器(EPIT)、8個PWM、1個SDMA 控制器、4個ECSPI、3個看門狗、3個SAI、4個IIC、7個串口、2個USB(高速,帶PHY)、2個FlexCAN、2個12位ADC、1個SPDIF接口、1個 SRTC、1個RTC、2個USDHC接口、1個RGB LCD控制器(ELCDIF)、2個10/100M以太網(wǎng)MAC控制器、1個攝像頭接口、1個硬件隨機數(shù)生成器以及124個通用IO口等。
上面簡單介紹恩智浦的這款芯片,小生下文以構(gòu)建一個輕量級的根文件系統(tǒng)為目標展開:
首先描述一下小生的開發(fā)環(huán)境:
虛擬機16 + ubuntu20.04
硬件配置:
(磁盤容量最好配置大些,小生這里都有點小了)
(1)配置Target options選項
選項展開比較多,后面的選項配置都會以下列所示的方式描述:等號左邊為配置項,等號右邊為具體的配置選擇:
Target?options ->?Target?Architecture??????=?ARM?(little?endian) ->?Target?Binary?Format??????=?ELF ->?Target?Architecture?Variant??=?cortex-A7 ->?Target?ABI???????????=?EABIhf ->?Floating?point?strategy????????=?NEON/VFPv4 ->?ARM?instruction?set????????????=?ARM
完成后如下圖所示:
(2)Build options配置選項
這里不需要配置。
(3)配置Toolchain選項
由于小生已經(jīng)準備好了交叉編譯工具套件gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf,此處需設置為:
Toolchain ->?Toolchain?type?=?External?toolchain ->?Toolchain?=?Custom?toolchain ->?Toolchain?origin?=?Pre-installed?toolchain ->?Toolchain?path?=?此處寫具體編譯構(gòu)建套件的絕對路徑 -> Toolchain prefix =?$(ARCH)-linux-gnueabihf。根據(jù)具體的編譯構(gòu)建套件的名稱填寫,$(ARCH)不用修改。 ->External toolchain gcc version =?根據(jù)具體的gcc版本對應的版本。(這個配置項需要配置好,如 果選擇不合適,可能有些軟件庫無法選擇甚至編譯構(gòu)建過程無法完成,這時候重新選擇后再編譯就行,直到編譯構(gòu)建通過) ->External toolchain kernel headers series =?根據(jù)具體的linux版本選擇。 ->External?toolchain?C?library?=?glibc/eglibc //后面的配置項可以不用選擇或者默認即可
配置完成后,如下圖所示:
(4)System configuration配置
在該配置選項下選擇根文件系統(tǒng)相關的配置。
System?configuration ->Root?FS?skeleton?=?default?target?skeleton ->?System?hontname?=?填寫系統(tǒng)名稱(任意) ->System?banner?=?填寫系統(tǒng)標語(任意) ->Passwords?encoding?=?sha-256 ->?Init?system?=?BusyBox??//這里構(gòu)建Busybox啟動的根文件系統(tǒng) ->/dev?management?=?Dynamic?using?devtmpfs?only ->?Enable?root?login?with?password?=?選擇/并設置登錄密鑰(123456) //其他配置選項不變,保持默認即可
(5)Kernel配置
由于此處只編譯構(gòu)建出根文件系統(tǒng),所以不選擇linux kernel配置選項,則不會自動下載和編譯構(gòu)建linux內(nèi)核。
(6)Target packages配置
本文的構(gòu)建目標是一個輕量級的根文件系統(tǒng),所以Target packages下的配置選項則不用選擇(默認也是沒有選中的)
(7)Filesystem images配置
該選項下用于配置選擇文件系統(tǒng)的鏡像格式,如果是用nfs或tftp方式掛載根文件系統(tǒng)進行調(diào)試,F(xiàn)ilesystem images則不用進行任何配置。
(8)Bootloaders配置
Bootloaders選項不用配置。
(9)Host utilities配置
Host utilities選項不用配置。
(10)Legacy config options配置
Legacy config options選項不用配置。
通過以上步驟就根據(jù)實際的構(gòu)建需求對buildroot進行了配置,選擇< Save >保存buildroot的配置選項參數(shù)。保存后,在終端使用sudo make -j12進行編譯構(gòu)建。
編譯構(gòu)建過程中問題
(1)報錯Incorrect selection of kernel headers: expected 4.6.x, got 4.0.x,并終止構(gòu)建:
出現(xiàn)這個問題的原因是在交叉編譯器的路徑下有一個內(nèi)核版本代碼,buildroot在執(zhí)行check-kernel-headers.sh時會檢測這個內(nèi)核版本代碼。
該內(nèi)核版本描述代碼定義在路徑/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/linux/version.h中:
#define?LINUX_VERSION_CODE?262144
十進制262144轉(zhuǎn)換為十六進制則為:40000,在配置buildroot時選擇為4.6.x版本:
所以編譯構(gòu)建不能通過,為了解決這個問題,可以直接修改version.h中的LINUX_VERSION_CODE宏定義值為:
#define?LINUX_VERSION_CODE?263680?//263680?=?40600(h)
即可解決。
編譯構(gòu)建后結(jié)果
在buildroot構(gòu)建過程中,會連接網(wǎng)絡下載對應的軟件包源碼,下載的這些軟件包存放在output/build目錄中,如下圖所示:
(由于本文構(gòu)建的根文件系統(tǒng)也沒有配置太多的軟件包,所以生成的目錄就少)
編譯構(gòu)建后生成的目標結(jié)果存放于output/images目錄中:
(將rootfs.tar解壓縮,然后則可以使用nfs/tftp掛載根文件系統(tǒng)進行測試啦)
在測試根文件系統(tǒng)時,會發(fā)現(xiàn)進入命令行后,輸入命令的時候命令行前面一直都是“#”,如果我們進入到某個目錄的話前面也不會顯示當前目錄路徑。這是由于PS1變量參數(shù)設置錯誤造成的,需要重新設置一下,PS1 變量用于設置命令提示符格式,可選參數(shù)含義如下所示:
! 顯示該命令的歷史記錄編號。 #?顯示當前命令的命令編號。 $?顯示$符作為提示符,如果用戶是 root 的話,則顯示#號。 \?顯示反斜杠。 d 顯示當前日期。 h 顯示主機名。 打印新行。 nn 顯示 nnn 的八進制值。 s 顯示當前運行的 shell 的名字。 顯示當前時間。 u 顯示當前用戶的用戶名。 W 顯示當前工作目錄的名字。 w?顯示當前工作目錄的路徑
修改方法:打開/etc/profile 文件,找到如下所示內(nèi)容:
if?[?"$PS1"?];?then ?if?[?"`id?-u`"?-eq?0?];?then ??export?PS1='#?' ?else ??export?PS1='$?' ?fi fi
修改為如下代碼:
if?[?"$PS1"?];?then ?if?[?"`id?-u`"?-eq?0?];?then ??export?PS1='[u@h]:w$#' ?else ??export?PS1='[u@h]:w$$' ?fi fi
即可解決。
總結(jié)
本文記錄了buildroot的使用步驟,描述了針對imx6ull處理器芯片的buildroot的輕量級根文件系統(tǒng)完整構(gòu)建過程。由于是輕量級的構(gòu)建,所以大約需要5-6分鐘就可以編譯構(gòu)建完成。
相比較于busybox,buildroot構(gòu)建出的根文件系統(tǒng)功能更加完善,配置文件也更加完整,不用再去手動添加和修改一些linux系統(tǒng)啟動必須的文件了,非常適合更復雜的嵌入式linux系統(tǒng)的構(gòu)建和開發(fā)。
編輯:黃飛
?
評論
查看更多