如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
官方Kselftests-virtme Docker镜像,基于openEuler构建,提供通过Virtme运行的内核自测试环境。该镜像主要用于验证https://github.com/multipath-tcp/mptcp_net-next%E4%BB%93%E5%BA%93%EF%BC%8C%E5%8F%AF%E4%BD%9C%E4%B8%BA%E5%BC%80%E5%8F%91%E5%92%8CCI%E5%B7%A5%E5%85%B7%EF%BC%8C%E6%9B%BF%E4%BB%A3%E5%9F%BA%E4%BA%8EUbuntu%E7%9A%84https://github.com/multipath-tcp/mptcp-upstream-virtme-docker%E3%80%82
镜像标签由virtme-ng版本和基础镜像版本组成,具体如下:
| 标签 | 当前内容 | 架构 |
|---|---|---|
| 1.27-oe2203sp4 | 基于openEuler 22.03-LTS-sp4的Virtme-ng 1.27 | amd64, arm64 |
启动镜像时需指定运行模式,支持以下选项:
manual-*:构建内核及依赖,启动虚拟机后提供VM内shell:
manual-normal:非调试内核配置manual-debug:调试内核配置manual-btf:带BTF支持(BPF功能所需)auto-*:构建内核及依赖,启动虚拟机后自动运行所有测试:
auto-normal:非调试内核配置auto-debug:调试内核配置auto-all:先非调试后调试内核配置auto-btf:带BTF支持其他选项:
make:运行make命令(可带参数)make.cross:运行Intel的make.cross命令(可带参数)build:仅构建所有内容,不启动VM(默认normal模式)defconfig:仅生成.config文件(默认normal模式)selftests:仅构建内核自测试bpftests:仅构建BPF测试cmd:在容器内运行指定命令(非VM内),如cmd bash获取容器shellstatic:静态分析,执行make W=1 C=1vm-manual:启动已构建环境的VM(默认normal模式)vm-auto:启动已构建环境的VM并运行测试(默认normal模式)src:source指定脚本文件help:显示所有可用命令所有manual-*和auto-*选项支持传递内核源码中scripts/config脚本的参数,如-e DEBUG_LOCKDEP。
bashcd <内核源码目录> docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" -v "${PWD}/.home:/root:rw" --rm \ -it --privileged --pull always openeuler/kselftests-virtme:latest \ <上述入口点选项>
注意:必须使用--privileged选项以支持QEmu的KVM加速。
可在内核源码根目录创建以下3个文件,实现测试流程自定义:
.virtme-exec-pre:测试套件执行前运行.virtme-exec-run:替代测试套件执行.virtme-exec-post:测试套件执行后运行这些脚本会被source执行,可使用virtme脚本中的函数。
通过-e参数设置环境变量以调整行为:
跳过内核构建
若内核代码未修改,设置INPUT_BUILD_SKIP=1跳过编译,加速VM启动:
bashdocker run -e INPUT_BUILD_SKIP=1 (...) openeuler/kselftests-virtme:latest (...)
使用CLang替代GCC
设置INPUT_CLANG=1启用CLang编译:
bashdocker run -e INPUT_CLANG=1 (...) openeuler/kselftests-virtme:latest (...)
非阻塞模式
设置INPUT_NO_BLOCK=1避免因文件存在而阻塞(适用于git bisect)。
错误后继续执行
设置INPUT_RUN_LOOP_CONTINUE=1使run_loop在检测到错误后继续执行,失败迭代记录于${CONCLUSION}.failed。
Packetdrill配置
INPUT_PACKETDRILL_STABLE=1:使用当前内核版本分支的Packetdrill,而非MPTCP net-next开发版INPUT_PACKETDRILL_NO_SYNC=1:不与上游同步Packetdrill(适用于挂载本地Packetdrill仓库)INPUT_PACKETDRILL_NO_MORE_TOLERANCE=1:不增加Packetdrill的容错性示例:
bashdocker run \ -e INPUT_PACKETDRILL_NO_SYNC=1 \ -e INPUT_PACKETDRILL_NO_MORE_TOLERANCE=1 \ -v /PATH/TO/packetdrill:/opt/packetdrill:rw \ -v "${PWD}:${PWD}:rw" -w "${PWD}" -v "${PWD}/.home:/root:rw" \ --privileged --rm -it \ openeuler/kselftests-virtme:latest \ manual # 在容器内运行Packetdrill测试 cd /opt/packetdrill/gtests/net/ ./packetdrill/run_all.py -lvv -P 2 mptcp/dss # 或其他子目录
修改Packetdrill后重新编译:
bashdocker exec -w /opt/packetdrill/gtests/net/packetdrill -it \ $(docker ps --filter ancestor=openeuler/kselftests-virtme --format='{{.ID}}') \ make
该镜像默认用于MPTCP上游项目验证,也可扩展用于其他子系统:
.virtme-prepare-post文件在准备阶段执行额外步骤(如自定义编译iproute2):
bashcat <<'EOF' > ".virtme-prepare-post" yum update -y && yum install -y python3-pip && pip3 install scapy-python3 EOF
基于该镜像构建新镜像以预装依赖:
dockerfileFROM openeuler/kselftests-virtme:latest RUN yum update -y && yum install -y python3-pip && pip3 install scapy-python3
bashdocker run (...) \ -e INPUT_BUILD_SKIP_PERF=1 \ # 跳过Perf构建 -e INPUT_BUILD_SKIP_SELFTESTS=1 \ # 跳内核自测试构建 -e INPUT_BUILD_SKIP_PACKETDRILL=1 \ # 跳过Packetdrill构建 (...) \ openeuler/kselftests-virtme:latest \ auto-normal
通过INPUT_SELFTESTS_DIR指定其他自测试目录:
bashdocker run (...) \ -e INPUT_SELFTESTS_DIR=tools/testing/selftests/tc-testing \ (...)
bash# 创建准备阶段脚本 cat <<'EOF' > ".virtme-prepare-post" yum update -y && yum install -y python3-pip && pip3 install scapy-python3 EOF # 创建测试执行脚本(仅运行自测试) cat <<'EOF' > ".virtme-exec-run" run_selftest_all EOF # 运行TC自测试,跳过Packetdrill构建,添加CONFIG_DUMMY docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" -v "${PWD}/.home:/root:rw" --rm \ -it --privileged \ -e INPUT_BUILD_SKIP_PACKETDRILL=1 \ -e INPUT_SELFTESTS_DIR=tools/testing/selftests/tc-testing \ --pull always openeuler/kselftests-virtme:latest \ auto-normal -e DUMMY
切换编译器主版本时可能出现:
Makefile.config:458: No gnu/libc-version.h found, please install glibc-dev[el]. Stop.
解决方法:清理构建目录:
bashdocker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --rm -it \ openeuler/kselftests-virtme:latest \ cmd rm -r .virtme/build*/tools
若使用https://github.com/FlorentRevest/linux-kernel-vscode%EF%BC%8C%E5%8F%AF%E5%B0%86%E6%8F%92%E4%BB%B6%E7%9A%84%60vscode%60%E7%9B%AE%E5%BD%95%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E6%88%96%E9%93%BE%E6%8E%A5%E5%88%B0%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E7%9A%84%60.vscode%60%E7%9B%AE%E5%BD%95%EF%BC%88%60.clangd%60%E9%9C%80%E6%94%BE%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E6%A0%B9%E7%9B%AE%E5%BD%95%EF%BC%89%E3%80%82
注意:
-e INPUT_CLANG=1启动容器仅扫描MPTCP文件的方法:
bashcd <内核源码目录> # 构建环境 docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" -v "${PWD}/.home:/root:rw" --rm \ -e INPUT_CLANG=1 \ -it --privileged --pull always openeuler/kselftests-virtme:latest \ build # 提取MPTCP相关编译命令 jq 'map(select(.file | contains ("/mptcp/")))' \ .virtme/build-clang/compile_commands.json > compile_commands-mptcp.json # 运行分析 docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" -v "${PWD}/.home:/root:rw" --rm \ -e INPUT_CLANG=1 \ -it --privileged --pull always openeuler/kselftests-virtme:latest \ cmd ./scripts/clang-tools/run-clang-tools.py clang-analyzer compile_commands-mptcp.json
如有问题或需特殊功能,请在openeuler-docker-images提交issue或PR。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务