qemu簡介
先看看維基百科的解釋,什麼是qemu
QEMU是一套由Fabrice Bellard所編寫的模擬處理器的自由軟件。它與Bochs,PearPC近似,但其具有某些後兩者所不具備的特性,如高速度及跨平臺的特性。經由KVM(早期爲kqemu加速器,現在kqemu已被KVM替換)這個開源的加速器,QEMU能模擬至接近真實電腦的速度。QEMU有兩種主要運作模式:
User mode模擬模式,亦即是用戶模式。QEMU能引導那些爲不同中央處理器編譯的Linux程序。而Wine及Dosemu是其主要目標。
System mode模擬模式,亦即是系統模式。QEMU能模擬整個電腦系統,包括中央處理器及其他周邊設備。它使得爲系統源代碼進行測試及除錯工作變得容易。其亦能用來在一部主機上虛擬數部不同虛擬電腦。
簡而言之,qemu就是一個虛擬機軟件,我們可以在裏邊跑自己構建的操作系統,這對於學習內核或者驅動開發來說真的是相當方便,可以拋開開發板,單拿一臺筆記本電腦就可以學習內核測試模塊代碼,甚至直接做開發。真的是非常方便,廢話不多說,開工。
下載安裝qemu
筆者測試過ubuntu 12.10 和 ubuntu 16.04兩個版本,ubuntu 12.10apt提供的qemu版本較老對arm verpress板子支持的不夠好(網友前輩說的,具體哪裏不好,我也不知道)。
而ubuntu 16.04 apt提供的是2.5版本的qemu,版本比較新,就不用自己編譯安裝了。
兩種方式全憑個人喜好。
root-># lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04 LTS
Release: 16.04
Codename: xenial
root-># qemu-system-arm -version
QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.4), Copyright (c) 2003-2008 Fabrice Bellard
ubuntu apt-get方式安裝
root-># apt-get install qemu-system-arm
使用此命令會自動解決依賴關係完成安裝過程,安裝完成可以通過qemu-system-arm -version
測試安裝是否成功。
自己下載安裝
ubuntu 的apt其實有qemu的安裝包,但是版本較低對vexpress的支持不好,此處直接下載較高版本的qemu自己手動安裝。
wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2
首先需要安裝qemu依賴的環境
apt-get install libglib2.0-dev zlib1g-dev
下載完成後安裝前需要進行配置,使其支持ARM架構下的所有單板
cd qemu/
./configure --target-list=arm-softmmu --audio-drv-list=
make
make install
下載編譯內核
下載內核
可以自行到www.kernel.org上下載最新版內核
root-># wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.gz
編譯內核
root-># apt-get install libncurses5-dev
root->#tar -zxvf linux-3.16.tar.gz
root-># cd linux-3.16
root-># cp arch/arm/configs/vexpress_defconfig .config
root-># make menuconfig CROSS_COMPILE=arm-linux- ARCH=arm
root-># make -j4 CROSS_COMPILE=arm-linux- ARCH=arm
qemu模擬最好的arm芯片是ARM親生的vexpress A9,本文搭建環境就以此爲基礎。
測試qemu和內核啓動是否成功
qemu-system-arm -M vexpress-a9 -m 512M -nographic -append "console=ttyAMA0" -kernel /root/zImage-3.0
這裏簡單介紹下qemu命令的參數:
-M vexpress-a9 模擬vexpress-a9單板,你可以使用-M ?參數來獲取該qemu版本支持的所有單板
-m 512M 單板運行物理內存512M
-kernel /root/zImage-3.16 告訴qemu單板運行內核鏡像路徑
-nographic 不使用圖形化界面,只使用串口
-append "console=ttyAMA0" 內核啓動參數,這裏告訴內核vexpress單板運行,串口設備是哪個tty。
發現啓動到掛載根文件系統的時候出現kernel painc,說明內核已經正常啓動了。然後需要製作根文件系統。
製作根文件系統
編譯busybox
wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make install
安裝完成後,會在busybox目錄下生成_install目錄,該目錄下的程序就是單板運行所需要的命令。
形成根文件系統
- 創建rootfs目錄(根目錄),根文件系統內的文件全部放到這裏
sudo mkdir rootfs - 拷貝busybox命令到根目錄下
sudo cp busybox-1.20.2/_install/* -r rootfs/
製作根文件系統鏡像
- 生成32M大小的鏡像
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 - 格式化成ext3文件系統
mkfs.ext3 a9rootfs.ext3 - 將文件拷貝到鏡像中
sudo mkdir tmpfs
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
cp -r rootfs/* tmpfs/
sudo umount tmpfs
使用qemu啓動自定義系統
qemu-system-arm -M vexpress-a9 -m 512M -kernel /root/zImage-3.16 -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3
從內核啓動打印,到命令行提示符出現,到此qemu的arm環境就搭建完成了,可以 用來做內核學習了。
但是目前方式掛載的根文件系統使用起來很麻煩,每次修改完代碼重新編譯之後都需要重新制作文件系統鏡像。因此更推薦後邊的做法。
使用nfs文件系統啓動
安裝nfs服務程序
sudo apt-get install nfs-kernel-server
創建nfs共享文件夾
將前邊創建的rootfs文件夾的權限修改爲777
sudo chmod 777 /root/rootfs
修改/etc/exports文件
sudo vim /etc/exports
添加/root/rootfs *(rw,insecure,sync,no_root_squash)
啓動nfs服務
sudo /etc/init.d/nfs-kernel-server start
測試一下nfs環境是否搭建成功
sudo mount -t 127.0.0.1:/root/rootfs /mnt/
ls /mnt
查看是否掛載成功
sudo umount /mnt
qemu掛載nfs根文件系統
qemu-system-arm -M vexpress-a9 -m 512M -nographic -append "console=ttyAMA0 root=/dev/nfs nfsroot=/root/rootfs rw ip=dhcp nousb" -kernel /root/zImage-3.16
其中nfsroot=後邊是nfs根文件系統位置
ip=dhcp指定qemu guest os 的ip分配方式
至此可以很方便的使用qemu掛載nfs文件系統進行內核學習和開發了。
本文錯略的介紹了qemu搭建內核學習的過程,沒有過多的關注細節,有興趣的可以研究一些qemu的其他參數,qemu的網絡配置,以及更詳細的文件系統構建方法。