Repository navigation
Releases: Shikochin/Droidspaces-LKM
Release list
v0.1.5 — PLZ110 Docker compatibility fixes
Droidspaces LKM v0.1.5 — PLZ110 Docker 兼容性修复
在现有 PLZ110 内核上通过纯 LKM 修复 namespace 引用泄漏、避免子 user namespace
中的原生 OverlayFS 告警,并补充 xt_addrtype 与 nftables。保留 PID / IPC、
devtmpfs、Sandboxing 和普通沙箱 FUSE 支持,无需刷写内核。
修复与新增功能
- 引用回收:定位到指定厂商模块
oplus_sys_stability_helper的
send_signal_catcher获取 PID 引用后未释放。新的droidspaces_compat.ko
校验完整回调指令指纹和调用目标,只替换遗漏释放的调用点;保留信号与日志行为。
指纹不符会拒绝加载。修复阻止新泄漏,旧引用需重启清除。 - OverlayFS:初始 user namespace 中的原生 OverlayFS 保持可用;子 user
namespace 中的 mount / fsopen 在进入不兼容原生路径前返回EOPNOTSUPP,
避免内核 WARN。子 namespace 可使用已支持的 fuse-overlayfs;本版未实现原生
child-owned OverlayFS。 - netfilter:新的
droidspaces_netfilter.ko提供xt_addrtype、nftables
核心、集合、conntrack、NAT / masquerade / redirect、FIB、reject、logging、
limit 和 xtables 兼容层,支持 IPv4、IPv6、INET。每个网络 namespace 的 nftables
状态使用独立扩展存储,不改变原生struct net布局。 - 开机加载:KernelSU 依次加载 namespace、devtmpfs、compat、netfilter 四个
.ko,核对文件哈希并执行 Sandboxing 健康检查。模块自身不创建防火墙规则。
实现来源和重现方法见 compat 来源记录、
netfilter 来源记录 与仓库测试脚本。
验证范围
发布前完成指定 GKI 和 PLZ110 原始内核的 QEMU 回归,并在 PLZ110 的 SELinux
Enforcing 环境验证开机加载及实际 Droidspaces 容器。详细结果、载荷、源码和本地
证据哈希记录于 build/plz110-0.1.5.json,安装包内包含同一份 validation.json。
- 完整 user namespace / FUSE 回归:22 项策略、32 轮退出竞态、保留 FD、直接及
Droidspaces 容器内的 Bubblewrap。 - OverlayFS:rootful copy-up、whiteout、重新挂载,以及 32 轮子 namespace 的
mount / fsopen 拒绝与引用回收。 - 厂商回调离线测试:原始指令重现泄漏、拒绝指纹不匹配、64 次修复后调用与回收。
厂商 ELF 和 HMA 均不随仓库或发布包分发。 - Docker 29.9.0:iptables-legacy、iptables-nft、原生 nftables 三种后端,覆盖
bridge、容器 DNS / HTTP、端口发布、跨 namespace 访问、MASQUERADE 和跨桥隔离。 - nftables:IPv6 集合丢弃 / 放行、失败批次回滚及 IPv4 / IPv6 INET DNAT。
- 真机失败路径回归:16 次预期启动失败与 8 次成功运行后 PID / user namespace
计数回到基线;完整停止测试容器后归零。
设备原始日志不公开。厂商已有的启动与休眠告警不作为本项目修复范围;本版不声称
整个设备无告警。开机验证采用额外写入 disable 的一次性保护脚本,验证通过后恢复
正式脚本;发布包与测试使用相同 .ko 和加载逻辑。
安装与产物
仅支持 PLZ110 / qcom,canoe,ARM64、4 KiB 页面及完整内核版本:
6.12.69-android16-6-g242e1a07f878-ab15865446-4k
BTF SHA256:1870e245673b3eaae0d1fdafb0fd7027888b638018ed9561943a51dc2539d6af。
额外要求厂商信号回调与记录的指令指纹匹配。不适用于 PLC110 6.6,也不替代 GKI v0.2.0。
在 KernelSU 中安装 Droidspaces-LKM-KernelSU-v0.1.5-PLZ110.zip 后重启。
模块 ID 为 droidspaces_lkm,作者为 Shikochin。升级会替换同 ID 的旧版本;
此前禁用了模块的用户应确认已启用。已激活的 namespace、devtmpfs 和 compat
必须重启才能替换或移除。
Release 另含四个独立载荷和 SHA256SUMS:
droidspaces_ns-6.12.69-canoe.kodroidspaces_devtmpfs-6.12.69-plz110.kodroidspaces_compat-6.12.69-plz110.kodroidspaces_netfilter-6.12.69-plz110.ko
推荐使用完整 ZIP。简介在四个模块加载及基础健康检查通过后显示 [已加载];
扩展加载失败显示 [部分加载],具体原因记录在模块目录的 load.log。
状态是加载时检查结果,不是持续监控,也不会在开机时启动 Docker 测试容器。
已知限制
- rootless Docker 的 seccomp / capability 问题本版未处理。失败路径测试不代表
rootless Docker 已可正常使用,也不建议用扩大 capability 作为日常配置。 - 未补充 cgroup 控制器;CPU、cpuset、swap 和部分 I/O 限额仍可能不可用。
- 未实现
br_netfilter、nftables bridge / netdev families;已测 Docker 网络使用
默认 userland proxy,关闭它的路径仍不支持。 - Docker 原生 nftables 后端仍属于 Docker 的实验功能;本次未验证 Swarm,测试
显式启用容器网络 namespace 内的 IPv4 forwarding。 - 未证明完整 CONFIG_USER_NS 等价性、所有容器应用或长期高负载稳定性。
本版本继续作为指定设备的预发布版本发布。
v0.1.4 — PLZ110 sandbox FUSE
Droidspaces LKM v0.1.4 — PLZ110 沙箱 FUSE
在现有 PLZ110 内核上,通过纯 LKM 支持沙箱内新建普通 FUSE 挂载,无需刷写内核。
保留 v0.1.3 的首次解锁修复,以及 PID / IPC、devtmpfs 和 Sandboxing 支持。
变化
- 恢复 FUSE 连接所属 user namespace、请求 UID/GID、文件属主、属性修改和创建时的身份转换。
- 恢复 FUSE 权限与 POSIX ACL 映射,保留 LSM、设备 FD 所有者和 namespace 访问限制。
- 支持 Bubblewrap 内真实 FUSE daemon 的创建、读写、截断、chown 和卸载,包含在 Droidspaces 容器内运行的场景。
- 保留 Android 宿主 FUSE 的原生初始化约定,避免再次读取编译器省略的参数。
沙箱内不支持 Android FUSE-BPF backing、no_daemon、fuseblk、passthrough
或 idmapped FUSE mount;宿主连接保留原有扩展。沙箱仍需 /dev/fuse 访问与自身
mount namespace 内的挂载权限。配置示例及实现边界见 FUSE 适配记录。
验证
- GKI 与 PLZ110 原始内核的 QEMU 完整回归通过,均预加载 HMA。
- PLZ110 真机开机自动加载、首次密码解锁、文件管理器正常,Android 模拟存储 FUSE 挂载正常,无重启。
- 真机 SELinux 保持 Enforcing;HMA UID Fake 0.4.0+1c71b6c 和 NoMount 保持运行。
- 无宿主特权的 UID 1000 创建 user namespace 后,FUSE 实际读写、多 UID/GID 映射、命名用户/组 ACL 往返及权限判断通过。
- 父级预开设备 FD、父级/兄弟 namespace 访问、未映射属主和扩展响应拒绝测试通过;设备及挂载 FD 保留/释放通过八轮回归。
- 22 项策略、32 轮映射 FD 与退出竞态、直接及 Droidspaces 容器内的 Bubblewrap 回归通过。
- PID / IPC / POSIX mqueue、devtmpfs 八轮热插拔与打开 FD 生命周期回归通过。
- 异步清理后 user namespace 活跃计数为零,devtmpfs 错误为零;正式加载器连续两次检查及 14 项加载器测试通过。
两颗 VM 无 BUG、WARNING、Oops 或 panic。真机保留厂商驱动启动告警及
oplus_secure_guard_new 提权上报路径的 FORTIFY 告警,未发现 FUSE/Droidspaces
的 Oops 或 panic。设备原始日志不随发布包公开,验证清单仅记录哈希。
开机测试使用与发布包相同的 .ko 和加载逻辑,额外写入下一次启动禁用的保护标记;
确认正常后恢复正式开机脚本。源码、二进制、内核与证据哈希见 validation.json
及仓库 build/plz110-0.1.4.json。
安装与产物
仅支持 PLZ110 / qcom,canoe,ARM64、4 KiB 页面及完整内核版本:
6.12.69-android16-6-g242e1a07f878-ab15865446-4k
BTF SHA256:1870e245673b3eaae0d1fdafb0fd7027888b638018ed9561943a51dc2539d6af。
安装与开机均核对设备、完整内核版本、BTF 指纹及载荷哈希。
不适用于 PLC110 6.6,也不替代此前的独立 GKI v0.2.0。
在 KernelSU 中安装 ZIP 并重启。模块 ID 为 droidspaces_lkm,作者为 Shikochin。
已激活 .ko 固定在当前内核中,更新、禁用或卸载需重启生效;升级前禁用了模块的用户,
安装后应确认模块已启用。Droidspaces 容器需启用 --allow-sandboxing,安装包不修改现有容器配置。
droidspaces_ns-6.12.69-canoe.ko:PID / IPC / user namespace 与沙箱 FUSE 合并载荷。droidspaces_devtmpfs-6.12.69-plz110.ko:沿用 v0.1.1 的 devtmpfs 载荷。Droidspaces-LKM-KernelSU-v0.1.4-PLZ110.zip:上述载荷、功能检查器和开机脚本。SHA256SUMS:发布文件校验值。
简介在 PID / IPC 接口、devtmpfs 状态及 Sandboxing 身份映射与权限检查通过时显示
[已加载];失败时显示具体原因。开机检查不运行完整 FUSE 读写套件,也不是持续监控。
日志位于模块目录的 load.log。独立 namespace .ko 参数仍为
activate=1 userns_device_test=1,推荐使用完整 ZIP。
本版本仍为指定设备预发布版,不声称完整 CONFIG_USER_NS 等价性。其他内联权限路径、
长期高负载、所有 Android SELinux 域,以及完整 Docker / Podman / Flatpak / 浏览器
应用均不在本次验证范围内。
Droidspaces LKM v0.1.3 — PLZ110 FUSE 开机修复
Droidspaces LKM v0.1.3 — PLZ110 FUSE 开机修复
修复 v0.1.2 在首次输入密码、Android 挂载模拟存储时发生的内核崩溃。
v0.1.2 Release 及附件已撤下,Git 标签保留用于追溯。请使用此版本。
原因与修复
原内核没有启用 USER_NS,编译器省略了 FUSE 初始化中不再使用的 user namespace
参数。v0.1.2 的移植函数读取了这个无效参数,导致 ds_fuse_conn_init 空指针崩溃。
此前解锁后手动加载时 FUSE 已经挂载,因此没有触发这条路径。
v0.1.3 保留原生 FUSE 连接的初始 namespace 所有权,不再读取被编译器省略的参数。
沙箱内新建 FUSE 挂载暂时返回 EOPNOTSUPP,避免未经完整移植的身份转换路径
错误地使用宿主权限。Android 宿主 FUSE 与已有 Sandboxing 工作负载正常使用。
这不是通过延时加载绕开问题。
验证
- GKI 和 PLZ110 原始内核的 QEMU 均先复现旧版 FUSE 崩溃;修正版通过加载前后
的 FUSE 挂载、卸载,以及拒绝沙箱创建 FUSE 的回归。 - PLZ110 真机完成开机自动加载、首次密码解锁和文件管理器使用;Android 的
/mnt/user/0/emulated、/storage/emulated等 FUSE 挂载正常。 - 开机后再次通过真实 UID 1000 的 22 项策略测试、32 轮映射 FD 与退出竞态,
以及直接运行和在 Droidspaces 6.6.0 容器内运行的三种 Bubblewrap 配置。 - PID / IPC / POSIX mqueue、devtmpfs 八轮热插拔及打开 FD 生命周期回归通过。
- 全局 SELinux 保持 Enforcing,HMA UID Fake 0.4.0+1c71b6c 和 NoMount 保持运行。
- Namespace 活跃计数回到零,devtmpfs 错误计数为零。KernelSU 加载器 14 项测试通过。
真机开机验证使用相同 .ko 与加载逻辑,测试时额外设置了崩溃后下次启动禁用的
保护标记;通过验证后已恢复正常开机脚本。ZIP 的版本信息与验证清单随后更新为 v0.1.3。
详见 故障与修复记录 和 实现范围。
安装与产物
仅支持 PLZ110 / qcom,canoe,ARM64、4 KiB 页面,完整内核版本:
6.12.69-android16-6-g242e1a07f878-ab15865446-4k
BTF SHA256:1870e245673b3eaae0d1fdafb0fd7027888b638018ed9561943a51dc2539d6af。
安装和启动都会核对设备、完整内核版本、BTF 指纹和载荷哈希。
此版本不适用于 PLC110 的 6.6 内核,也不替代独立 GKI v0.2.0。
在 KernelSU 中安装 ZIP 后重启。模块 ID 仍为 droidspaces_lkm,作者 Shikochin。
已激活的 .ko 无法热替换,更新、禁用或卸载后均需重启生效。
升级前已禁用模块的用户,在安装 v0.1.3 后确认模块已启用。
droidspaces_ns-6.12.69-canoe.ko:修正后的 PID / IPC / user namespace 合并载荷。droidspaces_devtmpfs-6.12.69-plz110.ko:与 v0.1.1 相同的 devtmpfs 载荷。Droidspaces-LKM-KernelSU-v0.1.3-PLZ110.zip:上述载荷、真实功能检查器与开机脚本。SHA256SUMS:发布文件校验值。
简介只有在 PID / IPC 接口、devtmpfs 状态及 Sandboxing 身份映射和权限检查均通过时
才显示 [已加载],否则显示具体失败或部分加载原因。状态反映检查时的结果,不是
持续监控;日志位于模块目录的 load.log。Droidspaces 容器需开启 --allow-sandboxing,
安装包不会修改现有容器配置。
独立 namespace .ko 的参数仍为 activate=1 userns_device_test=1;推荐使用完整 ZIP。
本版本仍为指定设备预发布版。未声称完整 Linux USER_NS 等价性,沙箱新建 FUSE、
idmapped mount、其他内联权限路径、长期高负载及所有 Android SELinux 域未完整支持或验证。
完整 Docker / Podman / Flatpak / 浏览器应用不在已验证范围内。
Droidspaces LKM v0.2.0
为六组 Android GKI 提供独立 PID / IPC namespace 模块,KernelSU 安装包按当前内核 KMI 自动选择载荷。设备运行时不需要内核源码。作者:Shikochin。
下载
推荐安装 Droidspaces-LKM-KernelSU-v0.2.0.zip。包内包含全部六个模块、ABI 检查器和验证记录,安装时无需手动选内核版本。
| KMI | 独立模块 |
|---|---|
| android17-6.18 | droidspaces_ns-android17-6.18-gki.ko |
| android16-6.12 | droidspaces_ns-android16-6.12-gki.ko |
| android15-6.6 | droidspaces_ns-android15-6.6-gki.ko |
| android14-6.1 | droidspaces_ns-android14-6.1-gki.ko |
| android13-5.15 | droidspaces_ns-android13-5.15-gki.ko |
| android12-5.10 | droidspaces_ns-android12-5.10-gki.ko |
KMI 取自 uname -r,与手机当前 Android 系统版本可能不同。仅支持 ARM64、4 KiB 页面。SHA256SUMS 包含 ZIP 与六个独立模块的校验值。
本版变化
- 为 6.18、6.1、5.15、5.10 移植独立实现,并纳入已有的 6.12、6.6 构建。
- 6.1 沿用原生 IPC namespace / POSIX mqueue,补入 SysV IPC,保留加载前已存在的对象。
- 5.15 / 5.10 适配 classic CFI、BTI、SCS 和旧版回调生命周期;6.18 适配新 namespace 元数据、namespace tree 与 pidfd 接口。
- 开机加载前校验载荷、内部结构布局和函数原型。缺少 BTF 时仅接受完全匹配的已验证内核构建指纹。
- KernelSU 简介显示所选 KMI 和加载状态,失败时保存原因至模块目录
load.log。
验证范围
六份最终模块均在各自固定 GKI Image 上通过 QEMU 回归:三轮加载/卸载自测、激活、PID/IPC 隔离及生命周期测试、引用回收、激活后拒绝热卸载。PID、IPC 与任务侧表计数全部归零。6.18 额外验证 namespace ID 和原生 pidfd ioctl 的保留行为。
基线支持时测试 BPF iterator、memfd namespace 策略和 pidfd namespace ioctl。5.10 基线未编入 BTF,BPF iterator 用户态测试不适用;其 perf、cgroup、FUSE 和 IPC 测试实际运行。详细基线和差异见仓库的 GKI 构建与验证。
实际发布 ZIP 已通过六 KMI 选包、文件校验、ARM64 ABI 检查器和状态显示的集成测试;该测试模拟 ksud 和内核身份,不向宿主内核加载模块。ZIP 内附 validation.json 与六份 QEMU 日志。
使用与限制
在支持 ksud insmod 的 KernelSU 管理器安装 ZIP 后重启,确认简介显示 [已加载],再执行 droidspaces check。激活后不能热卸载,禁用、卸载或更新后均需重启。
这是实验性预发布。GKI 回归通过不代表所有相同 KMI 的厂商内核均可使用,也不代表本版已通过真机或 Android 开机流程验证。 ABI 不匹配时停止加载;原生已支持 PID namespace 的内核不属于适用范围。首次测试前请保存工作。
不支持 32 位 IPC 兼容调用,SHM_HUGETLB 返回 EOPNOTSUPP;完整容器启动与长期稳定性仍需设备验证。v0.1.0 的固定设备验证结果不替代本版测试。
Droidspaces LKM v0.1.1 — PLZ110 devtmpfs
Droidspaces LKM v0.1.1 — PLZ110
为 PLZ110 指定 6.12.69 内核增加可动态加载的 devtmpfs,并与已验证的
PID / IPC namespace 载荷一起提供 KernelSU 开机安装包。
适用范围
- PLZ110 /
qcom,canoe,ARM64,4 KiB 页面。 - 完整内核版本:
6.12.69-android16-6-g242e1a07f878-ab15865446-4k。 - 安装和开机加载前检查完整内核版本及 BTF SHA256,其他内核拒绝加载。
- 不适用于 PLC110 6.6;此前 v0.2.0 的六组 GKI 产物保留,本版为独立设备维护版本。
下载与安装
优先下载 Droidspaces-LKM-KernelSU-v0.1.1-PLZ110.zip,在 KernelSU
管理器安装后重启。作者为 Shikochin;模块 ID 与旧版相同,可替换原安装包。
versionCode=3 高于此前 v0.2.0 安装包的值,便于现有设备安装本次维护版本。
安装包先加载 PID / IPC,再加载 devtmpfs。简介只有在两者均通过检查时
显示“已加载”,否则显示失败或部分加载,日志位于模块目录 load.log。
这是开机时的状态快照,不是持续监控。
独立文件供已核验目标的手动测试:
droidspaces_ns-6.12.69-canoe.ko:沿用 v0.1.0 真机验证载荷。droidspaces_devtmpfs-6.12.69-plz110.ko:新增 devtmpfs 载荷。SHA256SUMS:两个.ko与 ZIP 的 SHA256 校验值。
独立加载顺序如下;已加载相同模块时不要重复执行:
/data/adb/ksud insmod ./droidspaces_ns-6.12.69-canoe.ko activate=1
/data/adb/ksud insmod ./droidspaces_devtmpfs-6.12.69-plz110.ko验证
devtmpfs 经固定 GKI 和 PLZ110 原始内核的 QEMU 回归,并在 PLZ110 真机
保持 SELinux Enforcing 的现有 KernelSU 环境中通过测试:已有节点、
共享挂载、设备读写、8 轮热插拔、节点权限、删除及保留 FD 行为正常,
ready=Y、errors=0。Droidspaces 检查确认 PID、IPC 和 devtmpfs 可用。
模块保留已授权加载进程的凭据执行设备节点操作,不修改 SELinux 策略。
完整容器启动、长期压力及所有驱动路径尚未覆盖;激活后的模块固定到本次启动,
替换或移除必须重启。本版继续作为实验性预发布提供。
后续
本版不包含 Sandboxing(user namespace);Droidspaces 的该检查仍会显示
不可用。该项留待 v0.1.2,在现有内核、纯 LKM 的限制下继续适配。
Droidspaces LKM v0.1.0
Droidspaces LKM v0.1.0 为指定 Android 内核提供动态 PID / IPC namespace 支持,包含可手动加载的 .ko 和 KernelSU 自动加载模块。
支持范围
- PLZ110 /
qcom,canoe,Android 17,ARM64 / 4 KiB。 - 完整内核版本:
6.12.69-android16-6-g242e1a07f878-ab15865446-4k。 - 需要支持
ksud insmod的 KernelSU;已验证版本为3.3.0-69-gdf03912f。
其他设备或内核构建不受支持,安装器和启动脚本会拒绝不匹配的目标。
下载与使用
Droidspaces-LKM-KernelSU-v0.1.0.zip:在 KernelSU 管理器安装并重启。模块作者为 Shikochin;在 service 阶段加载,并在简介显示待加载、加载中、已加载、加载失败或不支持状态。droidspaces_ns-6.12.69-canoe.ko:独立内核模块,通过ksud insmod <文件路径> activate=1手动加载。SHA256SUMS:上述资产的 SHA-256 校验文件。
加载成功需同时满足 activate=Y 和 PID / IPC namespace 接口存在,不能只依据 insmod 的退出码。日志位于 /data/adb/modules/droidspaces_lkm/load.log。
激活后内核模块不能热卸载。禁用、卸载或更新 KernelSU 安装包后,必须重启才能移除或替换已加载的 .ko。模块不修改系统文件或 SELinux 策略。
验证与限制
.ko 已在目标手机的 SELinux Enforcing 环境通过 PID、SysV IPC、POSIX mqueue、memfd 和相关生命周期测试,Droidspaces v6.6.0 的全部必需项检查通过。KernelSU 加载脚本的 10 项隔离测试和 ZIP 载荷一致性检查通过;本次发布未安装 ZIP 或重启手机验证完整开机流程。
本版本为实验性预发布。完整 Droidspaces rootfs / systemd 启动和长期稳定性尚未验证;不包含 user namespace、devtmpfs 或额外 cgroup 控制器。