在浏览器启动真实Linux:Velxio中树莓派3的QEMU仿真原理与实践
【免费下载链接】velxioEmulate Arduino, ESP32 & Raspberry Pi. in your browser. Write code, compile, and run on 19 real boards — Arduino Uno, ESP32, ESP32-C3, Raspberry Pi Pico, Raspberry Pi 3, and more. No hardware, no cloud, no limits.. Discord: https://discord.gg/3mARjJrh4E项目地址: https://gitcode.com/gh_mirrors/ve/velxio
Velxio 是一款运行在浏览器里的嵌入式开发环境,支持 Arduino、ESP32 与树莓派等 19 块真实板卡。本文聚焦它最硬核的一板——树莓派 3:Velxio 通过 QEMU 虚拟机在浏览器中启动一套真实的 Raspberry Pi OS(Linux 系统),你只需写 Python 脚本,无需硬件、无需云服务器,就能体验完整的 Linux 启动流程并控制 GPIO 引脚。
为什么用 QEMU 仿真树莓派 3
Velxio 对不同板卡采用了不同的仿真引擎:Arduino 用纯浏览器 JS 引擎逐周期模拟,而树莓派 3 是一颗四核 64 位 ARM 处理器(BCM2837),用 JS 模拟整颗 SoC 不现实。因此 Velxio 选择了QEMU 系统级模拟:
| 项目 | 说明 |
|---|---|
| 仿真引擎 | QEMU 10.x,机型raspi3b |
| 处理器 | BCM2837,4× ARM Cortex-A53(ARMv8 64位) |
| 操作系统 | 真实的 Raspberry Pi OS(Trixie armhf) |
| 开发语言 | Python,无需编译步骤 |
| 运行位置 | 后端 QEMU 进程 + WebSocket 回传浏览器 |
💡 与 Arduino 板卡最大的区别:没有编译环节。你在编辑器里写的
.py文件会被直接上传到虚拟 Linux 文件系统,由系统里的 Python 解释器执行。
一键把树莓派 3 放到画布上
操作步骤非常简单:
- 打开 Velxio 编辑器,点击左侧的Add Component(添加组件)按钮;
- 在组件选择器中搜索
raspberry pi 3,选中Raspberry Pi 3B; - 画布上会出现一块带 40 针 GPIO 排针的树莓派 3,此时即可接线、写脚本、点击 Run。
树莓派 3B 实例由后端统一管理,每个浏览器会话对应一个独立的 QEMU 进程,互不干扰(管理逻辑见 qemu_manager.py)。完整原理文档可阅读 RASPBERRYPI3_EMULATION.md。
真实 Linux 是如何在浏览器里启动的
点击 Run 后,Velxio 会执行一套类似真实开机的流程:
- 获取启动镜像:首次启动时自动下载内核(
kernel8.img)、设备树(bcm2710-rpi-3-b.dtb)和 5.4 GB 的 SD 卡系统镜像(zstd 压缩后约 1.4 GB),下载完成后缓存在 Docker 卷中,之后启动秒级加载; - 创建 qcow2 覆盖层:基线镜像只读,每个会话生成一个写时复制(Copy-on-Write)的
qcow2覆盖层,会话结束后自动删除——所以你在系统里写入的文件不会持久保存,但也不会污染基础镜像; - 拉起 QEMU 进程:模拟 1 GB 内存、4 核 CPU,通过两个 TCP 串口把用户串口(ttyAMA0)和GPIO 协议串口(ttyAMA1)暴露给后端;
- kernel + systemd 正常启动:镜像预配置了串口自动登录,约 30~60 秒后,串口监视器中就会出现
root@raspberrypi:~#提示符——这是真正的 Linux 登录 shell。
启动镜像的下载、校验与缓存机制详见 BOOT_IMAGES.md。
GPIO 仿真:Python 脚本如何点亮 LED
树莓派上控制引脚通常靠RPi.GPIO库。Velxio 的做法很巧妙:把一个垫片(shim)模块注入到系统内标准路径,替换真正的硬件驱动。当你的脚本执行import RPi.GPIO as GPIO时,实际加载的是 gpio_shim.py——它把每次GPIO.output(pin, HIGH/LOW)翻译成一行人文协议(如GPIO 17 1)发到第二个串口,后端解析后通过 WebSocket 推给前端,画布上的 LED 就亮了;反过来,画布上按钮被按下,后端会向系统回写SET <pin> <val>,脚本的GPIO.input()即可读到。
因此以下常见 API 都能正常工作:setmode、setup、output、input、add_event_detect、PWM(简化为高/低电平)等。
串口终端与多板联动
树莓派的print()输出和input()输入都走 ttyAMA0,直接映射到界面下方的串口监视器面板——你可以像操作真实 Linux 终端一样在提示符下敲命令。
更酷的是多板互联:把树莓派 3 和一块 Arduino 放在同一画布上,用虚拟串口线连接后,Pi 端的 Pythonserial库发出的字节会被实时喂给 Arduino 的Serial,反之亦然。官方示例库中就收录了pi-to-arduino-led-control这类双向通信项目,你可以在示例中心按板卡筛选找到它们:
多板路由与前端桥接逻辑分别在 RaspberryPi3Bridge.ts 与 useSimulatorStore.ts 中实现。
动手实践:写一个 LED 闪烁脚本
在 VFS(虚拟文件系统)中编辑默认的main.py,写入如下内容(脚本树管理见 useVfsStore.ts):
import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) while True: GPIO.output(17, GPIO.HIGH) print("LED ON") time.sleep(1) GPIO.output(17, GPIO.LOW) time.sleep(1)运行后,把画布上 GPIO17 接一根 LED 到 GND,即可看到 LED 随串口输出同步闪烁——整条链路都是真实 Linux 进程在驱动。
已知限制与使用建议
了解边界,才能用好它:
- ⏱冷启动慢:QEMU 本身启动约 1 秒,但系统内核 + systemd 完整启动需 30~60 秒,属正常现象;
- 🚫无网络、无显示:QEMU 未暴露网卡,也未启用 HDMI 输出,
requests、Tkinter 等库不可用; - 📵I2C / SPI 未转发:
smbus、spidev无法与虚拟外设通信; - 💾状态不持久:qcow2 覆盖层随会话销毁,重启后系统回到初始状态;
- 🖥Pi 3B 专用:目前仅支持 3B 机型(
raspi3b),Pi 3B+ 与 Pi 4 暂不支持; - 🧮资源占用:每个 Pi 实例约 200 MB 内存,同时开多个实例会消耗可观的后端资源。
延伸阅读
- 完整仿真架构:docs/RASPBERRYPI3_EMULATION.md
- 启动镜像缓存体系:docs/BOOT_IMAGES.md
- 快速上手指南:docs/getting-started.md
- QEMU 进程生命周期管理:backend/app/services/qemu_manager.py
- GPIO 垫片实现:backend/app/services/gpio_shim.py
从浏览器标签页里点亮一颗虚拟 LED,到敲下ls /查看真实 Linux 文件系统——Velxio 的树莓派 3 仿真让"零硬件学习 Linux 嵌入式"第一次变得如此直接。🐧
【免费下载链接】velxioEmulate Arduino, ESP32 & Raspberry Pi. in your browser. Write code, compile, and run on 19 real boards — Arduino Uno, ESP32, ESP32-C3, Raspberry Pi Pico, Raspberry Pi 3, and more. No hardware, no cloud, no limits.. Discord: https://discord.gg/3mARjJrh4E项目地址: https://gitcode.com/gh_mirrors/ve/velxio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考