VM 内核管理
概述
epkg 使用 Linux 内核来运行虚拟机(通过 libkrun 或 QEMU)。内核是 VM 启动的核心组件,本节介绍如何管理和自定义 VM 内核。
内核来源
epkg 的 VM 内核可以来自以下途径:
1. 自动下载(推荐)
运行 epkg self install 时,会自动从 gitee releases 下载预编译的内核:
~/.epkg/envs/self/boot/
├── vmlinux -> vmlinux-6.19.6-x86_64 # 符号链接指向当前内核
├── vmlinux-6.19.6-x86_64 # 实际内核文件
└── config-6.19.6-x86_64 # 对应的配置文件
2. 本地构建
开发者可以自行编译内核:
# 构建并安装到 ~/.epkg/envs/self/boot/
cd git/sandbox-kernel
./scripts/build.sh
# 指定架构构建
./scripts/build.sh aarch64
# 构建所有架构(发布模式)
./scripts/build.sh ALL
3. 手动指定
运行 VM 时通过 --kernel 参数指定内核路径:
epkg run --kernel /path/to/vmlinux <package>
内核版本命名
内核文件命名格式:vmlinux-$version-$arch
version来自内核构建时的Linux version字符串arch为目标架构- 例如:
vmlinux-6.19.6-x86_64,vmlinux-6.19.6-aarch64
支持的架构
| 架构 | 内核格式 | 状态 |
|---|---|---|
| x86_64 | ELF vmlinux | 支持 |
| aarch64 | ELF vmlinux | 支持 |
| riscv64 | ELF vmlinux | 支持 |
| loongarch64 | - | 不支持 |
常见用例
查看当前内核版本
ls -la ~/.epkg/envs/self/boot/
# 或
file ~/.epkg/envs/self/boot/vmlinux
切换内核版本
如果存在多个内核版本,可以修改符号链接:
ln -sf vmlinux-6.12.68-x86_64 ~/.epkg/envs/self/boot/vmlinux
自定义内核配置
每个架构使用独立的完整配置文件:
git/sandbox-kernel/kconfig/
├── config-aarch64 # ARM64 完整配置
├── config-riscv64 # RISC-V 64 完整配置
└── config-x86_64 # x86_64 完整配置
修改配置后重新构建:
cd git/sandbox-kernel
# 编辑 kconfig/config-x86_64
./scripts/build.sh
更新配置文件(升级内核版本后):
# 1. 复制当前配置到内核源码
cp kconfig/config-x86_64 linux-stable/.config
# 2. 运行 olddefconfig 应用新选项的默认值
cd linux-stable
make ARCH=x86_64 olddefconfig
# 3. 解决交互式提示后,保存回配置文件
cp .config ../kconfig/config-x86_64
内核下载机制
epkg self install 会:
- 从 gitee 获取 sandbox-kernel 仓库的最新 release
- 查找匹配当前架构的
vmlinux-$kver-$arch.zst文件 - 下载并解压到
~/.epkg/envs/self/boot/
下载的文件格式:
vmlinux-6.19.6-x86_64.zst- zstd 压缩的内核vmlinux-6.19.6-x86_64.zst.sha256- 校验文件
与 libkrun 的关系
当使用 libkrun 运行 VM 时:
- 如果指定了
--kernel,使用指定的内核 - 如果未指定,使用
~/.epkg/envs/self/boot/vmlinux(默认内核) - 如果默认内核不存在,libkrun 无法启动 VM