qemu模拟raspberrypi

平台:ubuntu14.04 x64(必须带x-window) + qemu + 2016-05-27-raspbian-jessie-lite.img

步骤:

1.安装qemu

# apt-get install qemu

2.下载kernel-qemu

https://github.com/dhruvvyas90/qemu-rpi-kernel

网上很多教程里面给出的kernel下载链接都是无效的,只有这个站点还有备份,而且有最新的4.4版本的kernel,下载后改名为kernel-qemu

3.修改img里面的配置文件/etc/ld.so.preload

这一步比较苦恼,参考别人启动kernel的配置中添加 init=/bin/bash希望能进入单用户模式,但是系统无法启动,所以此处只能曲线救国,参考给dev扩容的方式,挂载raspberrypi所在的区然后进行修改

# dd if=/dev/zero bs=1M count=1024  >> 2016-05-27-raspbian-jessie-lite.img

# losetup -f --show 2016-05-27-raspbian-jessie-lite.img
(根据返回的loop设备,进行下一步的分区,一般会返回loop0)

# parted /dev/loop0
(parted) print

Model: Loopback device (loop)
Disk /dev/loop0: 3499MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
1 4194kB 70.3MB 66.1MB primary fat16 lba
2 70.3MB 1387MB 1317MB primary ext4

(parted) rm 2
(parted) mkpart primary 70.3 3499
(parted) print

Model: Loopback device (loop)
Disk /dev/loop0: 3499MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
1 4194kB 70.3MB 66.1MB primary fat16 lba
2 70.3MB 3499MB 3429MB primary ext4

根据说明进行检查和resize

# e2fsck -f /dev/loop0p2
# resize2fs /dev/loop0p2

好了,有了parted操作,在/dev/目录下就会多出来两个设备loop0p1和loop0p2,挂载loop0p2

# mount /dev/loop0p2 -o rw /mnt/

然后修改/mnt/etc/ld.so.preload,将里面的这句注释掉

#vi /mnt/etc/ld.so.preload

用#注释下句

#/usr/lib/arm-linux-gnueabihf/libarmmem.so

卸载loop0p2,至此便可以启动qemu了,但是为了从host传递文件给raspberrypi,还需要新建一个hdd文件

# dd if=/dev/zero of=share.img bs=1M count=500
# mkfs.ext4 share.img
# mkdir /tmp/share
# mount -o loop share.img /tmp/share/

将要共享的文件拷贝到/tmp/share

4.启动qemu

#qemu-system-arm -kernel /home/ts/qemu/kernel-qemu \
-cpu arm1176 \
-m 256 \
-M versatilepb \
-no-reboot \
-serial stdio \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-hda /home/ts/qemu/2016-05-27-raspbian-jessie-lite.img \
-hdb /home/ts/qemu/share.img

qemu_raspberrypi_2

 

如此这般基本就可以工作了,进入raspbian 后应该可以看到/dev/sdb,就是我们启动时分配的hdb,挂载然后拷贝文件即可,这样做唯一的缺点就是不能实时的在host<->guest之前传递文件,每次更新东西之后必须重启。于是乎考虑是否能让guest和host之间进行网络通信,参考一达人的教程,基本原理就是创建一个网桥,然后添加一个虚拟网卡,将虚拟网卡透传给guest进行通信,原地址可以见最下文,步骤则如下(eth0根据实际情况修改):

# ifconfig eth0 down
# brctl addbr br0
# brctl addif br0 eth0
# brctl stp br0 off
# brctl setfd br0 1
# brctl sethello br0 1

# ifconfig br0 0.0.0.0 promisc up
# ifconfig eth0 0.0.0.0 promisc up

# dhclient br0

# tunctl -t tap0 -u root
# brctl addif br0 tap0
# ifconfig tap0 0.0.0.0 promisc up

# ifconfig tap0 192.168.160.132 netmask 255.255.255.0

然后重新启动qemu:

#qemu-system-arm -kernel /home/ts/qemu/kernel-qemu \
-cpu arm1176 \
-m 256 \
-M versatilepb \
-no-reboot \
-serial stdio \
-net nic \
-net tap,ifname=tap0,script=no,downscript=no \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-hda /home/ts/qemu/2016-03-18-raspbian-jessie.img \
-hdb /home/ts/qemu/share.img

在raspberrypi中,手动配置网卡eth0:

# ifconfig eth0 192.168.160.136 netmask 255.255.255.0 up

这样配置后宿主机之间可以互相ping,但是用ssh测试host --> guest不能访问,guest --> host可以,不知道是不是路由还是其他哪里配置问题。

参考文档:
kernel-qemu下载:
https://github.com/dhruvvyas90/qemu-rpi-kernel
创建网桥:
http://blog.chinaunix.net/uid-26061689-id-2981914.html
启动qemu:
/* https://www.unixmen.com/emulating-raspbian-using-qemu */
修改/etc
https://wiki.debian.org/RaspberryPi/qemu-user-static

发表评论

电子邮件地址不会被公开。 必填项已用*标注