杜登科,胡愛蘭,李林峰,張玉生
(華北計(jì)算機(jī)系統(tǒng)工程研究所,北京 100083)
摘要:隨著工業(yè)科技的發(fā)展,嵌入式Linux展現(xiàn)了巨大的價(jià)值,,廣泛應(yīng)用于消費(fèi)電子設(shè)備,、網(wǎng)絡(luò)設(shè)備和工控機(jī)領(lǐng)域。廣泛的應(yīng)用帶來了各種各樣的需求,,各大廠商紛紛訂制自己的嵌入式Linux產(chǎn)品,,導(dǎo)致大量的重復(fù)工作,規(guī)范和標(biāo)準(zhǔn)差異化越來越大,。在開放源代碼的精英發(fā)起下,,Yocto橫空出世,以開源協(xié)作的方式逐步統(tǒng)一嵌入式Linux的訂制和開發(fā)標(biāo)準(zhǔn),,避免許多重復(fù)工作,,極大地簡(jiǎn)化了嵌入式Linux系統(tǒng)的訂制,并且省掉大量的重復(fù)工作,,使嵌入式Linux應(yīng)用開發(fā)者可以將重心放在自己的工作上,。
關(guān)鍵詞:嵌入式;Linux,;Yocto,;開放源代碼
0引言
1991年芬蘭大學(xué)生Linus發(fā)布了0.1版本的操作系統(tǒng)Linux,到1995年,,Linux發(fā)布1.2版本,,該版本開始支持Alpha、i386,、MIPS和SPARC等架構(gòu),,同時(shí)MIPS開始在低功耗設(shè)備中越來越流行[1]。1996年第一家專注于嵌入式Linux的公司Timesys成立,,隨后基于嵌入式Linux的公司和組織如雨后春筍般出現(xiàn)[2],。
至今,基于Linux內(nèi)核的操作系統(tǒng)廣泛應(yīng)用于消費(fèi)電子,、網(wǎng)絡(luò)設(shè)備,、工控控制、工業(yè)自動(dòng)化,、導(dǎo)航設(shè)備,、宇宙飛船控制領(lǐng)域和醫(yī)學(xué)設(shè)備領(lǐng)域[3]。
由于沒有統(tǒng)一的標(biāo)準(zhǔn),,嵌入式Linux開發(fā)差異越來越大,,導(dǎo)致大量重復(fù)工作,給嵌入式Linux開發(fā)者帶來極大不便,。在Linux基金會(huì)的有識(shí)之士的領(lǐng)導(dǎo)下成立了Yocto項(xiàng)目,Yocto提供了工具,、關(guān)鍵數(shù)據(jù)和方法來快速構(gòu)建一個(gè)嵌入式Linux發(fā)行版操作系統(tǒng),,避免了大量的重復(fù)工作,,這樣嵌入式Linux開發(fā)者可以將更多的重心放在應(yīng)用開發(fā)上,極大地提高了效率,。
1國(guó)內(nèi)外研究現(xiàn)狀
當(dāng)前國(guó)內(nèi)外開發(fā)一個(gè)嵌入式Linux操作系統(tǒng)的通用方式分為3步[4]:制作交叉編譯工具鏈,;移植uboot;配置并編譯Linux內(nèi)核[5],,制作根文件系統(tǒng),。這樣的開發(fā)流程對(duì)于嵌入式Linux開發(fā)者來說非常繁瑣,會(huì)耗費(fèi)開發(fā)人員大量的精力在與應(yīng)用開發(fā)上無關(guān)的方面,,而且架構(gòu)一換,,交叉編譯工具鏈還得重新進(jìn)行配置和編譯。即使有的公司或者社區(qū)已經(jīng)做好了相應(yīng)的工作,,也僅僅限制于他們的芯片和板子,,嵌入式Linux開發(fā)者需要查閱大量的文檔才能將已有的工作移植到他們的工作中,因此對(duì)于開發(fā)者十分不利,。
Yocto項(xiàng)目正是針對(duì)這種情況而誕生的,,它將構(gòu)建嵌入式Linux操作系統(tǒng)中需要用到的軟件源代碼的下載、打補(bǔ)丁,、配置,、編譯、打包和安裝以Python或Shell腳本的方式描述出來,,保存在以后綴為.bb的文件中,,然后使用一個(gè)叫bitbake的工具來解析執(zhí)行。這樣的規(guī)則可以重利用,,因此極大地提高了嵌入式Linux開發(fā)者的開發(fā)效率,。Yocto中提供了很多種類型的嵌入式Linux操作系統(tǒng)模版,涵蓋了常見的操作系統(tǒng)類型,,比如非常小的能啟動(dòng)設(shè)備的coreimageminimal,,而且使用者可以很容易地對(duì)該操作系統(tǒng)進(jìn)行訂制,僅僅通過修改構(gòu)建目錄下的local.conf文件就可以輕松完成各種需求的訂制,。
2Yocto項(xiàng)目介紹
Yocto的核心是一個(gè)基于OpenEmbeddedd開放源代碼的構(gòu)建系統(tǒng),,它通過提供模版、工具和方法幫助開發(fā)者快速創(chuàng)建基于Linux內(nèi)核的定制系統(tǒng),,支持ARM,、PPC、MIPS和x86硬件體系結(jié)構(gòu),。這個(gè)構(gòu)建系統(tǒng)可以創(chuàng)建針對(duì)用戶環(huán)境的嵌入式Linux操作系統(tǒng)發(fā)行版,。Yocto項(xiàng)目可以讓用戶訂制不同大小的Linux鏡像文件,從可以僅供啟動(dòng)設(shè)備的鏡像到擁有各種各樣功能的復(fù)雜的操作系統(tǒng)鏡像文件。
除了可以訂制嵌入式Linux操作系統(tǒng)發(fā)行版,,還可以很容易地產(chǎn)生針對(duì)該嵌入式Linux操作系統(tǒng)的交叉編譯工具鏈和SDK,,同時(shí)還有軟件開發(fā)工具集,可以生成想要的格式,,如:deb,、rpm、ipk等,。
圖1詳細(xì)地描述了Yocto項(xiàng)目流程:從上游軟件源將代碼抓取下來,,通過一個(gè)叫bitbake的構(gòu)建系統(tǒng),使用描述編譯規(guī)則的文件,,來生成內(nèi)核的image,、根文件系統(tǒng)和SDK。
3開發(fā)環(huán)境搭建
3.1安裝必要的軟件包
Ubuntu14.04下安裝如下包:
$sudo aptget install gawk wget gitcore diffstat unzip texinfo gccmultilib buildessential chrpath socat libsdl1.2dev xterm
3.2獲取Yocto構(gòu)建系統(tǒng)
$git clone git://git.yoctoproject/poky
然后切換到當(dāng)前最新的分支jethro上:
$git checkout jethro
這樣就得到了Yocto整個(gè)構(gòu)建系統(tǒng)的所有工具,、關(guān)鍵的配置文件和核心的元數(shù)據(jù),。
4開始構(gòu)建系統(tǒng)
接下來創(chuàng)建一個(gè)可以在arm926ejs的CPU上運(yùn)行的嵌入式Linux操作系統(tǒng)發(fā)行版,還有一整套交叉編譯工具鏈,,并且讓該操作系統(tǒng)運(yùn)行在QEMU虛擬機(jī)上,。
4.1初始化構(gòu)建系統(tǒng)的環(huán)境
poky是一個(gè)包含構(gòu)建系統(tǒng)、核心腳本文件和構(gòu)建工具的一個(gè)集合,。因此進(jìn)入poky目錄并運(yùn)行如下腳本:
$cd poky
$source oeinitbuildenv
該腳本會(huì)創(chuàng)建一個(gè)構(gòu)建目錄,,默認(rèn)放在poky里面,也可以自己指定構(gòu)建目錄,,運(yùn)行如下命令:
$source oeinitbuildenv you_path
構(gòu)建目錄包含構(gòu)建期間生成的所有文件,。
4.2修改本地配置文件
在運(yùn)行oeinitbuildenv腳本后,會(huì)在構(gòu)建目錄下生成conf目錄,,conf目錄就是包含本次構(gòu)建的所有重要配置文件,。在conf目錄下有一個(gè)local.conf的配置文件,該文件包含了要構(gòu)建的系統(tǒng)的一些基本設(shè)置,。
如果不改變?nèi)魏闻渲梦募烷_始編譯,,默認(rèn)的構(gòu)建的目標(biāo)機(jī)器是qemux86,生成的可運(yùn)行的鏡像文件是基于32位的x86架構(gòu),,可以運(yùn)行在QEMU虛擬機(jī)上,。對(duì)于本次編譯來說,要生成基于arm926ejs,,可在QEMU虛擬機(jī)上運(yùn)行的鏡像文件,,修改local.conf文件中的MACHINE變量:
MACHINE?=qemuarm
既然要做一個(gè)嵌入式Linux發(fā)行版,不是僅僅跑起來那么簡(jiǎn)單,,作為一個(gè)成熟的嵌入式Linux操作系統(tǒng),,必須要有對(duì)應(yīng)的包管理工具,,默認(rèn)使用RPM,可以通過修改變量PACKAGE_CLASSES來改變:
PACKAGE_CLASSES=“package_deb”
當(dāng)然還可以選擇ipk,、tar等方式,。
4.3bitbake介紹
bitbake是一個(gè)功能上與make類似的給嵌入式Linux操作系統(tǒng)生成可運(yùn)行鏡像文件和軟件包的自動(dòng)化構(gòu)建工具,該工具受到了Gentoo Linux操作系統(tǒng)包管理工具Portage的啟發(fā),,使用Python實(shí)現(xiàn)。
bitbake操作的文件叫bitbake recipe,,以后綴.bb結(jié)尾或者以.bbappend結(jié)尾,,該文件描述了一個(gè)軟件包去哪下載、如何配置,、如何編譯,、軟件包的依賴、安裝到哪里,、如何刪除等過程,。
bitbake的recipe文件可以解析多種軟件包來源路徑,包括:http,、https,、ftp、cvs,、svn,、git和本地文件系統(tǒng)。在構(gòu)建的過程中,,recipe文件用來跟蹤軟件依賴,、執(zhí)行本地和交叉編譯,并且完成后將編譯完的軟件進(jìn)行打包,,可以在本地和目標(biāo)設(shè)備上安裝,。
接下來使用bitbake生成一個(gè)包含根文件系統(tǒng)的嵌入式Linux鏡像文件,bitbake框架首先生成一個(gè)針對(duì)目標(biāo)平臺(tái)的交叉變異工具鏈,。
4.4構(gòu)建嵌入式Linux操作系統(tǒng)
在Yocto中,,針對(duì)不同的設(shè)備有相應(yīng)的recipe文件,根據(jù)recipe文件的描述,,可以生成大小不同的操作系統(tǒng),有可以僅僅讓設(shè)備跑起來實(shí)時(shí)響應(yīng)的操作系統(tǒng),、帶界面的操作系統(tǒng)等。接下來生成一個(gè)尺寸很小,,剛好可以讓設(shè)備跑起來的操作系統(tǒng):
coreimageminimal
在4.1節(jié)搭建好的環(huán)境中運(yùn)行:
$source oeinitbuildenv you_path
會(huì)生成you_path目錄,,這就是開發(fā)目錄,在該目錄下運(yùn)行如下命令:
$bitbake coreimageminimal
開始執(zhí)行后,,bitbake會(huì)根據(jù)當(dāng)前的CPU型號(hào)生成一個(gè)交叉編譯工具鏈,,也就是生成一個(gè)可以在宿主機(jī)上運(yùn)行的,,能夠編譯出在目標(biāo)板子上運(yùn)行的程序的工具鏈,這樣極大地簡(jiǎn)化了嵌入式開發(fā)者的工作,,不需要自己手動(dòng)修改代碼來配置交叉編譯工具鏈,,僅僅通過配置就可以生成各種CPU型號(hào)的交叉編譯工具鏈。使用該工具鏈編譯各種在arm926ejs上可以運(yùn)行的程序,,包括Linux內(nèi)核,。
這是一個(gè)比較漫長(zhǎng)的過程,因?yàn)獒槍?duì)每一個(gè)軟件包都要下載,、解壓,、配置、編譯,。通常bitbake會(huì)根據(jù)當(dāng)前主機(jī)的CPU核心數(shù)量設(shè)置相應(yīng)的線程來進(jìn)行多線程編譯,。為了提高效率,同時(shí)防止在下載的過程中出現(xiàn)下載包失敗的問題,,通??梢蕴崆跋螺d好包,放在指定的目錄下,,然后在build目錄中的local.conf文件中指定變量DL_DIR為上述指定的目錄,,這樣bitbake構(gòu)建系統(tǒng)就會(huì)去指定目錄讀取軟件包,極大地提高了效率,。編譯操作系統(tǒng)如圖2所示,。
開始編譯后,,需要花費(fèi)較長(zhǎng)時(shí)間,,具體時(shí)間長(zhǎng)短取決于當(dāng)前宿主機(jī)的CPU核的數(shù)量和當(dāng)前內(nèi)存大小。
4.5運(yùn)行生成嵌入式Linux操作系統(tǒng)
編譯完成后,,結(jié)果如圖3所示,。
編譯完成后,,Linux內(nèi)核的可執(zhí)行鏡像文件和根文件系統(tǒng)位于構(gòu)建目錄中的tmp/deploy/image/ 下,。運(yùn)行生成的嵌入式Linux操作系統(tǒng),使用如下命令:
$runqemu qemuarm slirp nographic
runqemu是一個(gè)啟動(dòng)QEMU虛擬機(jī)的腳本,,qemuarm是運(yùn)行的機(jī)器,,slirp 是一種不需要root權(quán)限的網(wǎng)絡(luò)訪問方式。runqemu腳本自動(dòng)啟動(dòng)QEMU虛擬機(jī),,并且加載生成的內(nèi)核和根文件系統(tǒng),,終端啟動(dòng)界面如圖4所示?!?/p>
使用root用戶名登錄,,默認(rèn)不需要用戶密碼,。
5結(jié)論
通過使用Yocto構(gòu)建系統(tǒng),僅需指定目標(biāo)板子的類型和非常簡(jiǎn)單的設(shè)置,,就可輕松地完成嵌入式Linux操作系統(tǒng)的構(gòu)建,,相比于傳統(tǒng)的嵌入式Linux開發(fā)流程,極大地提高了效率,,使開發(fā)人員能夠避免底層復(fù)雜的配置和移植,,將重心更多地放在自己的應(yīng)用開發(fā)上。
Yocto項(xiàng)目可以訂制操作系統(tǒng)的范圍從非常小的傳感器,、智能手表到工控機(jī),,甚至復(fù)雜的服務(wù)器和大型機(jī)等,應(yīng)用層面非常廣泛,,操作簡(jiǎn)單,僅使用Python和Shell腳本來描述操作系統(tǒng)的編譯規(guī)則,,極大地簡(jiǎn)化了開發(fā)工作,。而且它可以訂制基于多種架構(gòu)的嵌入式Linux操作系統(tǒng),由于從源代碼到編譯規(guī)則都是開源透明的,,這對(duì)安全行來說十分重要,,使開發(fā)人員對(duì)自己訂制的操作系統(tǒng)百分百全面掌控。同時(shí)它減輕了嵌入式Linux開發(fā)人員的負(fù)擔(dān),,使開發(fā)人員很容易地訂制自己的操作系統(tǒng),,將更多的精力放在開發(fā)應(yīng)用上。
Yocto是Linux基金會(huì)官方推薦的嵌入式Linux開發(fā)項(xiàng)目,,未來,,必將有更多的開發(fā)者和公司開始使用Yocto構(gòu)建系統(tǒng)。
參考文獻(xiàn)
?。?] 劉慶.嵌入式Linux技術(shù)的發(fā)展[J]. 開放系統(tǒng)世界,,2003(9):9697.
[2] 苑慶國(guó).嵌入式Linux的實(shí)時(shí)風(fēng)暴[J]. 開放系統(tǒng)世界,,2004(10):7980.
?。?] 陳閎中.Linux在嵌入式操作系統(tǒng)中的應(yīng)用[J]. 同濟(jì)大學(xué)學(xué)報(bào)(自然科學(xué)版),2001,,29(5):564566.
?。?] 梁泉.嵌入式Linux系統(tǒng)移植及開發(fā)技術(shù)研究[D]. 成都:電子科技大學(xué),2003.
?。?] 錢連舉.基于ARM的嵌入式Linux系統(tǒng)移植技術(shù)研究與應(yīng)用[D]. 成都:電子科技大學(xué),,2006.