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