(這篇文章是在搭建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文件系統詳解: