2012年11月3日 星期六

使用 qemu 來模擬 Raspberry Pi

由於有些時候,Raspberry Pi 不在身邊或開發 Raspberry Pi 程式時,可利用 qemu 來模擬 arm 系統,執行開發的程式,除錯用。

在 windows 平台上也可以,請各位自行研究,小弟對 windows 實在沒興趣。
http://sourceforge.net/projects/rpiqemuwindows/

在 linux 上,裝上 qemu(是老大哥 qemu,不是 kvm)。
$ sudo apt-get install qemu

裝好後,系統上就有一堆平台的模擬器
$ ls /usr/bin/qemu-system-*
/usr/bin/qemu-system-alpha
/usr/bin/qemu-system-arm
/usr/bin/qemu-system-cris
/usr/bin/qemu-system-i386
/usr/bin/qemu-system-lm32
/usr/bin/qemu-system-m68k
/usr/bin/qemu-system-microblaze
/usr/bin/qemu-system-microblazeel
/usr/bin/qemu-system-mips
/usr/bin/qemu-system-mips64
/usr/bin/qemu-system-mips64el
/usr/bin/qemu-system-mipsel
/usr/bin/qemu-system-ppc
/usr/bin/qemu-system-ppc64
/usr/bin/qemu-system-ppcemb
/usr/bin/qemu-system-s390x
/usr/bin/qemu-system-sh4
/usr/bin/qemu-system-sh4eb
/usr/bin/qemu-system-sparc
/usr/bin/qemu-system-sparc64
/usr/bin/qemu-system-x86_64
/usr/bin/qemu-system-xtensa
/usr/bin/qemu-system-xtensaeb

因為 Raspberry Pi 是 arm,所以模擬 Raspberry Pi 就要用 qemu-system-arm
執行 qemu-system-arm 有幾個參數是必要的:
1.kernel
2.disk image

所以到 Raspberry Pi 官方網頁去下載最新的 disk image
http://www.raspberrypi.org/downloads
下載這個最新的 435M,解開後為 1.9G
2012-10-28-wheezy-raspbian.zip

由於 qemu 和真實的 raspberry pi 還是有些不同,因為無法使用 2012-10-28-wheezy-raspbian.zip 裡面提供的 kernel 來開機,須要自行編出 qemu 用的 kernel。

自己編出 qemu 用 kernel 說明
http://xecdesign.com/compiling-a-kernel/

但是網路上有人真的是佛心來的,已經幫忙編好了,再加上自己懶,用現成的就好,不過裡面會不會藏什麼怪東東,請小心使用。
http://elinux.org/File:ZImage.7z
抓下面那個 3.2.27 版的,上面 3.6.1 的不知道為什麼沒畫面


由於是 .7z ,用 7za 來解,若沒 7za 裝上
$ sudo apt-get install p7zip-full


解開後得到 zImage 檔
$ 7za x  20121016173340\!ZImage.7z


執行模擬器
$ qemu-system-arm -M versatilepb -cpu arm1176 -kernel zImage -m 512 -append root=/dev/sda2 -net nic -net user -hda 2012-10-28-wheezy-raspbian.img

-M 是 Machine type
-cpu 是 cpu type
-kernel 核心
-m 為記憶體大小
-append 開機時的 kernel 參數
-net nic -net user  這樣是一對,代表這台機器有一張網卡,而網路模式是 user mode
-hda 第一顆硬碟

在這邊使用最簡單的 user mode 網路,一開好就會有網路可用,但缺點是無法用 icmp(不能 ping) 及無法由 host 機器連入虛擬機器。

執行這指令後,應該就會有一個視窗彈出,並看到樹莓派的 logo 了。
不過若使用 elinux.org 的 kernel,開機中間會有一些錯誤訊息,找不到模組什麼的,這是因為我們只提供 kernel,而這個 kernel 是 3.2.27 版,而 2012-10-28-wheezy-raspbian.zip image 裡的是 3.2.27+ 版,不符合,所以此時無法載入任何模組,要解決此問題,只有自己編 kernel 了。反正沒那些模組一樣可以開機完成,對於僅測試來說是夠用的。

另外,若想要能用網路從 host 和虛擬機器溝通,能用的方式有很多種,比較簡單是用 bridge mode.

我們需要 tunctl 執行檔
$ sudo apt-get intall uml-utilities

建立一張網卡 tap0,讓你的使用者可存取,因此 your_normal_user 要改為你的登入帳號
$ sudo tunctl -t tap0 -u your_normal_user

新增一個 bridge 介面 br0
$ sudo apt-get intall bridge-utils
$ sudo brctl addbr br0

$ sudo ifconfig br0 up

$ sudo brctl addif br0 eth0 tap0

$ qemu-system-arm -M versatilepb -cpu arm1176 -kernel zImage -m 512 -append root=/dev/sda2 -net nic -net tap,ifname=tap0 -hda 2012-10-28-wheezy-raspbian.img

-net nic -net tap,ifname=tap0 有一張網卡,設定為使用 host 機器的 tap0

用這種模式,就可以直接 ssh 到 qemu 虛擬機器裡了。


以使用者 pi ,  密碼 raspberry 登入
第一次會開啟選單做設定

如果在選單中鍵盤無法設定,結束選單直接修改
edit /etc/default/keyboard
XKBLAYOUT="us"
then
$ sudo /etc/init.d/keyboard-setup restart


開始體驗 Raspberry Pi  :-)

1 則留言: