Ubuntu系統下QEMU環境搭建


(這篇文章是在搭建QEMU環境時,在網上找到了一些教程資料,並在實際操作中遇到的一些問題的整理)

下載Linux內核

下載內核有兩種方法,一種是用git直接下載內核代碼樹,方便后面的內核開發。另一種是直接到內核社區下載穩定版本(詳見:https://www.kernel.org/pub/linux/kernel/v4.x/)。

下面演示從Linux kernel主線下載代碼進行編譯。

使用命令:git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

但是親測這條命令超級慢,因此又百度得到了以下的解決辦法:

方法一

第一步:使用nslookup查找github對應的IP地址

nslookup github.com

nslookup github.global.ssl.fastly.Net

第二步:將第一步中的結果加入/etc/hosts文件中

#用vim打開hosts文件

sudo vim /etc/hosts

在下圖位置上加入兩行,保存並退出。

 

第三步:刷新DNS緩存

sudo /etc/init.d/networking restart

第四步:重啟系統

sudo reboot

但是以上方法還是挺慢的,又找到了以下方法。

方法二

使用wget命令,看下自己需要的linux內核版本,然后在下邊的鏈接中可以進行更改:

sudo wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.82.tar.xz

sudo xz -d linux-4.19.82.tar.xz

sudo tar -xvf linux-4.19.82.tar

 

安裝arm的交叉編譯工具鏈

“想必做嵌入式開發的朋友,對交叉編譯工具鏈不陌生。”行吧,我沒做過嵌入式開發,也不曉得交叉編譯工具鏈是個啥。網上找到了如下參考資料,寫的很詳細,格式一目了然,贊贊贊。

交叉編譯工具鏈(詳解):https://www.cnblogs.com/coolYuan/p/9037660.html

了解清楚之后,繼續干正事。

如果你訂制一個交叉編譯工具鏈,建議你使用crosstool-ng開源軟件來構建。

但在這里建議直接安裝arm的交叉編譯工具鏈:

sudo apt-get install gcc-arm-linux-gnueabi

在執行apt-get install命令時遇到了以下問題:

 

這表示有進程占用,解決方法有兩個:

第一:強制解鎖,輸入以下兩條命令即可(注意順序)

sudo rm /var/lib/dpkg/lock

sudo rm /var/cache/apt/archives/lock

第二:使用命令ps -e | grep apt查看哪個進程在使用命令apt-get,找到之后將這個進程殺死即可。sudo kill ****(進程號)。

 

編譯Linux內核

生成vexpress開發板子的config文件:

(等等,這里要插一句為啥是這個板子,因為qemu模擬得最好的arm芯片,就是ARM公司的vexpress A9開發板了)

首先進入到Linux內核的安裝路徑,打開終端,輸入以下命令:

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig

編譯:make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

生成的內核鏡像位路徑arch/arm/boot/zImage下,后續qemu啟動時需要使用該鏡像。

 

下載和安裝qemu模擬器

方法一:

下載高版本qemu:可以根據自己的情況自行選擇需要的qemu的版本

wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2

配置qemu前,需要安裝幾個軟件包:

sudo apt-get install zlib1g-dev

sudo apt-get install libglib2.0-0

sudo apt-get install libglib2.0-dev

配置qemu,支持模擬arm架構下的所有單板:./configure --target-list=arm-softmmu --audio-drv-list=

編譯和安裝:

make

make install

方法二:兩條命令完事。不過可能也有其他問題,自行百度。

sudo apt-get update

sudo apt-get install qemu

即可。

測試是否安裝成功:qemu-arm --version

 

測試qemu和內核能否運行成功

到這里,恭喜你,qemu已經安裝好了,內核也編譯成功了,所以現在需要測試一下,看看編譯出來的內核是否OK,或者qemu對vexpress單板支持是否夠友好。

運行命令很簡單:

qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

這里的/path/to/kernel/dir/是內核的下載目錄,或者編譯目錄。

如果看到內核啟動過程中的打印,說明前面的搭建是成功的。

 

 

 這里簡單介紹下qemu命令的參數:

-M vexpress-a9 模擬vexpress-a9單板,你可以使用-M ?參數來獲取該qemu版本支持的所有單板

-m 512M 單板運行物理內存512M

-kernel /path/to/kernel/dir/arch/arm/boot/zImage  告訴qemu單板運行內核鏡像路徑

-nographic 不使用圖形化界面,只使用串口

-append "console=ttyAMA0" 內核啟動參數,這里告訴內核vexpress單板運行,串口設備是哪個tty。

如果搭建其它單板,需要注意內核啟動參數的console=參數值,同樣地,可從生成的.config文件中找到。

 

制作根文件系統

上邊內核啟動最后報了一個panic,意思是說不能掛載根文件系統,所以咱們這不就開始搞一搞根文件系統的事情了么。首先,根文件系統是啥呀?

根文件系統首先是一種文件系統,該文件系統不僅具有普通文件系統的存儲數據文件的功能,但是相對於普通的文件系統,它的特殊之處在於,它是內核啟動時所掛載(mount)的第一個文件系統,內核代碼的映像文件保存在根文件系統中,系統引導啟動程序會在根文件系統掛載之后從中把一些初始化腳本(如rcS,inittab)和服務加載到內存中去運行。

參考鏈接:https://blog.csdn.net/yym6789/article/details/88194329

第一步:下載、編譯、安裝busybox

wget http://www.busybox.net/downloads/busybox-1.31.1.tar.bz2

make defconfig    #注意,要進入busybox的下載路徑

make CROSS_COMPILE=arm-linux-gnueabi-

make install CROSS_COMPILE=arm-linux-gnueabi-

安裝完成后,會在busybox目錄下生成_install目錄,該目錄下的程序就是單板運行所需要的命令。

第二步:形成根目錄結構

先在Ubuntu主機環境下,形成目錄結構,里面存放的文件和目錄與單板上運行所需要的目錄結構完全一樣,然后再打包成鏡像(在開發板看來就是SD卡),這個臨時的目錄結構稱為根目錄

 

1. 創建rootfs目錄(根目錄),根文件系統內的文件全部放到這里

mkdir -p rootfs/{dev,etc/init.d,lib}

2. 拷貝busybox命令到根目錄下:sudo cp busybox-1.31.1/_install/* -r rootfs/

3. 從工具鏈中拷貝運行庫到lib目錄下

sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

4. 創建4個tty端終設備

sudo mknod rootfs/dev/tty1 c 4 1

sudo mknod rootfs/dev/tty2 c 4 2

sudo mknod rootfs/dev/tty3 c 4 3

sudo mknod rootfs/dev/tty4 c 4 4

第三步:制作根文件系統鏡像

1. 生成32M大小的鏡像 :dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

2. 格式化成ext3文件系統mkfs.ext3 a9rootfs.ext3

3.  將文件拷貝到鏡像中

sudo mkdir tmpfs

sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

sudo cp -r rootfs/*  tmpfs/

sudo umount tmpfs

第四步:系統啟動運行

完成上述所有步驟之后,就可以啟動qemu來模擬vexpress開發板了,命令參數如下:

qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3

最后是這樣的:應該是成功了吧。

 

 

以上內容主要參考以下兩個教程:

1,https://www.cnblogs.com/edver/p/6001786.html

2,https://blog.csdn.net/linyt/article/details/42504975

Linux文件系統詳解:

https://www.cnblogs.com/alantu2018/p/8461749.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM