前言
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 加载完成后,执行层级是这样的:
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
方式一:走社区仓库(推荐先试)
dnf list jailhouse # 先看看当前版本仓库里有没有 sudo dnf install -y jailhouseopenEuler 社区的源码包在src-openeuler/Jailhouse(已迁移至 AtomGit),基线为jailhouse-0.12.tar.gz,并带有若干国产平台与编译适配补丁。如果dnf里查不到,直接走方式二。
方式二:源码编译(推荐,可控)
# 依赖:内核头文件/构建目录、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 镜像 |
之后校验硬件
sudo modprobe jailhouse sudo jailhouse hardware checkx86 上它会逐项检查 VMX、EPT、unrestricted guest、preemption timer、VT-d 中断重映射等能力。这一步不通过,后面的所有步骤都没有意义,请先换硬件或改 BIOS 设置(VT-d 常见于 BIOS 里被默认关闭)。
然后生成系统配置
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。
生成后务必自检:
sudo jailhouse config check sysconfig.cell apic-demo.cell它会检查:cell 内部内存区域是否重叠、是否与 hypervisor 内存重叠、是否与 PCI MMCONFIG / IOMMU / xAPIC / IOAPIC 拦截区域重叠。"配置检查通过"是 enable 成功的前置条件,能省掉大量"机器直接挂死、串口无输出"的排查时间。
之后改启动参数并重启
# /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重启后确认:
dmesg | grep -i -e memmap -e iommu cat /proc/cmdline然后enable Jailhouse
# 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
# 查看当前 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输出会持续打印定时器抖动统计。随后可以:
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,使用命令:
cat /proc/iomem找到hypervisor,看是否是在配置的内存地址上。
需要注意,每个cell的ivshmem是不一样的,需要设置标志位来提供读写能力,而且注意启动的系统的bin文件的启动地址,需要在main ram中配置好相应的地址。