使用QEMU模拟树莓派

QEMU上的树莓派

我们开始设置一个Lab VM。我们将使用Ubuntu并在其中模拟我们所需的ARM版本。

首先,获取最新的Ubuntu版本并在VM中运行它:

对于QEMU仿真,您将需要以下内容:

  1. Raspbian图像:http :  //downloads.raspberrypi.org/raspbian/images/raspbian-2017-04-10/  (其他版本可能工作,但推荐Jessie)
  2. 最新的qemu内核:https//github.com/dhruvvyas90/qemu-rpi-kernel

在Ubuntu VM里面,创建一个新的文件夹:

$ mkdir?/ qemu_vms /

下载并放置Raspbian Jessie图像到?/ qemu_vms /。

下载并将qemu-kernel放置到?/ qemu_vms /。

$ sudo apt-get install qemu-system
$ unzip <image-file> .zip
$ fdisk -l <??image-file>

你应该看到这样的东西:

磁盘2017-03-02-raspbian-jessie.img:4.1 GiB,4393533440字节,8581120扇区
单位:1 * 512 = 512字节的扇区
扇区大小(逻辑/物理):512字节/ 512字节
I / O大小(最小/最佳):512字节/ 512字节
Disklabel类型:dos
磁盘标识符:0x432b3940

设备引导启动结束扇区大小ID类型
2017-03-02-raspbian-jessie.img1 8192 137215 129024 63M c W95 FAT32(LBA)
2017-03-02-raspbian-jessie.img2       137216 8581119 8443904 4G 83 Linux

你会发现文件系统(.img2)从扇区137216开始。现在取这个值并乘以512,在这个例子中是512 * 137216 = 70254592字节。在以下命令中将此值用作偏移量:

$ sudo mkdir / mnt / raspbian
$ sudo mount -v -o offset = 70254592 -t ext4? / qemu_vms / <your-img-file.img> / mnt / raspbian
$ sudo nano /mnt/raspbian/etc/ld.so.preload

使用“#”注释掉该文件中的每个条目,使用Ctrl-x?Y保存并退出。

$ sudo nano / mnt / raspbian / etc / fstab

如果你在fstab中看到任何有mmcblk0的东西,那么:

  1. 用/ dev / sda1替换包含/ dev / mmcblk0p1的第一个条目
  2. 用/ dev / sda2替换第二个包含/ dev / mmcblk0p2的项,保存并退出。
$ cd?
$ sudo umount / mnt / raspbian

现在你可以使用下面的命令在Qemu上模拟它:

$ qemu-system-arm -kernel?/ qemu_vms / <your-kernel-qemu> -cpu arm1176 -m 256 -M versatilepb -serial stdio -append“root = / dev / sda2 rootfstype = ext4 rw”-hda?/ qemu_vms / <your-jessie-image.img> -redir tcp:5022 :: 22 -no-reboot

如果您看到Raspbian OS的GUI,则需要进入终端。使用Win键获取菜单,然后使用箭头键导航,直到找到Terminal应用程序,如下所示。

从终端上,您需要启动SSH服务,以便您可以从您的主机系统(您从其启动qemu的系统)访问它。

现在,您可以使用(默认密码 - 树莓派)从主机系统进行SSH连接:

$ ssh [email protected] -p 5022

有关更高级的网络设置,请参阅下面的“高级网络”一节。

故障排除

如果默认情况下启动时SSH模拟器没有启动,您可以使用以下命令更改Pi终端内的内容:

$ sudo update-rc.d ssh enable

如果您的模拟Pi启动GUI,并且想要在启动时以控制台模式启动,请在Pi终端中使用以下命令:

$ sudo raspi-config
>选择3  - 引导选项
>选择B1  - 桌面/ CLI
>选择B2  - 控制台自动登录

如果您的鼠标没有在仿真的Pi中移动,请单击<Windows>,向下箭头至附件,向右箭头,向下箭头至终端,输入。

调整Raspbian图像的大小

一旦你完成了设置,你的图像上总共剩下3,9GB,已满。要放大Raspbian图像,请在Ubuntu机器上执行以下步骤:

创建现有图像的副本:

$ cp <your-raspbian-jessie> .img rasbian.img

运行此命令来调整您的副本的大小:

$ qemu-img resize raspbian.img + 6G

现在开始使用放大图像作为第二个硬盘的原始raspbian:

$ sudo qemu-system-arm -kernel?/ qemu_vms / <kernel-qemu> -cpu arm1176 -m 256 -M versatilepb -serial stdio -append“root = / dev / sda2 rootfstype = ext4 rw”-hda?/ qemu_vms / <your-original-raspbian-jessie> .img -redir tcp:5022 :: 22 -no-reboot -hdb raspbian.img

登录并运行:

$ sudo cfdisk / dev / sdb

删除第二个分区(sdb2),并创建一个包含所有可用空间的新分区。一旦创建新的分区,使用写入提交更改。然后退出 cfdisk。

调整大小并检查旧分区并关闭。

$ sudo resize2fs / dev / sdb2
$ sudo fsck -f / dev / sdb2
$ sudo halt

现在您可以用放大的图像启动QEMU:

$ sudo qemu-system-arm -kernel?/ qemu_vms / <kernel-qemu> -cpu arm1176 -m 256 -M versatilepb -serial stdio -append“root = / dev / sda2 rootfstype = ext4 rw”-hda?/ qemu_vms / raspbian.img -redir tcp:5022 :: 22

高级网络

在某些情况下,您可能需要访问在QEMU中运行的虚拟机的所有端口。例如,你运行一些二进制文件,打开你想要从主机(Ubuntu)系统访问/模糊的一些网络端口。为此,我们可以创建一个共享网络接口(tap0),它允许我们访问所有打开的端口(如果这些端口没有绑定到127.0.0.1)。感谢  @ 0xMitsurugi建议将其包含在本教程中。

这可以通过HOST(Ubuntu)系统上的以下命令来完成:

azeria @ labs:?$ sudo apt-get install uml-utilities
azeria @ labs:?$ sudo tunctl -t tap0 -u azeria
azeria @ labs:?$ sudo ifconfig tap0 172.16.0.1/24

在这些命令之后,您应该在ifconfig输出中看到tap0接口。

azeria @ labs:?$ ifconfig tap0
tap0:flags = 4099 <UP,BROADCAST,MULTICAST> mtu 1500
inet 172.16.0.1网络掩码255.255.255.0广播172.16.0.255
醚22:a8:a9:d3:95:f1 txqueuelen 1000(以太网)
RX数据包0字节0(0.0 B)
RX错误0丢弃0超限0帧0
TX分组0字节0(0.0 B)
TX错误0丢弃0超载0载波0碰撞0

您现在可以使用以下命令启动您的QEMU VM:

azeria @ labs:?$ sudo qemu-system-arm -kernel?/ qemu_vms / <kernel-qemu> -cpu arm1176 -m 256 -M versatilepb -serial stdio -append“root = / dev / sda2 rootfstype = ext4 rw” - hda?/ qemu_vms / rasbian.img -net nic -net tap,ifname = tap0,script = no,下标= no -no-reboot

当QEMU虚拟机启动时,需要使用以下命令为其eth0接口分配一个IP:

pi @ labs:?$ sudo ifconfig eth0 172.16.0.2/24

如果一切顺利的话,你应该能够通过你的HOST(Ubuntu)系统访问GUEST(Raspbian)上的开放端口。你可以用一个netcat(nc)工具来测试这个(见下面的例子)。

时间: 2024-08-30 09:43:33

使用QEMU模拟树莓派的相关文章

RPi 2B QEMU 模拟树莓派

/******************************************************************************** * RPi 2B QEMU 模拟树莓派 * 说明: * 网络上有找到一些资料,不过在我的电脑上运行会出一些问题,经验证,需要提前 * 修改文件系统中的链接库和分区挂载表. * * 2017-5-21 台湾 中和区 曾剑锋 *********************************************************

以Qemu模拟Linux,学习Linux内核

文章名称:以Qemu模拟Linux,学习Linux内核作      者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/2921221.html维护日志:2013-02-21 建立文档(注:文章参考自http://www.linuxidc.com/Linux/2011-07/39373.htm, 是对该篇文章的一些补充和说明.文章内所使用的环境是Ubuntu 12.04,如果其中遇到编译问题,请自行参考错误说明,配置依赖

利用qemu模拟嵌入式系统制作全过程

http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章,将介绍如何用qemu来搭建一个基于ARM的嵌入式linux系统.通过该文章,你可以学习到如何配置kernel,如何交叉编译 kernel,如何配置busybox并编译,如何制

利用 qemu 模拟嵌入式系统制作全过程

利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章将介绍如何用 Qemu 来搭建一个基于 ARM 的嵌入式 Linux 系统.通过该文章可以学习到如何配置和交叉编译 Kernel,如何配置 Busybox 并编译,如何制作 Initramfs,如何制作根文件系统,如何定制自己的 Uboot,如何通过 Uboot 向 Kernel 传递参数等.开始干活! 零.环境搭建 在实现我们的目标之前,我们需要搭建自己的工作环境.在这

在qemu模拟的aarch32上使用kgtp

KGTP 介绍 KGTP 是一个能在产品系统上实时分析 Linux 内核和应用程序(包括 Android)问题的全面动态跟踪器. 使用 KGTP 不需要 在 Linux 内核上打 PATCH 或者重新编译,只要编译 KGTP 模块并insmod 就可以. 其让 Linux 内核提供一个远程 GDB 调试接口,于是在本地或者远程的主机上的 GDB 可以在不需要停止内核的情况下用 GDB tracepoint 和其他一些功能调试和跟踪Linux内核和应用程序. Github https://gith

Qemu模拟IO和半虚拟化Virtio的区别以及I/O半虚拟化驱动介绍

QEMU的基本原理和优缺点 基本原理: 使用QEMU模拟I/O的情况下,当客户机中的设备驱动程序(device driver)发起I/O操作请求之时,KVM模块中的I/O操作捕获代码会拦截这次I/O请求,然后经过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序.QEMU模拟程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次的I/O操作,完成之后,将结果放回到I/O共享页,并通知KVM模块中的I/O操作捕获代码.最后,由KVM模块中的捕获代码读取I/O共享页

【转帖】Linux系统上面qemu 模拟arm

零基础在Linux系统搭建Qemu模拟arm https://blog.csdn.net/weixin_42489042/article/details/81145038 自己没搞定 改天再试试 感谢原作者. 由于最近的一个项目,需要用到qemu模拟arm系统跑程序,所以做了一次搭建,在网上找到了两篇文章,写得都很详细,其中一篇文章是对另外一篇文章进行的修改和添加,但是基于自己系统去做,还是发现了最新修改的文章过程中的一些错漏,加之想记录下此次自己的搭建,所以写下这篇博客. 参考博客文章(1):

qemu模拟vexpress开发板(续)

1. 问题描述 续接上文,利用qemu模拟cortex-a9开发板,流程:qemu ===> u-boot ===> kernel ===>  nfsroot             ||             ======> ramdisk 进行到kernel引导根文件系统时,总是失败.经过尝试,终于解决了!!! 2. 解决方法 2.1 关于bootargs 前文说过,u-boot可以通过 bootargs 这个环境变量来传递参数给内核,那么可以传递哪些参数?格式又是如何?这个

CentOS7使用Qemu模拟ARM64

准备 RPM包安装 yum安装交叉编译工具 yum install -y binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu bison flex glib2 glib2-devel pixman-devel bc 手动安装glibc yum库中没有glibc-aarch64,所以需要手动安装相应的包.在该网站下载以下连个rpm包进行安装 glibc-aarch64-linux-gnu glibc-aarch64-linux-gnu-devel 下载