Qemu使用指南

Qemu使用指南

本贴用于指导社区开发者使用Qemu进行openUBMC仿真。

Qemu启动指南

Qemu的启动分为两种方式:

  • WSL/Linux 本地启动: 已完成openUBMC环境准备的用户,想使用更高性能openUBMC
  • Docker镜像启动 : 未完成openUBMC环境准备的用户或想要一次拉起多个Qemu镜像完成自动化部署的用户

Qemu 启动配置

Qemu的启动可以通过[manifest仓库](项目首页 - manifest:manifest - GitCode)一键启动。下载最新 的manifest之后,可以在build/works/packet/qemu_shells/config.json 中完成你对Qemu的一些配置。当然,对于体验者来说你可以直接使用config.json 中的默认配置,因为它可以一键式的帮你下载Qemu启动的依赖文件。

{
    "mapports": {
      "ssh": 10022,
      "https": 10443,
      "ipmi": 10623,
      "snmp": 10161,
      "telnet": 10023
    },
    "start_dependencies" : {
      "qemu_setup_dir" : "temp/qemu_temp/qemu_start_temp" ,
      "inner_path" : "output/packet/inner",
      "cpio_path" : "output/packet/inner/openUBMC_25.00.00.01_qemu.cpio.gz" ,
      "zImage_path" : "output/packet/inner/zImage_openUBMC" ,
      "dtb" : "hi1711_9p8c.dtb",
      "qemu": "qemu-system-aarch64-release",
      "remote_qemu": false,
      "remote_cpio": false,
      "download_qemu" : "https://repo.openubmc.cn/25.03/tools/openUBMC-qemu.zip",
      "download_cpio" : "https://repo.openubmc.cn/25.03/firmware/openUBMC_25.00.00.01_qemu.cpio.gz"
    },
    "container_cfg":{
      "container": "hi1711",
      "wsl_enabled": true,
      "docker_enabled": false,
      "docker_num" : 2,
      "docker_operator" : "create",
      "docker_image": "swr.cn-north-4.myhuaweicloud.com/openubmc/qemu:latest"
    },
    "qemu_cfg":{
      "core_num" : 4 ,
      "memory" : 4
    }
}

:sunny: 配置说明
mapports : Qemu启动时,内部环境与外部宿主机的端口映射关系。例如Qemu环境中ssh端口为22,映射到宿主机上为10022
start_dependencies:Qemu启动时依赖的文件及路径声明。
Qemu启动时依赖四个文件:

  • cpio:openUBMC文件系统,内涵RTOS内核,openBMC应用APP等
  • zImage:Linux内核映像文件
  • qemu:qemu-system-aarch64, qemu启动二进制文件
  • dtb : Linux设备树文件

start_dependencies 中有两个用于控制远端下载的字段 remote_qemuremote_cpio,当该字段为true时会根据download_xxx中的url下载对应文件。

container_cfg: Qemu启动模式配置,wsl_enabled为true时表示使用WSL/Linux 本地启动,docker_enabled为true且docker_operatorcreate时表示Docker镜像启动,同时根据docker_num决定同时启动数量。更多配置可查看build/works/packet/qemu_shells/schema.json中的描述。

qemu_cfg : Qemu启动时内存大小和使用的CPU核数。

Qemu启动命令

Qemu的启动命令已经被集成到了一个一键式启动的脚本中。

python3 build/works/packet/qemu_shells/vemake_1711.py

为了便于用户体验,哪怕没有手动下载依赖文件,没有配置remote参数为true,该脚本会自动从远端获取依赖文件,让初体验者一键式启动Qemu。

Qemu使用指南

WSL/Linux本地启动

本地启动的方式会在执行python脚本后,在终端开启串口打印

Docker启动

配置docker_enabled为true


执行python脚本后,会在终端打印出Docker实例启动后的编号,并结束脚本。
虽然脚本结束了,但并不意味着Qemu被停止了,而是Qemu在后台使用Docker在运行。

可以使用docker ps -a的方式查看Docker实例情况
然后通过docker attach <Container ID>的形式进入Qemu串口。

ssh登录

在登录ssh之前需要知晓宿主机的ip,在Linux中执行ifconfig查看ip。
找到eth0的ip,然后再宿主机中执行

ssh Administrator@<ip>:10022

输入密码后即可登录。默认密码为Admin@90000

Web登录

在浏览器中输入https://<ip>:100443 即可进入Web登录界面,通常该页面会在启动Qemu后6~10分钟左右完全显示,视宿主机配置而定。

redfish访问

请下载postman工具,并在postman中发送redfish命令。

ipmi访问

ipmi访问请下载ipmitool工具。

Qemu已支持的能力

  • 北向接口:Rest、Redifsh、ipmi、CLI
  • 南向硬件:EXU、BCU、SEU、CLU、NIC、门限传感器、离散传感器 等
  • 安全特性:在线用户管理、用户权限管理 等
  • 运维:告警收集、BMC日志收集、传感器事件记录 等

Qemu使用常见场景

本章节用于收纳社区开发者在使用Qemu过程中常使用的场景,并给出案例。

想更新openUBMC的hpm包怎么办?

目前Qemu openBMC并不支持固件升级,所以无法更新hpm包。但这并不意味着无法更新你想调试的组件。
解决方法:制作属于自己的cpio包,cpio包的文件系统和hpm包的文件系统是几乎一致的,除了我们根据仿真系统做了一些变动外,你可以将cpio包视为另一个hpm包。
制作方法:拉取manifest仓库,并执行bingo build -sc qemu,这会在output/packet/inner目录下生成一个openUBMC_25.00.00.01_qemu.cpio.gz,然后启动Qemu时可以使用该cpio包启动。

想更新CSR制作的hpm包怎么办?

更新CSR包可以通过在线替换CSR方法实现。例如替换一个BCU的CSR:
将Qemu中的1825sr替换为4339sr。通过scp将4339.sr上传至Qemu的/tmp目录中

# 进入telnet
/data/home/busybox1711 telnet localhost

# 替换文件
mv /tmp/14100513_00000001020302024339.sr /opt/bmc/sr/14100513_00000001020302024339.sr

# ctrl + D 退出telnet

# 修改Connector配置,将天池加载方式切换为非天池加载
mdbctl setprop set  Connector_BCU_1_0101 bmc.kepler.Connector Bom "14100513"
mdbctl setprop set  Connector_BCU_1_0101 bmc.kepler.Connector Id "00000001020302024339"
mdbctl setprop set  Connector_BCU_1_0101 bmc.kepler.Connector IdentifyMode 2

#卸载板卡
mdbctl setprop set  Connector_BCU_1_0101 bmc.kepler.Connector Presence 0

# 重载板卡
mdbctl setprop set  Connector_BCU_1_0101 bmc.kepler.Connector Presence 1

# 加载后通过general_hardware查看cpuBorad情况
busctl --user introspect bmc.kepler.general_hardware /bmc/kepler/Systems/1/Boards/CpuBoard/CpuBoard_1_010101


替换成功!

Qemu社区贡献

你可以在 openUBMC Qemu中贡献Qemu代码,我们非常希望有丰富qemu开发经验的大佬参与到此项目~

当然如果你在使用Qemu过程中有使用或识别到的问题,请及时和我们联系,可以在此贴下留言。

9 个赞

我使用的时候没有https://gitcode.com/openUBMC/qemu.git/的权限,用户名iss_yanyuchun

1 个赞

这个仓库是一个私有仓库,需要申请。

1 个赞

请问申请链接有嘛

1 个赞

没有链接,需要你想华为那边申请,把gitcode账户给他们。你可以问一下@xuhaijun,让他帮忙申请一下。

1 个赞

无需申请权限,稍后开放访问。

1 个赞

请问大家遇到了ctrl +a X无法退出qemu吗?

1 个赞


请问启动qemu有遇过这种情况嘛

1 个赞

该问题目前正在修复。但不会影响到其他组件的正常使用。

2 个赞

老师再请教一个问题使用脚本启动qemu的过程中会出现提示权限的问题,请老师指导一下该如何解决该问题

1 个赞

当前的权限问题是由于qemu仿真的能力不够完整导致的,我们也正在尽力推进相关功能的仿真,以达到更好的效果。这个权限问题当前无重大影响,如果与你想测试的代码内容无关,请忽略这部分报错

2 个赞

docker方式启动失败,修改config.json文件后,在container中无法启动,在外面也无法正常启动。截图如下

在docker container中启动的错误提示

在Ubuntu中启动的错误提示

帮看一下是什么问题?多谢

1 个赞

这个看上去是因为你未安装docker,或者说/usr/bin下没有对应的docker可执行文件。可以尝试安装 docker.io 或者说使用软链接的方式在/usr/bin下创建一个可执行的docker

1 个赞

那就是说在docker container中启动qemu吗?还需要在container中还要安装docker吗?这感觉不合理啊。我感觉是不是说docker启动只有在WSL环境中有效?

1 个赞

目前该脚本是只支持在wsl Ubuntu环境中有效。或者可以参考WSL_enable的方式,手动拉起docker镜像后,在其中执行qemu运行脚本。

1 个赞

目前实验的情况是

  1. 在docker中不能用docker的方式运行qemu,就是上面报的那个错误,这个应该是合理的
  2. 在docker中运行qemu WEB/SSH等服务的端口映射不出来,这个
  3. 在WSL中运行qemu则端口映射可以生效,可以正常使用 :rose:

另外在WSL中使用docker方式启动当前有问题,像是脚本语法存在问题

1 个赞

qemu仿真时ssh,web连接时出现以下错误:
qemu-system-aarch64-release: Slirp: Failed to send packet, ret: -1

可能是两方面的原因:
1.openUBMC 25.06版本升级了RTOS,造成驱动与系统不匹配,当前qemu相关适配工作正在进行,预计在7.20左右完成。
2.qemu使用的环境中libslirp-dev库版本较低,请尝试升级libslirp-dev

[ 62.323920] bmc_veth_drv: Unknown symbol edma_intf_is_link_ok (err -2)
Authorized uses only. All activity may be monitored and reported.pe (err -2)
localhost login: c_veth_drv: Unknown symbol edma_intf_register_int_notifier (err -2)
[ 62.359695] bmc_veth_drv: Unknown symbol edma_param_set_debug (err -2)
[ 62.359885] bmc_veth_drv: Unknown symbol edma_intf_int_to_host (err -2)
[ 62.360080] bmc_veth_drv: Unknown symbol sys_info_get_system_type (err -2)
[ 62.360269] bmc_veth_drv: Unknown symbol edma_get_pdev (err -2)
[ 62.360494] bmc_veth_drv: Unknown symbol edma_intf_unregister_type (err -2)
[ 62.360817] bmc_veth_drv: Unknown symbol edma_intf_set_open_status (err -2)
[ 62.361025] bmc_veth_drv: Unknown symbol edma_intf_get_remote_status (err -2)
[ 62.361442] bmc_veth_drv: Unknown symbol edma_intf_unregister_intnotifier (err -2)
[ 62.361851] bmc_veth_drv: Unknown symbol edma_intf_is_link_ok (err -2)
[ 62.362209] bmc_veth_drv: Unknown symbol edma_intf_register_type (err -2)
[ ***] (3 of 3) A start job is running for ftpd (56s / 4min 2s)
[ 62.910084] FS-Cache: Loaded
[ 62.967009] CacheFiles: Loaded
[ 63.114667] RPC: Registered named UNIX socket transport module.
[ 63.115271] RPC: Registered udp transport module.
[ 63.115536] RPC: Registered tcp transport module.
[ **] (1 of 3) A start job is running for…cal Compatibility (56s / no limit)
[ 63.279350] FS-Cache: Netfs ‘nfs’ registered for caching
[ 63.508413] FS-Cache: Netfs ‘cifs’ registered for caching
[ *] (1 of 3) A start job is running for…cal Compatibility (57s / no limit)
[ 63.645286] device-mapper: ioctl: 4.43.0-ioctl (2020-10-01) initialised: dm-devel@redhat.com
[ OK ] Started /etc/rc.local Compatibility.
[ OK ] Started start logrotate timer.
[ OK ] Started start partition usage monitor timer.
[ OK ] Reached target Timer Units.
Starting D-Bus System Message Bus…
[ OK ] Started start logrotate service.
[ OK ] Started system memory monitor.
[ OK ] Started start partition usage monitor service.
[ OK ] Started system process memory monitor.
Starting Rsyslog Logging Service…
Starting Permit User Sessions…
[ 64.853681] memory_monitor. (2175): drop_caches: 4
warning: state file /var/lib/logrotate.status is world-readable and thus can be locked from other unprivileged users. Skipping lock acquisition…
[ OK ] Finished Permit User Sessions.
[ OK ] Started Getty on ttyS0.
[ OK ] Reached target Login Prompts.
[ OK ] Started Rsyslog Logging Service.
[ OK ] Started ibmc tpcm module.
[ OK ] Started ibmc file transfer module.
[ OK ] Started telnetd.
[ OK ] Stopped telnetd.
[ OK ] Started telnetd.
[ OK ] Stopped telnetd.
[ OK ] Started telnetd.
[ OK ] Stopped telnetd.
[ OK ] Started telnetd.
[ OK ] Stopped telnetd.
[ OK ] Started telnetd.
[ OK ] Started D-Bus System Message Bus.
Starting framework service…
[ OK ] Stopped telnetd.
[FAILED] Failed to start telnetd.
See ‘systemctl status telnetd.service’ for details.
[ OK ] Started User Login Management.
[ OK ] Started framework service.
Starting alarm service…
Starting bmc_core service…
Starting devmon service…
Starting energy service…
Starting lsw_main service…
Starting security service…
[ OK ] Started devmon service.

上面第三行localhost login: 光标闪烁,然后就一直卡住了,有大佬遇到这种情况么

localhost login:卡了很久对吗?localhost login:是一直都存在的,基本上等待一会,电脑都能跳过;如果跳不过去,可以等待久一会,telnet连接,使用cat /var/log/framework.log日志情况,基本是maca没有起来导致的,这时候一般存在两种场景:

  1. 修改的内容影响了bmc的功能,可以先在另外一个地方重新clone manifest的代码仓,然后删除conan缓存: rm -rf ~/.conan/data, 执行python3 init.py,bingo build -sc qemu出包,重新拉qemu
  2. 因为本地缓存很久没有清理,但导致缓存包可能以及损坏了,这时候只需要删除conan缓存,重新出包,拉qemu即可