平台: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) printModel: Loopback device (loop)
Disk /dev/loop0: 3499MB
Sector size (logical/physical): 512B/512B
Partition Table: msdosNumber 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) printModel: Loopback device (loop)
Disk /dev/loop0: 3499MB
Sector size (logical/physical): 512B/512B
Partition Table: msdosNumber 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
如此这般基本就可以工作了,进入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