快速上手 Multikernel
将你的 Linux 内核分离为多个独立实例,分别用于应用程序和设备处理。无需虚拟机管理程序,没有虚拟化开销,完整硬件访问权限。
构建内核
克隆并编译支持 multikernel 的 Linux 内核
加载 Lazy CMA
在运行时分配内存池,无需任何启动参数
启动实例
使用 kerf 创建、配置并运行内核实例
什么是 Multikernel Linux?
Multikernel 将 Linux 内核分离为多个独立实例,在同一台物理机器上同时运行。你的应用程序获得属于自己的内核,拥有专用 CPU、内存,且不受任何中断干扰。设备驱动与 I/O 处理运行在独立核心上的另一个内核中。无需虚拟机管理程序,原生性能。
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Web Server │ │ Database │ │ ML Training │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ Linux Kernel │ │ Linux Kernel │ │ Linux Kernel │
│ (Web-tuned) │ │ (I/O-optimized)│ │ (GPU-optimized)│
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ CPU + NIC │ │ CPU + NVMe │ │ CPU + GPU │
└─────────────────┘ └─────────────────┘ └─────────────────┘
每个工作负载都运行在拥有定制配置的独立内核中,与其他实例完全隔离。某个实例中的驱动崩溃或内核漏洞利用无法影响其他实例。可以在运行时使用标准 Linux 热插拔机制在各内核之间重新平衡资源。
| 容器 | 虚拟机 | Multikernel | |
|---|---|---|---|
| 隔离性 | 共享内核 | 完全隔离(虚拟机管理程序) | 独立内核 |
| 性能 | 接近原生 | 5%-20% 开销 | 原生 |
| 内核定制 | 否 | 可以 | 可以 |
| 动态资源 | 可以 | 有限 | 可以(热插拔) |
| 零停机更新 | 仅应用 | 需借助编排系统 | 内核 + 应用 |
| 攻击面 | 完整内核 | 已缩减 | 单个实例极小 |
1 构建 Multikernel 内核
克隆支持 multikernel 的 Linux 内核,并开启 CONFIG_MULTIKERNEL 和 CONFIG_MKTTY 进行构建。
git clone https://github.com/multikernel/linux.git
cd linux
cp /boot/config-$(uname -r) .config # 以当前运行内核的配置为起点
make menuconfig # Enable CONFIG_MULTIKERNEL=y and CONFIG_MKTTY=y
make -j$(nproc)
sudo make modules_install
sudo make install
这样会生成一个带有 multikernel 扩展的标准 Linux 内核。它会作为你的常规内核运行,并且还能额外生成新的内核实例。
2 加载 Lazy CMA 模块
子内核需要连续的物理内存。Lazy CMA 是一个树外(out-of-tree)内核模块,可在运行时完成分配:无需启动参数,无需重启,也无需提前规划容量。
git clone https://github.com/multikernel/lazy_cma.git
cd lazy_cma
make
sudo insmod lazy_cma.ko
加载模块后会创建 /dev/lazy_cma。Kerf 会直接通过它分配内存池,因此无需其他配置。内存池可调整大小、支持 NUMA 感知,并可在 /proc/iomem 中查看。
3 安装 Kerf 管理工具
Kerf 是用于创建、配置和管理 multikernel 实例的命令行工具,负责资源分配、内核加载以及实例生命周期管理。
git clone https://github.com/multikernel/kerf.git
cd kerf
pip install -e .
4 启动你的第一个实例
初始化资源池,创建实例,然后将其启动:
# Initialize: CPUs 4-31 and an 8 GB memory pool (allocated via lazy_cma)
kerf init --cpus=4-31 --memory=8GB
# Create an instance with 4 CPUs and 2 GB of memory
kerf create web-server --cpus=4-7 --memory=2GB
# Load a kernel that boots straight into a Docker image (via DAXFS)
kerf load web-server --kernel=/boot/vmlinuz --image=nginx:latest
# Boot the instance
kerf exec web-server
子内核会在分配到的 CPU 和内存上启动,直接运行在硬件之上。它拥有自己的调度器、自己的网络协议栈,以及对分配给它的设备的独立视图。
使用 --image 时,kerf 会从 Docker 镜像构建 DAXFS 镜像,子内核直接将其挂载为根文件系统。DAXFS 是树外模块,kerf 不会自动加载它。仅当你需要从 Docker 镜像启动或共享主机目录时,才需要先手动加载:
git clone https://github.com/multikernel/daxfs.git
cd daxfs
make
sudo insmod daxfs.ko
子内核同样需要 DAXFS 支持:将其编译进内核,或通过 --initrd 传入包含 daxfs.ko 的 initramfs。仅用 --initrd 启动传统 initrd 时完全不需要 DAXFS。
关键组件
multikernel 技术栈由多个开源项目组成:
- Multikernel Linux - 内核补丁,支持使用 kexec 子系统生成并管理额外的内核实例
- Kerf - 用于管理内核实例、资源和生命周期的编排工具;直接驱动 Lazy CMA 与 DAXFS,无需额外工具
- DAXFS - 树外内核模块,使用直接内存访问在多个内核实例之间共享的文件系统,支持共享容器根文件系统和零拷贝数据共享
- Lazy CMA - 树外内核模块,提供运行时连续内存分配;为子内核提供的内存池可调整大小、支持 NUMA 感知,无需启动时预留
底层工作原理
- 通过 kexec 生成内核 - 新内核使用 Linux 现有的 kexec 机制启动,该机制经过扩展,可与主内核并行运行,而非将其替换
- 资源分区 - CPU、内存和设备通过标准热插拔接口在各内核之间分配
- 硬件队列共享 - 现代网卡和 SSD 拥有多个硬件队列;每个内核独占访问特定队列,实现真正的硬件级隔离
- 内核间网络 - 每个子内核都获得一个标准 Linux 网络设备,底层由共享内存中的描述符环支撑;数据帧留在共享内存中,跨内核传递的只有描述符,应用程序无需修改即可使用普通套接字
- Docker 集成 - 子内核可以使用 DAXFS 共享容器根文件系统,直接启动进 Docker 镜像,无需操作系统初始化层
准备好试试了吗?
全部 multikernel 组件均为开源。欢迎查看代码、提交 issue,或联系我们进行技术评估。