首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >华为欧拉系统以及jailhouse虚拟化技术介绍

华为欧拉系统以及jailhouse虚拟化技术介绍

原创
作者头像
武状元
发布于 2026-10-14 09:11:03
发布于 2026-10-14 09:11:03
1430
举报

​

前言

8月份开始接触到了华为的欧拉系统和可以在欧拉系统使用的虚拟化技术jailhouse。使用后不仅感叹虚拟化技术的精妙与国产开源系统的强大。因此想要介绍下欧拉系统和系统中经常使用的jailhouse技术

一.欧拉系统介绍

1.简单介绍

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、LoongArch、PowerPC、SW-64 等多样性计算架构。

欧拉的最大优点它突破了传统操作系统与特定芯片架构绑定的模式,通过自研的统一内核和架构适配层,100%支持ARM、x86、RISC-V、LoongArch(龙芯)、PowerPC等全部主流通用计算架构。同时欧拉系统针对服务器、云计算等场景进行了大量垂直优化,性能表现突出。根据社区数据,其性能优于主流操作系统约15%。主流操作系统比如ubuntu,debian这些由于需要兼用在各个硬件上,需要适配几乎所有硬件,因此它们在性能优化这部分会做出让步,而欧拉大部分用在服务器、云计算、工业控制部分,在这些场景下把性能做到了极致。

2.和常见系统横向对比

对比对象

共同点

欧拉的差异点

CentOS / RHEL 系

同为 RPM + dnf/yum 体系,目录布局、systemd、服务管理基本一致

迁移成本低(厂商与社区提供 x2openEuler 等迁移工具);CentOS 停服后国内大量存量系统正往这个方向迁移;国产芯片适配由社区承担

Ubuntu / Debian 系

都是通用 Linux,软件生态庞大,也都有实时内核方案

包管理体系不同(deb/apt vs rpm/dnf);欧拉强在国内硬件适配、行业认证与信创合规,Ubuntu 强在国际社区体量与第三方软件覆盖

其他国产商业发行版(麒麟、统信等)

大多基于 openEuler 构建,命令与包体系高度一致

欧拉是它们的"上游":想要更小的镜像、更自由的裁剪、更早拿到新特性,直接用社区版

自己拿通用 Linux 改实时

都能上 PREEMPT_RT

欧拉把实时内核 + 混合关键性框架 + 分区虚拟化做成了官方交付物,不必长期自己维护一整套补丁

作为华为推出的开源系统,欧拉的生态环境也可以说是不错,但是跟其他经典系统比还是有所欠缺,国际社区体量仍不及 Ubuntu / RHEL,部分海外第三方软件(尤其是闭源商业软件)的原生支持覆盖不如主流发行版。芯片平台成熟度也不够均衡,x86 与 ARM64 生态最厚,RISC-V / LoongArch 等平台的驱动与工具链仍在完善中。因此我们也要需要正视欧拉系统的缺点与适配性不足的缺点。

二.jailhouse虚拟化技术

1.虚拟化技术介绍

在实际的工业化场景中,会出现一个板子运行了一个程序,但是这个程序的CPU占用率可能就在50%左右,这样并不能很好的利用当前的硬件资源,然而如果想要运行其他程序,其他程序需要的环境跟当前程序需要的环境不一样,因此无法运行,想要解决这样的问题就可以使用我们的虚拟化技术。

虚拟化技术,简单说就是:把一台物理计算机的硬件资源抽象、分割、隔离,变成多个相互独立的逻辑计算机环境。这些逻辑环境可以同时运行不同的操作系统,彼此之间互不干扰。比如你在一台物理服务器上同时运行 Windows、Linux、CentOS,它们都以为自己独占了一台机器,但实际上共享的是同一套 CPU、内存、磁盘和网卡。

虚拟化技术如今广泛使用在云服务器中,已经成为云计算平台最核心的底层能力之一。云服务商通常会在物理服务器上部署 Type 1 裸金属 Hypervisor,例如 KVM、Xen、VMware ESXi、Hyper-V,把 CPU、内存、存储和网络资源统一抽象成资源池,再按需切分成多台相互隔离的云主机实例。每个云主机都拥有独立的虚拟 CPU、虚拟内存、虚拟磁盘和虚拟网卡,用户可以像使用真实服务器一样安装操作系统、部署应用和配置网络。借助 Intel VT-x、AMD-V 等硬件辅助虚拟化,以及 virtio、SR-IOV 等技术,云服务器的性能损耗不断降低,网络和磁盘 I/O 也能接近物理机水平。

2.jailhouse介绍

jailhouse的核心设计理念与 KVM、Xen 等主流虚拟化方案截然不同,不追求功能的丰富性,而是将“简洁”与“实时性”放在首位,专为嵌入式系统中的混合关键性场景而设计。它会静态分配硬件资源,然后将环境分割成一个个cell,系统就运行在这些cell中。

场景

痛点

Jailhouse 的价值

工业 PLC / 运动控制

控制周期 100μs~1ms,Linux 上跑 KVM 虚拟机,vCPU 被 CFS 调度器抢占,尾延迟不可控

每个 cell 独占 CPU,无调度器、无超卖,实时域几乎零虚拟化开销

车载 / 机器人多 OS 混合

需要 Linux(HMI/网络)+ RTOS(控制)+ 裸机(安全监控)共板

静态分区 + IVSHMEM 共享内存通信,一个 cell 崩溃不影响另一个 cell

边缘安全隔离

需要把"联网的 Linux"和"存放密钥/证书的负载"强隔离

硬件虚拟化(EPT + IOMMU)做边界,攻击面远小于全功能 hypervisor

启动的时候,它会先用 Linux 把硬件初始化好,再由 Linux 把 Jailhouse 加载起来接管硬件,然后把 CPU、内存、中断、PCI 设备静态切分给多个互相隔离的 cell。

Jailhouse 加载完成后,执行层级是这样的:

代码语言:javascript
复制
x86:  VMX root 模式 ── Jailhouse hypervisor
       VMX non-root ── Linux(即 Root Cell,被当成一个 guest 跑在 EPT 里)
                      ── inmate cell 1 / cell 2 ...

ARM:  EL2 ── Jailhouse hypervisor
       EL1 ── Linux(Root Cell)
              ── inmate cell 1 / cell 2 ...

启动步骤如下:

① 固件 / BootLoader 启动 └─ x86: GRUB 带 memmap= 预留连续物理内存;ARM: U-Boot 让 Linux 运行在 HYP 模式 ② Linux(欧拉)启动,接管并初始化全部硬件 └─ 打开中断重映射、准备 jailhouse 内核模块 ③ modprobe jailhouse ← 内核模块 jailhouse.ko 提供 /dev/jailhouse 与 sysfs ④ jailhouse enable sysconfig.cell └─ 通过 /dev/jailhouse ioctl 把 jailhouse.bin 加载到预留内存并跳转执行 └─ Hypervisor 接管硬件虚拟化特性(VMX/EPT 或 EL2),Linux 降级为 Root Cell ⑤ jailhouse cell create xxx.cell └─ 按配置把 CPU / 内存 / 中断 / PCI 从 Root Cell 划给新 cell ⑥ jailhouse cell load <id> <image> [-a 地址] └─ 把 inmate 镜像搬进该 cell 的内存 ⑦ jailhouse cell start <id> └─ 让该 cell 的 CPU 从入口点开始执行 ⑧ jailhouse cell shutdown / destroy / disable └─ 资源回收给 Linux;disable 后一切回到普通 Linux 系统

CPU: 通过 .cpus 位图静态分配。每个 CPU 只属于一个 cell,cell 之间不共享 CPU——这就是"没有调度器"的含义,也是实时性的来源。

内存: 每个 cell 的内存区域在配置里以物理地址 + 大小 + 权限(JAILHOUSE_MEM_READ/WRITE/EXECUTE/DMA)显式声明。hypervisor 用 EPT / Stage-2 页表兜底,Root Cell 无法越界访问别人的内存。

设备与中断: PCI 设备按 BDF 白名单分配,MSI/MSI-X 通过 IOMMU 的中断重映射(Intel VT-d / ARM ITS)改写目标,PIO 端口与 IRQ 用 pio_regions、irqchips.pin_bitmap 精确授权。

启动起来后是这样的

​编辑

三.使用jailhouse

方式一:走社区仓库(推荐先试)

代码语言:javascript
复制
dnf list jailhouse            # 先看看当前版本仓库里有没有
sudo dnf install -y jailhouse

openEuler 社区的源码包在 src-openeuler/Jailhouse(已迁移至 AtomGit),基线为 jailhouse-0.12.tar.gz,并带有若干国产平台与编译适配补丁。如果 dnf 里查不到,直接走方式二。

方式二:源码编译(推荐,可控)

代码语言:javascript
复制
# 依赖:内核头文件/构建目录、python3-mako(config create 脚本依赖 mako!)
sudo dnf install -y git gcc make kernel-devel kernel-headers python3-mako
​
git clone https://github.com/siemens/jailhouse.git
cd jailhouse
git checkout v0.12                     # master 亦可
​
# 指定根单元内核的构建目录(/lib/modules/$(uname -r)/build 即可)
make KDIR=/lib/modules/$(uname -r)/build -j$(nproc)
sudo make install                      # 安装 driver / firmware / tools / configs

编译产物对应关系(后面会一直用到):

产物

路径

作用

jailhouse.bin

hypervisor/ → 安装到 /lib/firmware

Hypervisor 固件本体

jailhouse.ko

driver/

内核模块,提供 /dev/jailhouse 与 sysfs 管理面

jailhouse

tools/

用户态管理工具

*.cell

configs/{x86,arm64}/

系统配置与 cell 配置

inmate-*.bin

inmates/demos/{x86,arm64}/

演示 inmate 镜像

之后校验硬件

代码语言:javascript
复制
sudo modprobe jailhouse
sudo jailhouse hardware check

x86 上它会逐项检查 VMX、EPT、unrestricted guest、preemption timer、VT-d 中断重映射等能力。这一步不通过,后面的所有步骤都没有意义,请先换硬件或改 BIOS 设置(VT-d 常见于 BIOS 里被默认关闭)。

然后生成系统配置

代码语言:javascript
复制
sudo jailhouse config create -c ttyS0 sysconfig.c

关键点如下:

  • 必须在目标机器上以 root 运行(脚本要读 /sys/firmware/acpi/tables/MCFG、MADT/IVRS/DMAR、/proc/iomem、/proc/ioports、/sys/class/tty/*)。
  • jailhouse 处于 enabled 状态时无法生成配置(脚本会直接报错),生成配置要在 enable 之前。
  • 常用参数:-c ttyS0 指定 hypervisor 调试串口(none 表示不输出);--mem-hv 6M / --mem-inmates 76M 调整内存规划。
  • 目标板在远端/隔离环境?先执行 jailhouse config collect sysinfo.tar 把所需 sysfs 输入打包,拿到开发机上再 jailhouse config create -r <解包目录> sysconfig.c。
  • 生成的是 C 源码,把它放进源码树 configs/x86/ 后重新 make,构建系统会自动编译出 sysconfig.cell。手工微调(裁剪 PCI 白名单、收紧 PIO 授权)就发生在这一步。
  • ARM 平台没有配置生成器,需要参考 configs/arm64/ 与 configs/arm64/dts/inmate-*.dts 手工编写,并核对 SoC 手册与 DTS。

生成后务必自检:

代码语言:javascript
复制
sudo jailhouse config check sysconfig.cell apic-demo.cell

它会检查:cell 内部内存区域是否重叠、是否与 hypervisor 内存重叠、是否与 PCI MMCONFIG / IOMMU / xAPIC / IOAPIC 拦截区域重叠。"配置检查通过"是 enable 成功的前置条件,能省掉大量"机器直接挂死、串口无输出"的排查时间。

之后改启动参数并重启

代码语言:javascript
复制
# /etc/default/grub(注意 $ 转义)
GRUB_CMDLINE_LINUX_DEFAULT="... intel_iommu=off memmap=82M\\\$0x3a000000"
# ARM 平台则改用 mem= 或 DTS reserved-memory 减少内核可见内存
​
grub2-mkconfig -o /boot/grub2/grub.cfg     # 欧拉/CentOS 系
reboot

重启后确认:

代码语言:javascript
复制
dmesg | grep -i -e memmap -e iommu
cat /proc/cmdline

然后enable Jailhouse

代码语言:javascript
复制
# 1) 先把要给其他 cell 的 CPU 下线(示例:只留 CPU0)
for c in 1 2 3; do echo 0 > /sys/devices/system/cpu/cpu$c/online; done
​
# 2) 加载模块
sudo modprobe jailhouse
​
# 3) 启用(路径按你的实际位置,源码树里在 configs/x86/)
sudo jailhouse enable /usr/share/jailhouse/cells/qemu-x86.cell
# 或: sudo jailhouse enable ./configs/x86/sysconfig.cell

强烈建议先接好物理串口(COM / IPMI Serial)再执行 enable。 Jailhouse 运行在比 Linux 更低的层级,一旦出错 Linux 无法保证继续执行,dmesg、ftrace 全都指望不上——它有自己的日志机制,只往串口(或配置里指定的调试控制台)吐。找不到 COM 口就用 PCI 串口卡,服务器用 IPMI Serial-over-LAN 也行。

创建并启动一个 inmate

代码语言:javascript
复制
# 查看当前 cell 列表(此时只有 Root Cell)
sudo jailhouse cell list
​
# 用官方 demo:apic-demo 会以 10Hz 触发 APIC 定时器,并用 PM Timer 测量抖动
sudo jailhouse cell create ./configs/x86/apic-demo.cell
sudo jailhouse cell load apic-demo ./inmates/demos/x86/apic-demo.bin
sudo jailhouse cell start apic-demo

输出会持续打印定时器抖动统计。随后可以:

代码语言:javascript
复制
sudo jailhouse cell list                 # 观察 State / Assigned CPUs / Failed CPUs
sudo jailhouse cell stats apic-demo      # 运行统计
sudo jailhouse console -f                # 持续跟随 hypervisor 调试控制台
sudo jailhouse cell destroy apic-demo
sudo jailhouse disable                   # 全部资源归还 Linux

四.问题汇总

sudo jailhouse enable /usr/share/jailhouse/cells/qemu-x86.cell 后,需要使用命令查看io的映射,是否有hypervisor层,是否有ivshmem,使用命令:

代码语言:javascript
复制
cat /proc/iomem

找到hypervisor,看是否是在配置的内存地址上。

需要注意,每个cell的ivshmem是不一样的,需要设置标志位来提供读写能力,而且注意启动的系统的bin文件的启动地址,需要在main ram中配置好相应的地址。

​

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 前言
  • 一.欧拉系统介绍
    • 1.简单介绍
    • 2.和常见系统横向对比
  • 二.jailhouse虚拟化技术
    • 1.虚拟化技术介绍
    • 2.jailhouse介绍
  • 三.使用jailhouse
  • 四.问题汇总
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档