構(gòu)建QEMU使用的嵌入式Linux系統(tǒng)

0. 聲明
基于QEMU虛擬vexpress-a9
1. 準(zhǔn)備工作
需要安裝
交叉編譯工具鏈,本人使用gcc-linaro-7.2.1-2017.11-rc1-x86_64_arm-linux-gnueabi
QEMU
安裝后需要配置好環(huán)境變量。
需要獲取
U-Boot源碼
Linux Kernel源碼
Busybox源碼
2. U-Boot源碼編譯
2.1 源碼修改
有一個(gè)問(wèn)題,和構(gòu)建環(huán)境有關(guān)。就是說(shuō),你在MenuConfig里配置了BOOT_ARGUMENT后無(wú)法成功設(shè)置bootargs環(huán)境變量。
打開(kāi)文件 {U-Boot_Dir}/include/configs/vexpress_common.h:152
把bootargs設(shè)置為應(yīng)該設(shè)置的參數(shù)(具體啟動(dòng)參數(shù)的內(nèi)容同下文)。
2.2 配置并編譯U-Boot
進(jìn)入U(xiǎn)-Boot源碼目錄,在終端中輸入
進(jìn)行vexpress-a9的默認(rèn)配置
在配置結(jié)束后輸入
進(jìn)入menuconfig,在之中找到Boot options,并進(jìn)入
選中Enable a default value of bootcmd并設(shè)置bootcmd為
上述代碼為U-Boot三行命令,以分號(hào)分割,分別加載了zImage內(nèi)核鏡像到內(nèi)存,加載設(shè)備樹(shù)到內(nèi)存,并且從內(nèi)存引導(dǎo)啟動(dòng)zImage。
并且設(shè)置boot argument為
配置完后保存退出。
配置完后進(jìn)行U-Boot的編譯。在終端中輸入
其中-j8指明了多核??梢蕴嵘幾g速度。
編譯完成后將會(huì)在U-Boot目錄出現(xiàn)U-Boot文件。
3. Linux 內(nèi)核編譯
進(jìn)入Linux內(nèi)核源碼目錄。在Shell中執(zhí)行
之后進(jìn)入menuconfig進(jìn)行進(jìn)一步的配置。
按需配置并退出,在這里L(fēng)eo醬沒(méi)有做什么修改。
接下來(lái)進(jìn)行編譯。
編譯完成后會(huì)在arch/arm/boot目錄中生成zImage,在arch/arm/boot/dtb目錄中找到設(shè)備樹(shù)文件vexpress-v2p-ca9.dtb
4 構(gòu)建文件系統(tǒng)
4.1 創(chuàng)建空白磁盤(pán)鏡像并分區(qū)
使用
創(chuàng)建一個(gè)512M的空白磁盤(pán)鏡像 sd.img,并對(duì)其進(jìn)行分區(qū)
在fdisk命令行中,輸入n新建分區(qū),新建分區(qū)時(shí)會(huì)依次要求輸入分區(qū)類(lèi)型(主磁盤(pán)分區(qū)或是拓展分區(qū)MS-DOS分區(qū)表),選擇主分區(qū),然后要求輸入分區(qū)號(hào),這些都使用默認(rèn)值即可。
接下來(lái)要求你輸入起始扇區(qū)與結(jié)束扇區(qū),起始扇區(qū)可以緊接上一個(gè)扇區(qū),使用默認(rèn)值。結(jié)束扇區(qū)可以使用諸如+32M的方式指定大小。分區(qū)結(jié)束后輸入w寫(xiě)入更改,Leo醬創(chuàng)建了一個(gè)32M的boot分區(qū),剩下的空間創(chuàng)建為根目錄的分區(qū)。
4.2 使用回環(huán)設(shè)備掛載img并格式化虛擬磁盤(pán)
使用kpartx,輸入
如果成功,會(huì)提示諸如

接下來(lái)可以針對(duì)每一個(gè)分區(qū),進(jìn)行格式化。
將第一個(gè)分區(qū)格式化為FAT,第二個(gè)分區(qū)格式化為EXT4
其中第二行的-L選項(xiàng)指定了卷標(biāo),不是必須
接下來(lái)可以新建兩個(gè)目錄掛載這兩個(gè)分區(qū),在此Leo醬新建了boot和rootfs目錄分別掛載第一個(gè)分區(qū)和第二個(gè)分區(qū)。創(chuàng)建好掛載點(diǎn)后進(jìn)行掛載。
將zImage內(nèi)核鏡像和設(shè)備樹(shù)文件復(fù)制到第一個(gè)分區(qū)的根目錄中。(注意root權(quán)限)
在第二個(gè)分區(qū)需要構(gòu)建文件系統(tǒng),可以使用buildroot或者使用busybox自己構(gòu)建。這里演示如何使用busybox構(gòu)建一個(gè)簡(jiǎn)單可用的文件系統(tǒng).
4.3 編譯Busybox
進(jìn)入busybox的源碼目錄,在Shell中輸入
進(jìn)入menuconfig,在菜單中選擇busybox包含的功能,配置完畢后保存退出。在此Leo醬沒(méi)有做任何修改。
配置后進(jìn)行編譯
編譯之后會(huì)在源碼目錄中生成busybox
4.4 制作文件系統(tǒng)
進(jìn)入掛載后的rootfs目錄,創(chuàng)建如下目錄
我們先構(gòu)建最小的可以運(yùn)行的Linux,因此并不搬移任何運(yùn)行庫(kù)。
將busybox放入bin目錄并做鏈接。
在這一步可以鏈接更多的Linux工具,取決于busybox中所啟用的功能。在此不一一列出。
進(jìn)入etc目錄,創(chuàng)建文件inittab,寫(xiě)入如下內(nèi)容
第一行指明開(kāi)機(jī)執(zhí)行rcS,第二行指明啟動(dòng)后按下Enter鍵進(jìn)入sh
創(chuàng)建開(kāi)機(jī)啟動(dòng)腳本/etc/init.d/rcS并寫(xiě)入
創(chuàng)建/etc/fstab文件并寫(xiě)入
創(chuàng)建/etc/profile,用于開(kāi)機(jī)后設(shè)置環(huán)境變量,寫(xiě)入
此時(shí),已經(jīng)搭建出一個(gè)可以支持系統(tǒng)使用的文件系統(tǒng)了。
將目錄卸載,并卸載磁盤(pán)鏡像。
5 使用QEMU模擬系統(tǒng)運(yùn)行
在Shell中輸入
并執(zhí)行。即可啟動(dòng)QEMU,如果成功,將會(huì)看到如下結(jié)果

按下Enter,進(jìn)入Shell。

說(shuō)明運(yùn)行成功,可以在此虛擬機(jī)上測(cè)試ARM Linux應(yīng)用程序,其實(shí)更主要的作用是可以進(jìn)行Linux系統(tǒng)的學(xué)習(xí)。學(xué)習(xí)用。
需要注意的是,加了-nographic選項(xiàng)的命令行是無(wú)法按Ctrl+C退出的,想要退出QEMU返回Shell,可以先按Ctrl+A再按X,即可退出,就和minicom一樣。