Skip to content

feat(starry): support MySQL on Debian rootfs#1147

Merged
luodeb merged 9 commits into
rcore-os:devfrom
Alayfolk64:feat/debian_MySQL
Jun 5, 2026
Merged

feat(starry): support MySQL on Debian rootfs#1147
luodeb merged 9 commits into
rcore-os:devfrom
Alayfolk64:feat/debian_MySQL

Conversation

@Alayfolk64

@Alayfolk64 Alayfolk64 commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

支持 Debian 环境下的 MySQL

问题背景

MySQL 8.4 generic glibc 二进制包依赖 Debian/glibc rootfs、Linux AIO、epoll、fallocate、mempolicy、ioctl 等一组真实数据库运行路径。当前 StarryOS 已有 MariaDB app 验证基础,本 PR 延续 #906 的应用适配和回归验证方式,进一步支持 Oracle MySQL 在 x86_64 Debian rootfs 上完成初始化、启动、SQL 工作负载和重启持久化检查。

MySQL/InnoDB 运行过程中会触发以下兼容性需求:

  • 需要完整可用的 Linux AIO ring、提交队列、完成事件和事件等待语义。
  • 需要 epoll 兼容入口、非法参数校验和用户态事件结构读写兼容。
  • 需要 fallocate hole punch / zero range 等文件空间操作路径。
  • 需要单节点 NUMA 场景下的 get_mempolicyset_mempolicymbind 兼容返回。
  • 需要忽略或兼容 MySQL 探测路径中的部分 ioctl,例如 DirectFS/FusionIO atomic write toggle 和非 tty fd 上的 TCGETS 探测。

修改内容

  • 新增 apps/starry/mysql 应用适配用例。

    • 添加 x86_64 StarryOS build 配置、默认 QEMU 测试配置和交互式 QEMU 配置。
    • 添加 prebuild.sh,自动准备 Debian rootfs archive,生成 MySQL 专用 rootfs,下载 MySQL 8.4.6 generic glibc 包,并注入 libaiolibnumalibncurses 等运行时依赖。
    • 添加 mysql-test.sh,自动初始化数据目录、启动 mysqld、执行 15 组 SQL 工作负载,并验证重启后的持久化数据。
    • 添加 mysql-interactive.sh,用于进入 MySQL client 手动执行 SQL。
    • 添加中英文 README,说明 rootfs 准备、测试流程、交互模式和覆盖范围。
  • 完善 Linux AIO 兼容层。

    • 扩展 os/StarryOS/kernel/src/syscall/fs/aio.rs,支持 MySQL/libaio 可直接读取的 AIO ring 映射。
    • 完善 io_setupio_destroyio_submitio_geteventsio_pgeteventsio_cancel 等路径,完整实现了 AIO。
    • 支持 AIO 请求排队、完成事件写回、等待队列唤醒、eventfd 通知和 poll 请求。
    • 在当前内核能力边界内提供兼容语义,使 MySQL/InnoDB 初始化和 SQL 工作负载可以稳定运行。
  • 补齐 MySQL 触发的 syscall 兼容路径。

    • 增加 x86_64 兼容入口 epoll_createepoll_wait,并补充 epoll_ctlepfd == fd 的非法参数处理。
    • 调整 epoll_pwait timeout 行为,兼容应用对负数 timeout 的使用方式。
    • 增加 get_mempolicyset_mempolicymbind 的单 NUMA 节点兼容实现和参数校验。
    • 兼容 MySQL DirectFS/FusionIO atomic write ioctl 探测。
    • 降低非 tty fd 上常见 ioctl 探测的日志噪声。
    • 补充 fallocate 相关行为验证,覆盖 hole punch / zero range 场景。
  • 补充 syscall 和 bugfix 回归测试。

    • 新增 test-get-mempolicytest-set-mempolicytest-mbind
    • 扩展 Linux AIO 相关 syscall 测例,覆盖 context 生命周期、提交、完成事件、timeout、非法参数等路径。
    • 扩展 test-epolltest-fallocate
    • 新增 bug-epoll-compat-entrypointsbug-fallocate-zero-punchbug-mempolicy-validation
    • 将新增 bugfix 测例加入四种架构的 qemu 配置。
  • 移除没必要测例代码中没必要的 prebuild.sh

  • 因为这些 prebuild.sh 中需要 apk 拉取依赖,但是都是重复的,执行一次即可。频繁的 apk add 容易导致 CI 不通过。经检验,移除后 CI 和本地测试均正常通过

关键修复说明

MySQL app

项目 修改内容 作用
rootfs 准备 使用 Debian/glibc rootfs,生成 rootfs-x86_64-mysql.img 满足 Oracle MySQL generic glibc 包运行环境
MySQL 安装 下载或复用 MySQL 8.4.6 tarball,并安装到 /opt/mysql 避免 guest 内在线安装,保证测试输入稳定
运行时依赖 注入 libaiolibnumalibncurses 满足 mysqldmysql client 动态链接需求
自动测试 mysql-test.sh 执行初始化、启动、SQL workload、重启持久化检查 验证真实数据库运行路径
交互模式 mysql-interactive.sh 自动启动服务后进入 MySQL client 方便手动调试 SQL 和内核日志

Linux AIO

项目 修改内容 作用
AIO ring 建立用户态可读的 ring header 和 completion event 区域 适配 libaio/MySQL 直接读取 ring 的行为
io_setup 创建 context、映射 ring、写回 context id 支持 InnoDB 初始化 AIO 环境
io_submit 解析 iocb,支持 read/write/fsync/poll/noop 等请求 支持 MySQL 常用 AIO 提交路径
io_getevents 等待并返回完成事件 支持 MySQL 等待 I/O 完成
io_pgetevents 支持额外 signal mask 参数 兼容应用探测和等待路径
io_destroy 等待 inflight 请求结束并释放 context 支持进程退出和清理路径
io_cancel 对已完成/运行中请求返回兼容结果 避免清理路径因缺失 syscall 失败

其他 syscall 兼容

问题 修改内容 修复效果
epoll 兼容入口 增加 x86_64 epoll_createepoll_wait wrapper 兼容旧 ABI 和 libc 探测路径
epoll 自引用 epoll_ctlepfd == fd 返回 EINVAL 匹配 Linux 参数校验
NUMA mempolicy 支持单节点 get_mempolicyset_mempolicymbind 兼容 MySQL/glibc/numa 探测
fallocate hole punch 补充 zero punch 行为和回归测试 覆盖数据库文件空间管理路径
MySQL ioctl 探测 兼容 DirectFS atomic write toggle 避免 MySQL 初始化因探测 ioctl 失败

MySQL SQL 覆盖场景

类别 覆盖内容
服务初始化 mysqld --initialize-insecure、数据目录重建
服务启动 Unix socket、pid file、ready log、客户端连接
DDL 建库、建表、索引、视图
DML INSERT / UPDATE
查询 WHERE / ORDER BY / LIMIT / JOIN / GROUP BY
事务 COMMIT / ROLLBACK
临时对象 TEMPORARY TABLE
元数据 SHOW CREATE TABLEinformation_schema
持久化 非优雅重启后验证行数、视图、金额统计和回滚结果
内核路径 Linux AIO、epoll、fallocate、mempolicy、ioctl、文件读写

MySQL 15 组 SQL 测试

序号 测试主题 覆盖内容
1 创建数据库 创建 starry_mysql_test 并检查字符集和 collation
2 创建 users 表 创建带约束、唯一索引和 CHECK 的 InnoDB 表
3 插入 users 多行插入并按状态聚合
4 条件查询 使用范围过滤、IN、排序、LIMIT 和 GROUP_CONCAT
5 更新数据 更新 age、score、status 和 timestamp
6 二级索引 创建复合索引并执行 EXPLAIN
7 创建 orders 表 创建外键、二级索引和 InnoDB orders 表
8 插入 orders 与 JOIN 插入订单并执行 INNER/LEFT JOIN
9 聚合查询 按订单状态、日期、城市统计
10 COMMIT 事务 插入用户和订单后提交并验证
11 ROLLBACK 事务 插入、删除、更新后回滚并验证未生效
12 临时表 创建临时汇总表和数字表
13 视图和 schema 创建视图并查询 information_schema
14 一致性报告 写入 audit_log 并执行多维统计
15 重启持久化 重启 mysqld 后验证数据、视图和回滚结果

Syscall 和 bugfix 回归测试

测例 覆盖内容
test-io-setup AIO context 创建、参数检查、context id 写回
test-io-destroy AIO context 销毁、重复销毁、非法 context
test-io-submit AIO 请求提交、同步/异步完成、结果写回
test-io-getevents 完成事件读取、数量限制、timeout 路径
test-io-pgetevents 带 signal mask 的完成事件等待
test-io-cancel AIO cancel 兼容返回和非法参数
test-get-mempolicy 单节点 mempolicy 查询和 flags 校验
test-set-mempolicy policy mode、nodemask 和非法参数校验
test-mbind 地址对齐、长度、flags 和 nodemask 校验
test-epoll epoll 兼容入口、自引用、timeout 等行为
test-fallocate fallocate zero punch / hole punch 相关行为
bug-epoll-compat-entrypoints x86_64 旧 epoll ABI 兼容入口
bug-fallocate-zero-punch zero punch 后的数据内容和文件大小
bug-mempolicy-validation mempolicy 参数验证回归

验证结果

架构 测试命令 结果
x86_64 cargo xtask starry app qemu -t mysql --arch x86_64
x86_64 cargo xtask starry test qemu --arch x86_64
aarch64 cargo xtask starry test qemu --arch aarch64
riscv64 cargo xtask starry test qemu --arch riscv64
loongarch64 cargo xtask starry test qemu --arch loongarch64

@luodeb
luodeb merged commit 7aff9ff into rcore-os:dev Jun 5, 2026
49 checks passed
@ZR233

ZR233 commented Jun 5, 2026

Copy link
Copy Markdown
Member

补充审查记录:PR 已合入,以下问题建议后续单独修复。

  1. AIO context 缺少进程退出清理。当前 AIO_CONTEXTS 是全局表,AioContext 持有 Arc<Mutex<AddrSpace>>,并且 io_submit 后可能启动 worker。若进程没有显式调用 io_destroy 就退出,context 不会从全局表移除,worker 也不会被 destroying 唤醒退出;同时退出路径已经会清理 address space,遗留 context 后续只能指向已清空的地址空间。建议提供按 pid 清理 AIO context 的接口,并在最后一个线程退出时、释放 address space slot 前调用,语义上对齐 Linux 在进程/mm teardown 时销毁 AIO context 的行为。

  2. IOCB_FLAG_RESFD 目前只通过 get_file_like(cb.resfd) 解析 fd,接受任意 FileLike,完成时再写入 8 字节。Linux AIO 这里要求 aio_resfd 必须是 eventfd;非 eventfd 应在 io_submit 阶段失败。当前行为会让普通可写文件 fd 被当成通知目标,导致提交成功后写入文件内容,或在不可写 fd 上把通知错误吞掉。建议这里显式校验/downcast eventfd,并补一个 IOCB_FLAG_RESFD + 普通文件 fd 的负向测试。

本地验证记录:

  • cargo fmt --check:通过
  • cargo xtask clippy --package starry-kernel:13 个 feature 配置均通过
  • cargo xtask starry test qemu --arch x86_64 --test-group normal -c syscall:通过
  • cargo xtask starry test qemu --arch x86_64 --test-group normal -c bugfix:通过,其中新增的 bug-epoll-compat-entrypointsbug-fallocate-zero-punchbug-mempolicy-validation 均通过
  • cargo xtask starry app qemu -t mysql --arch x86_64:本机未能执行,prebuild.sh 要求 passwordless sudo 进行 loop mount

@ZR233

ZR233 commented Jun 5, 2026

Copy link
Copy Markdown
Member

已创建 follow-up issue 跟踪补充审查中提到的 AIO context 退出清理、IOCB_FLAG_RESFD eventfd 校验,以及 MySQL prebuild.sh 依赖 passwordless sudo 的问题:#1157

@github-actions github-actions Bot mentioned this pull request Jun 5, 2026

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

补充审查报告(PR #1147,已合入)

修改概述

本 PR 为 StarryOS 新增 MySQL on Debian rootfs 应用支持,主要包含:

  • apps/starry/mysql/:完整的 MySQL 8.4.6 应用适配,包括 prebuild.sh(Debian rootfs 准备、MySQL 安装、依赖注入)、mysql-test.sh(15 组 SQL 测试)、mysql-interactive.sh 和中英文 README。
  • os/StarryOS/kernel/src/syscall/fs/aio.rs:完整重写 Linux AIO 兼容层,实现 io_setup/io_destroy/io_submit/io_getevents/io_pgetevents/io_cancel,包括用户态 ring 映射、请求排队、worker 执行、eventfd 通知、poll 请求等。
  • os/StarryOS/kernel/src/syscall/task/ctl.rs:新增 get_mempolicy、set_mempolicy、mbind 的单 NUMA 节点兼容实现。
  • epoll 兼容入口(x86_64 epoll_create/epoll_wait)、epoll_ctl 自引用 EINVAL 处理、epoll_pwait 负数 timeout 兼容。
  • fallocate hole punch / zero range 行为补充。
  • 14 个新增 syscall/bugfix 回归测例,覆盖 AIO 生命周期、mempolicy、epoll 兼容入口、fallocate 等场景。

实现逻辑

AIO 实现遵循 Linux 内核的 ring buffer 模式:io_setup 在用户地址空间分配并映射 ring header + completion event 数组,写入 magic/版本/id 等头部字段,使 libaio 可直接读取。io_submit 解析 iocb,按操作类型(pread/pwrite/fsync/poll/noop/preadv/pwritev)快照用户态数据后交给 worker 执行。完成事件通过环形缓冲写回,支持 IOCB_FLAG_RESFD 事件通知。mempolicy 以单节点兼容方式实现,接受合法策略参数但忽略实际 placement。

本地验证

验证项 结果
cargo fmt --check ✅ 通过
cargo xtask clippy --package starry-kernel(13 个 feature 配置) ✅ 全部通过

CI 状态

CI 工作流 #27015149551 整体结论为 success。检查矩阵中 run_host 任务成功,run_container 和 board 任务按预期 skip(路径过滤和互斥矩阵条目)。无失败或取消的检查。

重复/重叠分析

搜索当前 open PR(#1158 ostool pin、#1159 CI dedupe、#1160 Wayland app),均与本 PR 的 AIO/mempolicy/epoll/fallocate/MySQL 改动无关。base 分支上没有等价实现。

已知后续问题

合入后的补充审查(@ZR233,issue #1157)已识别以下问题:

  1. AIO context 缺少进程退出清理AIO_CONTEXTS 是全局表,进程未显式 io_destroy 就退出时 context 不会移除、worker 不会退出。建议按 pid 清理,在释放 address space 前调用。代码验证确认 exit.rs 只调用 do_exit(),无 AIO 清理路径。

  2. IOCB_FLAG_RESFD 未校验 eventfdresolve_resfd 通过 get_file_like(cb.resfd) 接受任意 FileLike,Linux 要求必须是 eventfd。建议显式校验/downcast eventfd 并补充负向测试。代码验证确认 resolve_resfd(第 610 行)和 notify_resfd(第 736 行)均无 eventfd 校验。

  3. prebuild.sh 依赖 passwordless sudo:loop mount 操作需要 root 权限,普通开发环境无法直接复现 MySQL app 流程。

以上问题已跟踪在 #1157,不影响本 PR 的核心功能正确性。AIO 实现对 MySQL/InnoDB 工作负载的兼容性语义符合预期,ring buffer 映射和 completion 机制与 Linux libaio 兼容。

Powered by mimo-v2.5-pro


// Resolve the optional eventfd notification target from an iocb.
fn resolve_resfd(cb: &Iocb) -> AxResult<Option<Arc<dyn FileLike>>> {
if (cb.flags & IOCB_FLAG_RESFD) == 0 {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Linux AIO 要求 IOCB_FLAG_RESFD 中的 aio_resfd 必须是 eventfd,非 eventfd 应在 io_submit 阶段返回 EINVAL。当前 resolve_resfd 通过 get_file_like 接受任意 FileLike,notify_resfd 直接写入 8 字节,会导致普通文件 fd 被误写入。建议在此处显式 downcast eventfd 并对非 eventfd fd 返回错误。

Comment thread os/StarryOS/kernel/src/syscall/fs/aio.rs
@github-actions github-actions Bot mentioned this pull request Jun 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants