根文件系统构建(Buildroot 方式)
目錄
- 何為buildroot?
- buildroot 簡(jiǎn)介
- buildroot 下載
- buildroot 構(gòu)建根文件系統(tǒng)
- 配置buildroot
- 編譯buildroot
- buildroot 根文件系統(tǒng)測(cè)試
- buildroot 第三方軟件和庫(kù)的配置
- buildroot 下的busybox 配置
- busybox 配置
- busybox 中文字符的支持
- 編譯busybox
- 根文件系統(tǒng)測(cè)試
前面我們學(xué)習(xí)了如何使用busybox 來(lái)構(gòu)建根文件系統(tǒng),但是busybox 構(gòu)建的根文件系統(tǒng)不齊全,很多東西需要我們自行添加,比如lib 庫(kù)文件。在我們后面的驅(qū)動(dòng)開(kāi)發(fā)中很多第三方軟件也需要我們自己去移植,這些第三方軟件有很多又依賴其他的庫(kù)文件,導(dǎo)致移植過(guò)程非常的繁瑣。本章我們來(lái)學(xué)習(xí)一下另外一種實(shí)用的根文件系統(tǒng)構(gòu)建方法,那就是使用buildroot 來(lái)構(gòu)建根文件系統(tǒng)。
何為buildroot?
buildroot 簡(jiǎn)介
在《第三篇系統(tǒng)移植篇》我們最后講解了如何使用busybox 構(gòu)建文件系統(tǒng),busybox 僅僅只是幫我們構(gòu)建好了一些常用的命令和文件,像lib 庫(kù)、/etc 目錄下的一些文件都需要我們自己手動(dòng)創(chuàng)建,而且busybox 構(gòu)建的根文件系統(tǒng)默認(rèn)沒(méi)有用戶名和密碼設(shè)置。在后續(xù)的實(shí)驗(yàn)中,我們還要自己去移植一些第三方軟件和庫(kù),比如alsa、iperf、mplayer 等等。那么有沒(méi)有一種傻瓜
式的方法或軟件,它不僅包含了busybox 的功能,而且里面還集成了各種軟件,需要什么軟件就選擇什么軟件,不需要我們?nèi)ヒ浦病4鸢缚隙ㄊ怯械?#xff0c;buildroot 就是這樣一種工具,buildroot比busybox 更上一層樓,buildroot 不僅集成了busybox,而且還集成了各種常見(jiàn)的第三方庫(kù)和軟件,需要什么就選擇什么,就跟我們?nèi)コ宰灾鸵粯?#xff0c;想吃什么就拿什么。buildroot 極大的方便了我們嵌入式Linux 開(kāi)發(fā)人員構(gòu)建實(shí)用的根文件系統(tǒng)。
從busybox 開(kāi)始一步一步的構(gòu)建根文件系統(tǒng)適合學(xué)習(xí)、了解根文件系統(tǒng)的組成,但是不適合做產(chǎn)品(主要是自己構(gòu)建的話會(huì)有很多不完善、沒(méi)有注意到的細(xì)節(jié))。buildroot 會(huì)幫我們處理好各種細(xì)節(jié),根文件系統(tǒng)也會(huì)更加的合理、有效。因此在做產(chǎn)品的時(shí)候推薦大家使用buildroot 來(lái)構(gòu)建自己的根文件系統(tǒng),當(dāng)然了,類(lèi)似buildroot 的軟件還有很多,比如后面要講的yocto。
buildroot 和uboot、Linux Kernel 很類(lèi)似,我們需要到其官網(wǎng)上下載源碼,然后對(duì)其進(jìn)行配置,比如設(shè)置交叉編譯器、設(shè)置目標(biāo)CPU 參數(shù)等,最主要的就是選擇所需要的第三方庫(kù)或軟件。一切配置好以后就可以進(jìn)行編譯,編譯完成了以后就會(huì)在一個(gè)文件夾里面存放好編譯結(jié)果,也就是根文件系統(tǒng)。
buildroot 下載
buildroot 源碼肯定是要從buildroot 官網(wǎng)下載,官網(wǎng)地址為https://buildroot.org/,打開(kāi)以后的官網(wǎng)界面如圖A1.1.2.1 所示:
點(diǎn)擊圖A1.1.2.1 中的“DOWNLOAD”按鈕即可打開(kāi)buildroot 的下載界面,如圖A1.1.2.2所示:
可以看出,在寫(xiě)本教程的時(shí)候最新的LTS(長(zhǎng)期支持版)版buildroot 為2019.02.6,分為.gz和.bz2 兩種壓縮格式,這里我就使用右側(cè)的.bz2 壓縮格式的源碼,選中以后下載即可。我們已經(jīng)將其放到了開(kāi)發(fā)板光盤(pán)中,路徑為:1、例程源碼-》8、buildroot 源碼-》buildroot-2019.02.6.tar.bz2,
一切準(zhǔn)備好以后就可以使用buildroot 構(gòu)建根文件系統(tǒng)了。
buildroot 構(gòu)建根文件系統(tǒng)
配置buildroot
將buildroot 源碼buildroot-2019.02.6.tar.bz2 拷貝到ubuntu 中,也就是我們前面創(chuàng)建的tool目錄下。拷貝完成以后對(duì)其進(jìn)行解壓,命令如下:
tar -vxjf buildroot-2019.02.6.tar.bz2解壓完成以后就會(huì)得到一個(gè)名為“buildroot-2019.02.6”的目錄,此目錄就是我們解壓得到的buildroot 源碼,進(jìn)入到此目錄中,此目錄下的文件如圖A1.2.1.1 所示:
buildroot 和uboot、Linux kernel 一樣也支持圖形化配置,輸入如下命令即可打開(kāi)圖形化配置界:
打開(kāi)以后的圖形化配置界面如圖A1.2.1.2 所示:
接下來(lái)我們就依次配置buildroot,配置完成以后就可以進(jìn)行編譯了。
1、配置Target options
首先配置Target options 選項(xiàng),需要配置的項(xiàng)目和其對(duì)應(yīng)的內(nèi)容如下(“=”號(hào)后面是配置項(xiàng)要選擇的內(nèi)容!):
配置完成以后如圖A1.2.1.3 所示:
2、配置Toolchain
此配置項(xiàng)用于配置交叉編譯工具鏈,也就是交叉編譯器,這里設(shè)置為我們自己所使用的交叉編譯器即可。buildroot 其實(shí)是可以自動(dòng)下載交叉編譯器的,但是都是從國(guó)外服務(wù)器下載的,鑒于國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境,強(qiáng)烈推薦大家設(shè)置成自己所使用的交叉編譯器。需要配置的項(xiàng)目和其對(duì)應(yīng)的內(nèi)容如下:
Toolchain 下幾個(gè)比較重要的選項(xiàng)需要說(shuō)明一下,如下所示:
Toolchain:設(shè)置為Custom toolchain,表示使用用戶自己的交叉編譯器。
Toolchain origin:設(shè)置為Pre-installed toolchain,表示使用預(yù)裝的交叉編譯器。
Toolchain path:設(shè)置自己安裝的交叉編譯器絕對(duì)路徑!buildroot 要用到。
Toolchain prefix:設(shè)置交叉編譯器前綴,要根據(jù)自己實(shí)際所使用的交叉編譯器來(lái)設(shè)置,比如我們使用的是arm-linux-gnueabihf-gcc,因此前綴就是$(ARCH)-linux-gnueabihf,其中ARCH我們前面已經(jīng)設(shè)置為了arm。
3、配置System configuration
此選項(xiàng)用于設(shè)置一些系統(tǒng)配置,比如開(kāi)發(fā)板名字、歡迎語(yǔ)、用戶名、密碼等。需要配置的項(xiàng)目和其對(duì)應(yīng)的內(nèi)容如下:
在System configuration 選項(xiàng)中可以配置平臺(tái)名字,登錄密碼等信息。
4、配置Filesystem images
此選項(xiàng)配置我們最終制作的根文件系統(tǒng)為什么格式的,配置如下:
對(duì)于I.MX6U 來(lái)說(shuō)此選項(xiàng)不用配置,因?yàn)槲覀兪峭ㄟ^(guò)Mfgtool 工具將根文件系統(tǒng)燒寫(xiě)到開(kāi)發(fā)板上的EMMC/SD 卡中,燒寫(xiě)的時(shí)候需要自己對(duì)根文件系統(tǒng)進(jìn)行打包。
5、禁止編譯Linux 內(nèi)核和uboot
buildroot 不僅僅能構(gòu)建根文件系統(tǒng),也可以編譯linux 內(nèi)核和uboot。當(dāng)配置buildroot,使能linux 內(nèi)核和uboot 以后buildroot 就會(huì)自動(dòng)下載最新的linux 內(nèi)核和uboot 源碼并編譯。但是我們一般都不會(huì)使用buildroot 下載的linux 內(nèi)核和uboot,因?yàn)閎uildroot 下載的linux 和uboot官方源碼,里面會(huì)缺少很多驅(qū)動(dòng)文件,而且最新的linux 內(nèi)核和uboot 會(huì)對(duì)編譯器版本號(hào)有要求,可能導(dǎo)致編譯失敗。因此我們需要配置buildroot,關(guān)閉linux 內(nèi)核和uboot 的編譯,只使用buildroot 來(lái)構(gòu)建根文件系統(tǒng),首先是禁止Linux 內(nèi)核的編譯,配置如下:
如圖A1.2.1.4 所示:
接著禁止編譯Uboot,配置如下:
如圖A1.2.1.5 所示:
6、配置Target packages
此選項(xiàng)用于配置要選擇的第三方庫(kù)或軟件、比如alsa-utils、ffmpeg、iperf 等工具,但是現(xiàn)在我們先不選擇第三方庫(kù),防止編譯不下去!先編譯一下最基本的根文件系統(tǒng),如果沒(méi)有問(wèn)題的話再重新配置選擇第三方庫(kù)和軟件。否則一口吃太多會(huì)容易撐著的,編譯出問(wèn)題的時(shí)候都不知道怎么找問(wèn)題。
編譯buildroot
配置完成以后就可以編譯buildroot 了,編譯完成以后buildroot 就會(huì)生成編譯出來(lái)的根文件系統(tǒng)壓縮包,我們可以直接使用。輸入如下命令開(kāi)始編譯:
sudo make //注意,一定要加sudo,而且不能通過(guò)-jx 來(lái)指定多核編譯!!!buildroot 編譯的時(shí)候會(huì)先從網(wǎng)上下載所需的軟件源碼,有些軟件源碼可能下載不下來(lái),這個(gè)時(shí)候就需要我們自行處理,這個(gè)后面會(huì)詳細(xì)的講解。
buildroot 編譯過(guò)程會(huì)很耗時(shí),可能需要幾個(gè)小時(shí),請(qǐng)耐心等待!
buildroot 因?yàn)橐獜木W(wǎng)上下載源碼,因此可能存在有些源碼無(wú)法下載或下載很慢的情況,比如如圖A1.2.2.1 所示:
可以看出圖A1.2.2.1 中正在下載cmake-3.8.2.tar.gz 這個(gè)壓縮包,大小是7.2MB,當(dāng)前下載網(wǎng)速是1.6KB/S ,需要用時(shí)71 分鐘,顯然這是無(wú)法忍受的!我們可以自行到https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz 這個(gè)網(wǎng)站上去將cmake-3.8.2.tar.gz 這個(gè)源碼下載下來(lái),然后拷貝到Ubuntu 中buildroot 源碼目錄下的dl 文件夾中,dl 文件夾專(zhuān)用用于存放下載下
來(lái)的源碼。
等待編譯完成,編譯完成以后就會(huì)在buildroot-2019.02.6/output/images 下生成根文件系統(tǒng),如圖A1.2.2.2 所示:
從圖A1.2.2.2 可以看出,編譯出來(lái)了多種格式的rootfs,比如ext2、ext4、ubi 等。其中rootfs.tar 就是打包好的根文件系統(tǒng),我們就使用rootfs.tar 進(jìn)行測(cè)試。在nfs 目錄下新建一個(gè)名為buildrootfs 的文件夾,然后將圖A1.2.2.2 中的rootfs.tar 拷貝到buildrootfs 目錄下并解壓,命令如下:
cd /home/zuozhongkai/linux/nfs //進(jìn)入到nfs 目錄下 mkdir buildrootfs //創(chuàng)建buildrootfs 目錄 cd buildrootfs //進(jìn)入到buildrootfs 目錄 cp ../../IMX6ULL/tool/buildroot-2019.02.6/output/images/rootfs.tar ./ //拷貝到rootfs.tar tar tar -vxf rootfs.tar //解壓縮rootfs.tar rm rootfs.tar //刪除rootfs.tar解壓縮完成以后的buildrootfs 目錄如圖A1.2.2.3 所示:
圖A1.2.2.3 就是使用buildroot 編譯出來(lái)的根文件系統(tǒng),我們可以通過(guò)nfs 掛載到開(kāi)發(fā)板上,然后對(duì)其進(jìn)行測(cè)試。
buildroot 根文件系統(tǒng)測(cè)試
buildroot 制作出來(lái)的根文件系統(tǒng)已經(jīng)準(zhǔn)備好了,接下來(lái)就是對(duì)其進(jìn)行測(cè)試。測(cè)試方法也是通過(guò)nfs 掛載的方式,啟動(dòng)uboot,修改bootargs 環(huán)境變量,設(shè)置nfsroot 目錄為Ubuntu 中的buildrootfs 目錄,命令如下:
setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.253: /home/zuozhongkai/linux/nfs/buildrootfs rw ip=192.168.1.251:192.168.1.253:192.168.1.1:255.255. 255.0::eth0:off'設(shè)置好以后啟動(dòng)系統(tǒng),進(jìn)入根文件系統(tǒng)以后如圖A2.2.3.1 所示:
在圖A2.2.3.1 中,首先要進(jìn)入到/lib/modules 目錄,但是默認(rèn)沒(méi)有,因此需要我們自行創(chuàng)建此目錄。buildroot 構(gòu)建的根文件系統(tǒng)啟動(dòng)以后會(huì)輸出我們前面設(shè)置的歡迎語(yǔ)“Welcome to alpha i.mx6ull”。然后需要輸入用戶名和密碼,用戶名是“root”,密碼就是我們前面配置buildroot 的時(shí)候設(shè)置的“123456”。輸入用戶名和密碼以后就可以進(jìn)入系統(tǒng)中,如圖A2.2.3.2 所示:
可以看出的buildroot 構(gòu)建的根文件系統(tǒng)運(yùn)行基本沒(méi)有問(wèn)題,但是這個(gè)根文件系統(tǒng)是最簡(jiǎn)單的,我們并沒(méi)有在buildroot 里面配置任何第三方的庫(kù)和軟件,接下來(lái)我們就配置buildroot,使能一些常見(jiàn)的第三方軟件。
buildroot 第三方軟件和庫(kù)的配置
我在前面學(xué)習(xí)的時(shí)候需要自行移植一些第三方的庫(kù)和軟件,比如alsa-lib、alsa-utils 等等,現(xiàn)在我們不需要自行移植這些第三方軟件和庫(kù)了,可以直接在buildroot 里面配置使能。比如我們現(xiàn)在配置使能alsa-lib、alsa-utils 這兩個(gè)軟件和庫(kù)。
1、使能alsa-lib
輸入make menuconfig,打開(kāi)buildroot 配置界面,配置路徑如下:
如圖A1.3.1 所示:
2、使能alsa-utils
接下來(lái)使能alsa-utils,路徑如下:
配置好以后如圖A1.3.2 所示:
等待編譯完成就可以使用新的根文件系統(tǒng)進(jìn)行測(cè)試了,將buildroot/images/rootfs.tar 拷貝到nfs 目錄下的buildroot 目錄中,然后重新解壓。注意,以前自己添加的文件并不會(huì)被刪除掉的,解壓命令如下:
解壓完成以后就可以使用alsa-utils 相關(guān)的軟件了,比如alsamixer,想想我們?cè)?jīng)在第六十五章中自行移植alsa-utils 的時(shí)候,那個(gè)過(guò)程叫一個(gè)復(fù)雜。通過(guò)buildroot 的話直接一個(gè)配置就可以搞定全部,方便快捷,大家可以自行嘗試去配置使能一些其他的第三方庫(kù)和軟件。
buildroot 下的busybox 配置
busybox 配置
buildroot 在構(gòu)建根文件系統(tǒng)的時(shí)候也是要用到busybox 的,既然用到了busybox 那么就涉及到busybox 的配置。buildroot 會(huì)自動(dòng)下載busybox 壓縮包,buildroot 下載的源碼壓縮包都存放在/dl 目錄下,在dl 目錄下就有一個(gè)叫做“busybox”的文件夾,此目錄下保存著busybox 壓縮包,如圖A1.4.1.1 所示:
可以看出,buildroot 下載的busybox 版本為1.29.3。要想編譯busybox,必須對(duì)圖A1.4.1.1中的壓縮包進(jìn)行解壓縮,buildroot 將所有解壓縮后的軟件保存在/output/build 軟件中,我們可以在找到/output/build/busybox-1.29.3 這個(gè)文件夾,此文件夾就是解壓后的busybox 源碼,文件內(nèi)容如圖A1.4.1.2 所示:
如果大家想要修改busybox 源碼的話就直接在圖A1.4.1.2 中找到相應(yīng)的文件,然后修改即可。我們現(xiàn)在是要配置buildroot 下的busybox,因此肯定要打開(kāi)busybox 的配置界面,在buildroot下打開(kāi)busybox 的配置界面輸入如下命令:
輸入以后就會(huì)打開(kāi)buildroot 下的busybox 配置界面,如圖A1.4.1.3 所示:
圖A1.4.1.3 就是我們最熟悉的busybox 配置界面了,大家想要配置什么就直接操作就行了,或者參考第三十八章即可。
busybox 中文字符的支持
在第三十八章我們數(shù)過(guò)了,busybox 對(duì)中文字符顯示做了限制,因此必須要修改相關(guān)的文件,具體修改過(guò)程參考38.2.2 小節(jié)即可,這里就不再贅述了。
編譯busybox
配置好以后就可以重新編譯buildroot 下的busybox,進(jìn)入到buildroot 源碼目錄下,輸入如下命令查看當(dāng)前buildroot 所有配置了的目標(biāo)軟件包,也就是packages:
sudo make show-targets結(jié)果如圖A1.4.3.1 所示:
圖A1.4.3.1 中列出了當(dāng)前buildroot 中所有使能了的packages 包,其中就包括busybox,如
果我們想單獨(dú)編譯并安裝busybox 的話執(zhí)行下面命令即可:
上述命令就會(huì)重新編譯busybox。編譯完成以后重新編譯buildroot,主要是對(duì)其進(jìn)行打包,輸入如下命令:
sudo make重新編譯完成以后查看一下output/images 目錄下rootfs.tar 的創(chuàng)建時(shí)間是否為剛剛編譯的,如果不是的話就刪除掉rootfs.tar,然后重新執(zhí)行“sudo make”重新編譯一下即可。最后我們使用新的rootfs.tar 啟動(dòng)Linux 系統(tǒng)。
根文件系統(tǒng)測(cè)試
buildroot 的根文件系統(tǒng)制作好以后就是測(cè)試工作了,測(cè)試內(nèi)容和第三十八章中一樣,這里就不贅述了。這里我們重點(diǎn)說(shuō)一下另外一個(gè)問(wèn)題,我們使用構(gòu)建的根文件系統(tǒng)啟動(dòng)以后會(huì)發(fā)現(xiàn),輸入命令的時(shí)候命令行前面一直都是“#”,如果我們進(jìn)入到某個(gè)目錄的話前面并不會(huì)顯示當(dāng)前目錄路徑,如圖A1.5.1 所示:
從圖A1.5.1 可以看出,我們當(dāng)前所處的目錄是/etc,但是前面的提示符一直是“#”,這樣不利于我們查看自己當(dāng)前所處的路徑。最好能像Ubuntu 一樣,可以指出當(dāng)前登錄的用戶名,主機(jī)名以及所處的目錄,如圖A1.5.2 所示:
我們現(xiàn)在就來(lái)設(shè)置,實(shí)現(xiàn)圖A1.5.2 中所示的效果。我們要先了解一下“PS1”這個(gè)環(huán)境變量,PS1 用于設(shè)置命令提示符格式,格式如下:
PS1 = ‘命令列表’命令列表中可選的參數(shù)如下:
\! 顯示該命令的歷史記錄編號(hào)。 \# 顯示當(dāng)前命令的命令編號(hào)。 \$ 顯示$符作為提示符,如果用戶是root 的話,則顯示#號(hào)。 \\ 顯示反斜杠。 \d 顯示當(dāng)前日期。 \h 顯示主機(jī)名。 \n 打印新行。 \nnn 顯示nnn 的八進(jìn)制值。 \s 顯示當(dāng)前運(yùn)行的shell 的名字。 \t 顯示當(dāng)前時(shí)間。 \u 顯示當(dāng)前用戶的用戶名。 \W 顯示當(dāng)前工作目錄的名字。 \w 顯示當(dāng)前工作目錄的路徑我們打開(kāi)/etc/profile 文件,找到如下所示內(nèi)容,然后將其屏蔽掉:
示例代碼A1.5.1 /etc/profile 文件要屏蔽的內(nèi)容 3 if [ "$PS1" ]; then 4 if [ "`id -u`" -eq 0 ]; then 5 export PS1='# ' 6 else 7 export PS1='$ ' 8 fi 9 fi上述代碼就是原始的設(shè)置PS1 環(huán)境變量的配置代碼,就是它將命令提示符設(shè)置為了固定的“#”,我們將其屏蔽掉,然后輸入如下所示內(nèi)容:
/etc/profile 添加的內(nèi)容 PS1='[\u@\h]:\w$:' export PS1第2 行就是設(shè)置PS1 環(huán)境變量,格式就是:
[user@hostname]:currentpath$:設(shè)置好以后的/etc/profile 文件內(nèi)容如圖A1.5.3 所示:
/etc/profile 文件修改完成以后重啟開(kāi)發(fā)板,這個(gè)時(shí)候我們就如到某個(gè)目錄的時(shí)候命令行就會(huì)有提示,如圖A1.5.4 所示:
從圖A1.5.4 可以看出,命令提示符顯示正常了,完整的顯示除了用戶名、主機(jī)名和當(dāng)前路徑。至此,buildroot 構(gòu)建根文件系統(tǒng)就已經(jīng)全部完成了,當(dāng)然了,很多第三方軟件本章并沒(méi)有使能,大家可以自行根據(jù)實(shí)際需求選擇對(duì)應(yīng)的第三方軟件和庫(kù)。
總結(jié)
以上是生活随笔為你收集整理的根文件系统构建(Buildroot 方式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何删除绿盾加密软件
- 下一篇: MVC中使用ajax传递json数组