Unraid 7.3.1 上 Redroid 容器部署完整指南
📌 环境准备
在 Unraid 7.3.1 版本上实践,无需任何额外修改和安装插件,默认内核已集成相关依赖。
只需要在 Boot Parameters → Custom Parameters 的 Add Custom Parameter 添加 psi=1,然后保存重启即可激活所有环境。
root@Tower:~# cat /proc/pressure/*
some avg10=1.65 avg60=1.82 avg300=1.20 total=355489358
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
some avg10=0.20 avg60=0.25 avg300=0.59 total=347818195
full avg10=0.18 avg60=0.19 avg300=0.50 total=328382926
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
⚠️ 重要注意事项
Root 权限需求判断
根据你是否需要 Root 权限,选择不同的 Docker 存储驱动:
| 场景 | Docker 存储驱动 | 说明 |
|---|---|---|
| 不需要 Root | Btrfs(默认) |
可直接运行官方原版镜像 |
| 需要 Root(游戏辅助/修改器) | overlay2 |
必须修改,否则镜像无法正常工作 |
我玩的游戏大航海时代:传说需要使用辅助工具,所以 Root 是刚需。
🧪 测试过程与问题排查
默认 Btrfs 存储驱动下遇到的问题
在使用默认 Btrfs 存储驱动时,遇到以下问题:
- 预制 Magisk 镜像:点击 Magisk 应用后自动卸载,无法正常获取 Root 权限
- 修改版镜像:无法正常启动
- redroid-script 自定义构建:基于官方镜像使用ayasa520/redroid-script添加 NDK + Magisk 后也无法启动
- 官方原版镜像:能够正常启动 ✅
💡 解决方案
AI 分析后指出,这些问题大概率是 Btrfs 存储驱动与 Redroid 镜像层的兼容性问题。将 Docker 存储驱动修改为 overlay2 后,以上所有问题全部解决:
- 所有镜像正常启动
- 预制 Magisk 镜像正常启动
- Root 权限正常工作
🐳 镜像选择推荐
测试了大部分Android 11-13的镜像,个人感觉erstt/redroid系列镜像表现最优:
版本选择建议
| 版本 | 兼容性 | 资源占用 | 推荐场景 |
|---|---|---|---|
| Android 11 | ✅ 更好 | ⬇️ 更低 | 挂机优选,scrcpy 兼容性更好 |
| Android 13 | ⚠️ 略差 | ⬆️ 略高 | 部分新游戏可能需要 |
转译层选择
| 镜像 | 转译层 | 适用平台 | 说明 |
|---|---|---|---|
erstt/redroid:11.0.0_houdini_magisk_ChromeOS |
Houdini | Intel 优选 | Intel CPU 优化,兼容性更广 |
erstt/redroid:11.0.0_ndk_magisk_ChromeOS |
NDK Translation | AMD 优选 | 兼容性好,部分场景下性能更优 |
个人推荐:intel处理器优先使用
houdini版本,如遇到游戏兼容性问题再切换至ndk版本。
📦 Unraid容器创建步骤
1. 基本配置
| 配置项 | 值 |
|---|---|
| 存储库 | erstt/redroid:11.0.0_houdini_magisk_ChromeOS |
| 额外参数 | -itd -m 16G --memory-swappiness=0 |
| 网络类型 | Bridge |
| 特权 | 开启 |
| 映射端口 | 5555:5555 |
| 持久化目录 | /mnt/system/appdata/redroid:/data |
| 设备 | /dev/dri |
2. 发布参数(Extra Parameters)
Houdini 版本
androidboot.use_memfd=1 androidboot.redroid_net_ndns=1 androidboot.redroid_net_dns1=223.5.5.5 androidboot.redroid_width=720 androidboot.redroid_height=1280 androidboot.redroid_dpi=180 androidboot.redroid_fps=60 androidboot.redroid_gpu_mode=host androidboot.selinux=permissive androidboot.redroid_gpu_backend=mesa ro.product.cpu.abilist=x86_64,arm64-v8a ro.product.cpu.abilist64=x86_64,arm64-v8a ro.dalvik.vm.isa.arm64=x86_64 ro.enable.native.bridge.exec=1 ro.enable.native.bridge.exec64=1 ro.dalvik.vm.native.bridge=libhoudini.so
NDK 版本
androidboot.use_memfd=1 androidboot.redroid_net_ndns=1 androidboot.redroid_net_dns1=223.5.5.5 androidboot.redroid_width=720 androidboot.redroid_height=1280 androidboot.redroid_dpi=180 androidboot.redroid_fps=60 androidboot.redroid_gpu_mode=host androidboot.selinux=permissive androidboot.redroid_gpu_backend=mesa ro.product.cpu.abilist=x86_64,arm64-v8a ro.product.cpu.abilist64=x86_64,arm64-v8a ro.dalvik.vm.isa.arm64=x86_64 ro.enable.native.bridge.exec=1 ro.enable.native.bridge.exec64=1 ro.dalvik.vm.native.bridge=libndk_translation.so ro.ndk_translation.version=0.2.3
3. 配置说明
| 参数 | 作用 | 备注 |
|---|---|---|
androidboot.use_memfd=1 |
使用 memfd 替代 ashmem | 高版本内核必需 |
androidboot.redroid_net_dns1=223.5.5.5 |
DNS 解析(阿里 DNS) | 可按需修改 |
androidboot.redroid_width/height/dpi |
分辨率 & DPI | 可按需调整 |
androidboot.redroid_fps=60 |
系统帧率上限 | 游戏内可另设 |
androidboot.redroid_gpu_mode=host |
硬件加速 | 需要设备映射 |
androidboot.selinux=permissive |
SELinux 宽容模式 | Magisk 需要 |
androidboot.redroid_gpu_backend=mesa |
Mesa 驱动 | UHD 630 适用 |
GPU 后端说明:我使用的是 UHD 630 核显。如果是 N 卡或 A 卡,
androidboot.redroid_gpu_backend=mesa这个参数删除即可。
转译层参数:根据镜像类型,在发布参数中添加对应的转译层参数(
libhoudini.so或libndk_translation.so)。
root@Tower:~# docker inspect redroid | grep -A 20 "Cmd"
"Cmd": [
"androidboot.use_memfd=1",
"androidboot.redroid_net_ndns=1",
"androidboot.redroid_net_dns1=223.5.5.5",
"androidboot.redroid_width=720",
"androidboot.redroid_height=1280",
"androidboot.redroid_dpi=180",
"androidboot.redroid_fps=60",
"androidboot.redroid_gpu_mode=host",
"androidboot.selinux=permissive",
"androidboot.redroid_gpu_backend=mesa",
"-",
"ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi",
"ro.product.cpu.abilist64=x86_64,arm64-v8a",
"ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi",
"ro.dalvik.vm.isa.arm=x86",
"ro.dalvik.vm.isa.arm64=x86_64",
"ro.enable.native.bridge.exec=1",
"ro.enable.native.bridge.exec64=1",
"ro.dalvik.vm.native.bridge=libhoudini.so"
],
🖥️ 客户端连接工具
安卓端
迭代了好几个版本,现在体验完胜其他方案。
Windows 端
| 工具 | 用途 | 链接 |
|---|---|---|
| scrcpy-gui | 连接及远程操作 | kil0bit-kb/scrcpy-gui |
| QtScrcpy | 可映射方向键,用键盘控制行走 | barry-ran/QtScrcpy |
输入法推荐
微信输入法 — 兼容性不错,在 Redroid 环境下表现稳定。
🎮 游戏按键映射示例
《大航海时代:传说》QtScrcpy 映射脚本
将以下内容另存为 JSON 文件,放入 QtScrcpy\keymap 目录,刷新脚本后点击应用即可。按 ~ 键(反引号)开启/关闭映射。
这样就能键盘控制角色移动了,上班摸鱼更方便了!
{
"switchKey": "Key_QuoteLeft",
"keyMapNodes": [
{
"comment": "虚拟摇杆 - WASD 控制移动",
"type": "KMT_STEER_WHEEL",
"centerPos": {
"x": 0.1498,
"y": 0.7489
},
"leftOffset": 0.11468,
"rightOffset": 0.11381,
"upOffset": 0.19237,
"downOffset": 0.20701,
"leftKey": "Key_A",
"rightKey": "Key_D",
"upKey": "Key_W",
"downKey": "Key_S",
"switchMap": false
},
{
"comment": "空格键 - 交互/确认",
"type": "KMT_CLICK",
"pos": {
"x": 0.9061,
"y": 0.8195
},
"key": "Key_Space",
"switchMap": false
}
],
"width": 1064.4285888671875,
"height": 622.857177734375
}
按键说明
| 按键 | 功能 |
|---|---|
W / A / S / D |
控制角色移动(虚拟摇杆) |
Space(空格) |
交互 / 确认点击 |
`(反引号) |
切换映射开关 |
📝 总结
- 环境准备:Unraid 7.3.1 默认内核已就绪,只需添加
psi=1重启 - 存储驱动:需要 Root → 使用
overlay2;不需要 Root →Btrfs即可 - 镜像选择:intel推荐
erstt/redroid:11.0.0_houdini_magisk_ChromeOS - 性能调优:根据硬件调整 CPU-GPU 参数,例如降低分辨率,降低刷新率等操作,intel核显用
mesa,独显删除该参数 - 客户端:安卓用 Screen-Remote,Windows 用 QtScrcpy/scrcpy-gui
📌 常见问题
Q:为什么必须用 overlay2?
A:Btrfs 与 Redroid 多层镜像文件存在兼容性问题,导致 Magisk 镜像无法正常启动。
Q:Android 11 和 13 怎么选?
A:挂机优选 Android 11,兼容性更好,资源占用更低。scrcpy 连接也更稳定。
Q:Houdini 和 NDK 怎么选?
A:Intel CPU 优先 Houdini,如遇游戏兼容性问题再切换 NDK。AMD CPU 优先 NDK。
