Skip to content

Commit e1db32e

Browse files
authored
feat: add gvisor syscall test (#1271)
* feat(tests): 添加gvisor系统调用测试套件 新增gvisor系统调用测试框架,包含Makefile、运行脚本、文档和测试用例。调整rootfs镜像大小为2G以适应测试需求。 Signed-off-by: longjin <[email protected]> * feat(gvisor): 重构测试运行器为Rust实现并添加DADK支持 - 将Shell脚本实现的测试运行器重写为Rust版本 - 添加DADK构建配置文件以支持DragonOS应用开发工具链 - 更新Makefile以支持Rust工具链和DADK安装目标 - 增强下载脚本功能,支持跳过已存在测试套件和强制下载选项 - 移除原有的run_tests.sh脚本,替换为更高效的Rust实现 Signed-off-by: longjin <[email protected]> * feat(config): 添加应用程序黑名单功能 - 新增 app-blocklist.toml 配置文件模板,支持多种应用程序匹配方式 - 支持严格模式和非严格模式配置 - 添加黑名单配置文件路径到 dadk-manifest.toml - 提供详细的配置说明和示例 Signed-off-by: longjin <[email protected]> * docs: 更新gVisor系统调用测试文档 - 新增gVisor系统调用测试文档,包含概述、快速开始和测试机制说明 - 删除旧的测试运行器README文档 Signed-off-by: longjin <[email protected]> --------- Signed-off-by: longjin <[email protected]>
1 parent a0ef97e commit e1db32e

File tree

19 files changed

+1781
-2
lines changed

19 files changed

+1781
-2
lines changed

config/app-blocklist.toml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# =========================================================
2+
# DADK 应用程序黑名单配置文件模板
3+
# =========================================================
4+
#
5+
# 应用程序黑名单功能允许用户指定不希望编译和安装的应用程序。
6+
# 当黑名单中的应用程序被检测到时,DADK 会根据配置自动跳过这些应用程序的构建和安装过程。
7+
8+
# =========================================================
9+
# 全局配置选项
10+
# =========================================================
11+
12+
# 是否启用严格模式(可选)
13+
# - true(默认):严格模式,跳过被屏蔽的应用程序并记录警告
14+
# - false:非严格模式,只记录警告但不跳过应用程序
15+
strict = true
16+
17+
# 是否在日志中显示被跳过的应用(可选)
18+
# - true(默认):在日志中显示被跳过的应用程序信息
19+
# - false:静默模式,不显示被跳过的应用程序
20+
log_skipped = true
21+
22+
# =========================================================
23+
# 被屏蔽的应用程序列表
24+
# =========================================================
25+
#
26+
# 支持以下匹配方式:
27+
# 1. 精确匹配: name = "app1"
28+
# 2. 版本匹配: name = "[email protected]"
29+
# 3. 通配符名称: name = "test-*"
30+
# 4. 通配符版本: name = "nginx@1.*"
31+
# 5. 复合模式: name = "lib*@2.*"
32+
#
33+
# 每个应用可以选择性地提供屏蔽原因(reason)
34+
35+
36+
# =========================================================
37+
# 配置说明和注意事项
38+
# =========================================================
39+
#
40+
# 1. **依赖关系**:如果其他应用程序依赖被屏蔽的应用程序,构建过程可能会失败。
41+
# 请确保处理好依赖关系。
42+
#
43+
# 2. **模式匹配优先级**:
44+
# - 精确匹配 > 版本匹配 > 模式匹配
45+
# - 如果有多个模式都匹配,使用第一个匹配的结果
46+
#
47+
# 3. **通配符语法**:
48+
# - "*" 匹配任意数量的字符(包括0个)
49+
# - "?" 匹配单个字符
50+
# - 支持在名称和版本中使用通配符
51+
#
52+
# 4. **版本格式**:
53+
# - 版本号使用 "@" 符号分隔,如 "[email protected]"
54+
# - 版本号支持通配符,如 "app@1.*"
55+
#
56+
# 5. **配置文件路径**:
57+
# - 默认路径:config/app-blocklist.toml
58+
# - 可在 dadk-manifest.toml 中通过 app-blocklist-config 字段自定义路径
59+
#
60+
# 6. **字段说明**:
61+
# - name:应用程序名称或匹配模式(必需)
62+
# - reason:屏蔽原因说明(可选,建议提供以便调试和维护)
63+
64+
# 屏蔽gvisor系统调用测试
65+
[[blocked_apps]]
66+
name = "gvisor syscall tests"
67+
reason = "由于文件较大,因此屏蔽。如果要允许系统调用测试,则把这几行取消注释即可"

config/rootfs.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Filesystem type (options: `fat32`)
33
fs_type = "fat32"
44
# Size of the rootfs disk image (eg, `1G`, `1024M`)
5-
size = "1G"
5+
size = "2G"
66

77
[partition]
88
# Partition type (options: "none", "mbr", "gpt")

dadk-manifest.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,7 @@ cache-root-dir = "bin/dadk_cache"
2222
# User configuration directory path
2323
# 这个字段只是临时用于兼容旧版本,v0.2版本重构完成后会删除
2424
user-config-dir = "user/dadk/config"
25+
26+
# Application blocklist configuration file path
27+
app-blocklist-config = "config/app-blocklist.toml"
28+
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
==============================
2+
gVisor 系统调用测试
3+
==============================
4+
5+
DragonOS 集成了 gVisor 系统调用测试套件,用于验证操作系统系统调用实现的兼容性和正确性。
6+
7+
概述
8+
========
9+
10+
gVisor 是 Google 开发的容器运行时沙箱,包含了大量的系统调用兼容性测试。这些测试用于验证操作系统的系统调用实现是否符合 Linux 标准。
11+
12+
主要特性:
13+
14+
- **全面的测试覆盖**:包含数百个系统调用测试用例
15+
- **白名单机制**:默认只运行已验证的测试,逐步完善支持
16+
- **黑名单过滤**:可针对每个测试程序屏蔽特定的测试用例
17+
- **自动化运行**:提供 Makefile 和脚本简化测试流程
18+
19+
快速开始
20+
==========
21+
22+
1. 进入测试目录:
23+
24+
.. code-block:: bash
25+
26+
cd user/apps/tests/syscall/gvisor
27+
28+
2. 在Linux运行白名单测试(自动下载测试套件):
29+
30+
.. code-block:: bash
31+
32+
make test
33+
34+
3. 如果需要运行测试,请先修改配置文件:
35+
36+
编辑 `config/app-blocklist.toml`,注释掉以下内容:
37+
38+
.. code-block:: toml
39+
40+
# 屏蔽gvisor系统调用测试
41+
# [[blocked_apps]]
42+
# name = "gvisor syscall tests"
43+
# reason = "由于文件较大,因此屏蔽。如果要允许系统调用测试,则把这几行取消注释即可"
44+
45+
4. 在 DragonOS 系统内运行测试:
46+
47+
进入安装目录并运行测试程序:
48+
49+
.. code-block:: bash
50+
51+
cd /opt/tests/gvisor
52+
./gvisor-test-runner --help
53+
54+
使用 ``./gvisor-test-runner`` 可以运行具体的测试用例。
55+
56+
5. 查看详细文档:
57+
58+
请参阅 `user/apps/tests/syscall/gvisor/README.md` 获取完整的使用说明。
59+
60+
测试机制
61+
==========
62+
63+
白名单模式
64+
-----------
65+
66+
测试框架默认启用白名单模式,只运行 ``whitelist.txt`` 中指定的测试程序。这允许逐步验证 DragonOS 的系统调用实现。
67+
68+
黑名单过滤
69+
-----------
70+
71+
对于每个测试程序,可以通过 ``blocklists/`` 目录下的文件屏蔽特定的测试用例。这对于跳过暂不支持或不稳定的测试非常有用。
72+
73+
更多详细信息
74+
==============
75+
76+
关于 gVisor 系统调用测试的详细使用方法、配置选项和开发指南,请查看测试目录下的 README.md 文档:
77+
78+
- 文档位置:`user/apps/tests/syscall/gvisor/README.md`
79+

docs/kernel/ktest/index.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@
1717
:maxdepth: 1
1818
:caption: 目录
1919

20+
gvisor_syscall_test.rst
21+

user/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ user_sub_dirs = apps
22

33
DADK_VERSION=$(shell dadk -V | awk 'END {print $$2}')
44
# 最小的DADK版本
5-
MIN_DADK_VERSION = 0.4.0
5+
MIN_DADK_VERSION = 0.5.0
66
DADK_CACHE_DIR = $(ROOT_PATH)/bin/dadk_cache
77

88
ECHO:
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/tests/
2+
/results/
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# gvisor系统调用测试 Makefile
2+
# 用于DragonOS项目
3+
4+
# Rust工具链配置
5+
TOOLCHAIN="+nightly-2025-08-10-x86_64-unknown-linux-gnu"
6+
RUSTFLAGS+=""
7+
8+
ifdef DADK_CURRENT_BUILD_DIR
9+
# 如果是在dadk中编译,那么安装到dadk的安装目录中
10+
INSTALL_DIR = $(DADK_CURRENT_BUILD_DIR)
11+
else
12+
# 如果是在本地编译,那么安装到当前目录下的install目录中
13+
INSTALL_DIR = ./install
14+
endif
15+
16+
ifeq ($(ARCH), x86_64)
17+
export RUST_TARGET=x86_64-unknown-linux-musl
18+
else ifeq ($(ARCH), riscv64)
19+
export RUST_TARGET=riscv64gc-unknown-linux-gnu
20+
else
21+
# 默认为x86_64,用于本地编译
22+
export RUST_TARGET=x86_64-unknown-linux-musl
23+
endif
24+
25+
.PHONY: all build install download test list run clean help
26+
27+
# 默认目标:构建并安装
28+
all: build install
29+
30+
# 显示帮助信息
31+
help:
32+
@echo "gvisor系统调用测试 Makefile"
33+
@echo ""
34+
@echo "可用目标:"
35+
@echo " all - 构建并安装测试运行器(默认)"
36+
@echo " build - 构建Rust测试运行器"
37+
@echo " install - 安装测试运行器和必要文件"
38+
@echo " download - 下载gvisor测试套件"
39+
@echo " test - 运行白名单中的测试"
40+
@echo " list - 列出所有可用测试"
41+
@echo " run - 运行测试并传递参数(如:make run ARGS=\"-v epoll_test\")"
42+
@echo " clean - 清理测试文件和结果"
43+
@echo " help - 显示此帮助信息"
44+
@echo ""
45+
@echo "环境变量:"
46+
@echo " SYSCALL_TEST_WORKDIR - 测试工作目录(默认: /tmp/gvisor_tests)"
47+
@echo " TEST_TIMEOUT - 单个测试超时时间(默认: 300秒)"
48+
49+
# 构建Rust测试运行器
50+
build:
51+
@echo "构建gvisor测试运行器..."
52+
@cd runner && RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET) --release
53+
54+
# 下载测试套件
55+
download:
56+
@echo "下载gvisor测试套件..."
57+
@./download_tests.sh
58+
59+
# 安装到目标目录
60+
install: build
61+
@echo "安装gvisor测试套件到 $(INSTALL_DIR)"
62+
@mkdir -p $(INSTALL_DIR)
63+
# 安装Rust测试运行器二进制文件
64+
@cp -f runner/target/$(RUST_TARGET)/release/runner $(INSTALL_DIR)/gvisor-test-runner
65+
# 安装测试配置文件
66+
@cp -f whitelist.txt $(INSTALL_DIR)/
67+
@cp -rf blocklists $(INSTALL_DIR)/
68+
# 安装下载脚本(用于目标系统上下载测试)
69+
@cp -f download_tests.sh $(INSTALL_DIR)/
70+
@chmod +x $(INSTALL_DIR)/download_tests.sh
71+
@chmod +x $(INSTALL_DIR)/gvisor-test-runner
72+
@echo "安装完成"
73+
74+
# 运行测试
75+
test: build
76+
@echo "运行gvisor系统调用测试..."
77+
@if [ ! -d tests ]; then \
78+
echo "测试套件不存在,正在下载..."; \
79+
./download_tests.sh; \
80+
fi
81+
@./runner/target/$(RUST_TARGET)/release/runner
82+
83+
# 列出所有测试
84+
list: build
85+
@if [ ! -d tests ]; then \
86+
echo "测试套件不存在,正在下载..."; \
87+
./download_tests.sh; \
88+
fi
89+
@./runner/target/$(RUST_TARGET)/release/runner --list
90+
91+
# 运行测试并传递参数
92+
run: build
93+
@if [ ! -d tests ]; then \
94+
echo "测试套件不存在,正在下载..."; \
95+
./download_tests.sh; \
96+
fi
97+
@./runner/target/$(RUST_TARGET)/release/runner $(ARGS)
98+
99+
# 清理
100+
clean:
101+
@echo "清理测试文件和结果..."
102+
@rm -rf results/
103+
@rm -f gvisor-syscalls-tests.tar.xz
104+
@cd runner && cargo clean
105+
@echo "清理完成"

0 commit comments

Comments
 (0)