0. 背景
0.1 PetaLinux 是什么
PetaLinux 是 Xilinx 推出的用于在其自家 SoC 上構(gòu)建嵌入式 Linux 的一套工具集,集成了編譯、調(diào)試、仿真等眾多工具。
0.2 原有的搭建 PetaLinux 開發(fā)環(huán)境的方式有什么問(wèn)題
實(shí)驗(yàn)室的項(xiàng)目基于 Xilinx 的 Zynq 系列 SoC 開發(fā),需要使用 PetaLinux 構(gòu)建嵌入式 Linux 系統(tǒng),第一步就是搭建開發(fā)環(huán)境。團(tuán)隊(duì)成員平時(shí)的主力系統(tǒng)是 Windows,使用虛擬機(jī)的方式搭建 Linux 開發(fā)環(huán)境。搭建開發(fā)環(huán)境出現(xiàn)困難,或?yàn)楣?jié)省時(shí)間的目的時(shí)會(huì)從其他成員那里復(fù)制搭建好環(huán)境的虛擬機(jī)。這些方式已產(chǎn)生或可能產(chǎn)生的問(wèn)題可以總結(jié)如下:
1. 安裝開發(fā)環(huán)境的依賴稍顯復(fù)雜,且根據(jù)操作系統(tǒng)不同而異,新手不易搞定。安裝過(guò)程沒有被很好的文檔化,團(tuán)隊(duì)成員重復(fù)勞動(dòng)明顯。
2. 統(tǒng)一操作系統(tǒng)版本困難。開發(fā)人員(現(xiàn)有成員、未來(lái)加入成員、項(xiàng)目其他團(tuán)隊(duì)的成員)可能使用著不同的 Linux 發(fā)行版和版本,因?yàn)樗麄兛赡苡胁煌南埠茫姹旧舷矚g嘗鮮或守舊,在既有系統(tǒng)上已經(jīng)有順手的開發(fā)工具和設(shè)置等等。而當(dāng)大家希望統(tǒng)一開發(fā)環(huán)境或自行搭建失敗時(shí),往往選擇復(fù)制整個(gè)虛擬機(jī)鏡像。
3. 使用復(fù)制整個(gè)虛擬機(jī)的方式傳遞開發(fā)環(huán)境不夠靈活。表現(xiàn)為:
使用了一段時(shí)間后的虛擬機(jī)大小可能動(dòng)輒四五十個(gè) GB,拷貝時(shí)間長(zhǎng),難以通過(guò)網(wǎng)絡(luò)共享。
為保留可回退的環(huán)境,可能為虛擬機(jī)添加快照,但這會(huì)進(jìn)一步顯著增加虛擬機(jī)的體積。
傳遞虛擬機(jī)不僅傳遞了需要的開發(fā)環(huán)境,還傳遞了大量無(wú)用的軟件和個(gè)人設(shè)置,難以兼顧不同開發(fā)者之間的習(xí)慣差異。
對(duì)于不同項(xiàng)目、用途可能存在多個(gè)虛擬機(jī),資源冗余很大。
4. 使用虛擬機(jī)性能表現(xiàn)差。主機(jī)配置不高時(shí),使用虛擬機(jī)(可能會(huì)再虛擬機(jī)內(nèi)運(yùn)行 IDE 等其他開發(fā)工具)會(huì)經(jīng)??D,降低了開發(fā)效率。
5. 使用為某一開發(fā)環(huán)境而復(fù)制來(lái)的虛擬機(jī),遷就其環(huán)境不愿再安裝合適的開發(fā)工具(如 IDE 等)。
0.3 基于 Docker 的解決方案
Docker 作為在很多場(chǎng)景下虛擬機(jī)的替代方案?jìng)涫懿毮浚滟Y源消耗小、為單一應(yīng)用配置環(huán)境、易于通過(guò)網(wǎng)絡(luò)共享等特點(diǎn)很好的解決了上面提到的諸多問(wèn)題。通過(guò) Docker 來(lái)構(gòu)建 PetaLinux 開發(fā)環(huán)境,我們可以獲得以下優(yōu)勢(shì):
經(jīng)過(guò)壓縮的鏡像體積只有 1GB 左右,方便網(wǎng)絡(luò)傳輸。
很容易再團(tuán)隊(duì)中統(tǒng)一開發(fā)環(huán)境,包括操作系統(tǒng)和各種庫(kù)。Docker 鏡像的只讀特性保證了有一個(gè)可回退的一致環(huán)境。
開發(fā)環(huán)境中的依賴被 Dockerfile 清晰、明確的記錄下來(lái),具有很好的文檔效應(yīng),方便團(tuán)隊(duì)長(zhǎng)期共享和維護(hù)。
Docker 可以運(yùn)行在之前的虛擬機(jī)的操作系統(tǒng)上,也可以運(yùn)行在一個(gè)“精簡(jiǎn)”的操作系統(tǒng)上(如 Docker for Windows 的方式),還可以放到服務(wù)器上,運(yùn)行多個(gè)容器供團(tuán)隊(duì)成員使用。這使得使用 Linux 環(huán)境的方式更加多樣、靈活,且能減少虛擬機(jī)性能原因帶來(lái)的影響
現(xiàn)在理想很豐滿,但現(xiàn)實(shí)中還需要經(jīng)過(guò)一番探究和試驗(yàn),下面就讓我們開始。
1. 構(gòu)建 Docker 鏡像
Docker 的優(yōu)勢(shì)就在于我們可以使用“代碼”來(lái)表示需要的環(huán)境,它既能描述環(huán)境,也能直接指導(dǎo)生成環(huán)境,這份“代碼”就是 Dockerfile。下面詳細(xì)的記述了這份 Dockerfile 的每一部分,過(guò)程中遇到的問(wèn)題、解決辦法、注意事項(xiàng)等。關(guān)于 Dockerfile,可以參考官方的 Dockerfile reference1,以及 Best practices for writing Dockerfiles2。
1.1 設(shè)置構(gòu)建參數(shù)
Dockerfile 中允許使用 ARG 指令設(shè)置構(gòu)建時(shí)參數(shù),這些參數(shù)在 Dockerfile 中具有默認(rèn)值,在構(gòu)建時(shí)可以通過(guò) --build-arg 參數(shù)指定新的值來(lái)覆蓋默認(rèn)值。這些參數(shù)可以在 Dockerfile 中被引用(引用方式與在 shell 中引用變量一樣),但不會(huì)出現(xiàn)在最終的鏡像里。注意一條 ARG 指令只能指定一個(gè)參數(shù),這一點(diǎn)和 ENV 指令是不同的。這里我設(shè)置了兩個(gè)參數(shù)如下:
ARG install_dir=/opt
ARG installer_url=172.17.0.1:8000
其中 install_dir 用來(lái)指定 PetaLinux 的安裝路徑,installer_url 用來(lái)指定 PetaLinux 安裝包的網(wǎng)絡(luò)地址。如果安裝包在互聯(lián)網(wǎng)上,則這里是一個(gè)訪問(wèn)鏈接,如果安裝包在本地,則這里被指定為 Docker 的默認(rèn)網(wǎng)橋,通過(guò)它聯(lián)通本地網(wǎng)絡(luò)服務(wù)器和構(gòu)建時(shí)的臨時(shí)容器。關(guān)于這一部分,我會(huì)在后面詳述。
1.2 設(shè)置環(huán)境變量
通常情況下,PetaLinux 使用一個(gè)設(shè)置腳本來(lái)添加自身的各項(xiàng)工具到環(huán)境變量中,在使用相關(guān)工具前需要通過(guò) source /settings.sh 來(lái)執(zhí)行腳本。但現(xiàn)在我要制作一個(gè)專屬于 PetaLinux 的環(huán)境,完全可以把環(huán)境變量設(shè)置好來(lái)免去這個(gè)步驟。在 Dockerfile 中使用 ENV 指令來(lái)設(shè)置環(huán)境變量:
ENV PETALINUX_VER=2014.4 \
PETALINUX=${install_dir}/petalinux-v2014.4-final
ENV PATH="${PETALINUX}/tools/linux-i386/arm-xilinx-gnueabi/bin:\
${PETALINUX}/tools/linux-i386/arm-xilinx-linux-gnueabi/bin:\
${PETALINUX}/tools/linux-i386/microblaze-xilinx-elf/bin:\
${PETALINUX}/tools/linux-i386/microblazeel-xilinx-linux-gnu/bin:\
${PETALINUX}/tools/linux-i386/petalinux/bin:\
${PETALINUX}/tools/common/petalinux/bin:\
${PATH}"
評(píng)論