使用QEMU运行树莓派操作系统

2020/05/01 探索

因为最近一些实验需要在树莓派平台上运行,但是设备都在学校实验室里。于是我打算用虚拟机来运行树莓派的操作系统。一开始的想法是使用VMware或者是Parallels Desktop虚拟软件,但是对于树莓派这么轻量的系统能否找到更便捷的方式呢,于是让我找到了QEMU这个工具。

QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,QEMU能模拟至接近真实电脑的速度。

使用QEMU的一个用途是可以修改、保存树莓派的系统镜像,然后将其安装到其他树莓派设备中。下面主要描述如何使用QEMU和docker来在macOS上运行树莓派的操作系统,并分析我遇到的一些问题。

主要步骤

首先在mac上先安装Homebrew,确保操作系统的版本大于10.5。

brew install qemu

然后从树莓派官网上下载树莓派操作系统,我选择的是无图形界面的最小体积版本。树莓派系统本质上是基于Debian的、应用在ARM处理器上的Linux系统。

访问这个Github地址获取QEMU启动树莓派的内核文件以及编译内核的脚本,然后按照下面的命令启动树莓派系统。

$ qemu-system-arm \
  -M versatilepb \
  -cpu arm1176 \
  -m 256 \
  -hda 2020-02-13-raspbian-buster-lite.img \
  -net user,hostfwd=tcp::5022-:22 \
  -dtb versatile-pb-buster.dtb \
  -kernel kernel-qemu-4.19.50-buster \
  -append 'root=/dev/sda2 panic=1' \
  -no-reboot

在上面的命令中,本地的5022端口映射到树莓派系统的22端口,因此可以在宿主机对5022端口发起SSH连接。此时已经可以正常运行树莓派系统了,但是我发现有一点异常问题,那就是树莓派的网卡没有正确加载,一时间找不到原因。我在想也许我使用的是最新的版本(20200213),随后我改用一个旧版本的系统试一试(20190926),问题依旧存在。经过多次试验发现了是网卡参数那块填写错误,更改为下面的命令:

$ qemu-system-arm \
  -M versatilepb \
  -cpu arm1176 \
  -m 256 \
  -hda 2020-02-13-raspbian-buster-lite.img \
  -net nic -net user,hostfwd=tcp::5022-:22 \
  -dtb versatile-pb-buster.dtb \
  -kernel kernel-qemu-4.19.50-buster \
  -append 'root=/dev/sda2 panic=1' \
  -no-reboot

宿主机使用下面命令就可以连接到树莓派系统了:

ssh pi@127.0.0.1 -p 5022
# password : raspberry

使用Docker运行树莓派系统

除了QEMU之外,我还找到了一个使用docker运行树莓派系统的代码仓库,访问这个Github地址获取工具。下面是关于这个工具的介绍。

Gives you access to a virtualised ARM based Raspberry Pi machine running the Raspian operating system.This is not just a Raspian Docker image, it’s a full ARM based Raspberry Pi virtual machine environment.

首先在mac上安装docker,相关教程非常多,这里不再累述。然后安装vm工具,注意这里不是下载完整的树莓派镜像,因为我们已经提前下载了。

docker pull lukechilds/dockerpi:vm

紧接着只需要执行一条命令即可,注意修改树莓派系统所在的文件目录。

docker run -it -v -p 5022:22 /Users/alienx/Desktop/RAP/2020-02-13-raspbian-buster-lite.img:/sdcard/filesystem.img lukechilds/dockerpi:vm

系统运行起来之后并没有出现网卡无法加载的异常,但是我无法在宿主机上通过5022端口访问树莓派系统的22端口,非常奇怪。我处理了关闭防火墙、安装SSHD并重启等等问题,依旧无法使用,报告的错误是ssh_exchange_identification: Connection closed by remote host。我需要使用SSH的目的是通过SCP从宿主机上传文件到树莓派系统中,考虑到docker cp命令就可以实现文件传输,因此我暂时搁置了这个问题。

两个工具的区别

使用QEMU工具会在另外一个窗口中启动树莓派系统,并且是完整的一个虚拟环境,能够正常显示出树莓派的图标、系统文字和高亮文字。一句话总结是所见即所得。而使用Docker工具是在当前的terminal窗口中启动树莓派系统(按照github上这个工具的描述,本质上还是使用QEMU来进行仿真的),相关的显示样式是与当前terminal的样式一致的。个人感觉在同一台mac电脑上,QEMU的速度比Docker的速度要快一点。

思考

进一步的思考,docker与虚拟机软件的区别是什么?这里是知乎上的讨论,我选取了部分内容

Docker容器不是虚拟机。虚拟机技术通过Hypervisor层抽象底层基础设施资源,提供相互隔离的虚拟机,通过统一配置、统一管理,计算资源的可运维性,以及资源利用率都能够得到有效的提升。同时,虚拟机提供客户机操作系统,客户机变化不会影响宿主机,能够提供可控的测试环境,更能够屏蔽底层硬件甚至基础软件的差异性,让应用做到的广泛兼容。

容器技术严格来说并不是虚拟化,没有客户机操作系统,是共享内核的。容器可以视为软件供应链的集装箱,能够把应用需要的运行环境、缓存环境、数据库环境等等封装起来,以最简洁的方式支持应用运行,轻装上阵,当然是性能更佳。Docker镜像特性则让这种方式简单易行。当然,因为共享内核,容器隔离性也没有虚拟机那么好。

参考资料

使用qemu虚拟机运行树莓派(linux kernel 4.9)

QEMU搭建树莓派环境

Search

    Table of Contents