📌 环境准备
在 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 是刚需。
🧪 测试过程与问题排查
- 自制 Magisk 镜像:点击 Magisk 应用后崩溃自动卸载(redroid-script回滚git checkout 881f7f00d6a86af4f8e4947af5d587a144a1806c 可解决)
- 官方原版镜像:能够正常启动 ✅
💡 解决方案
AI 说 Btrfs 存储驱动与 Redroid 镜像层的兼容性问题。将 Docker 存储驱动修改为 overlay2 后,能纠结奇奇怪怪的问题,那就先听他狡辩改成这个先
- 所有镜像正常启动
- 预制 Magisk 镜像正常启动
- Root 权限正常工作
🐳 镜像选择推荐
测试了大部分Android 11-13的镜像,个人感觉erstt/redroid系列镜像表现最优:
自用Android 11新版本转译层镜像,稳定性不保证s1oz/redroid
ARM 兼容层 (Houdini): 内置 Houdini version 14.0.0_z.GoogleGame_com1.2。
ARM 兼容层 (NDK): 内置 NDK Translation Version 0.2.3。
版本选择建议
| 版本 | 兼容性 | 资源占用 | 推荐场景 |
|---|---|---|---|
| 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)
⚠️ 隐私与封号警告: 启动参数中的设备 IMEI (
ro.ril.oem.imei) 和序列号 (ro.serialno) 已被我替换为安全占位符(如<YOUR_IMEI>)。为了防止设备被应用封禁或出现 Google Play 未认证错误,请务必在运行前将其修改为您自己生成的随机数字或真实值。
⚠️ 转译层 (
ro.dalvik.vm.native.bridge) 已被我替换为安全占位符(如<houdini or ndk>)根据下载镜像选择填写libndk_translation.so或libhoudini.so
androidboot.use_memfd=1 androidboot.redroid_net_ndns=2 androidboot.redroid_net_dns1=223.5.5.5 androidboot.redroid_net_dns2=119.29.29.29 androidboot.redroid_width=720 androidboot.redroid_height=1280 androidboot.redroid_dpi=180 androidboot.redroid_fps=30 androidboot.redroid_gpu_mode=host androidboot.selinux=permissive ro.board.platform=msm8150 ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi ro.product.cpu.abilist64=x86_64,arm64-v8a ro.dalvik.vm.isa.arm64=x86_64 ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi ro.enable.native.bridge.exec=1 ro.enable.native.bridge.exec64=1 ro.dalvik.vm.native.bridge=<houdini or ndk> ro.product.model="Pixel 4" ro.product.brand="google" ro.product.name="flame" ro.product.device="flame" ro.product.manufacturer="Google" ro.build.type=user ro.build.flavor="flame-user" ro.build.tags=release-keys ro.build.fingerprint="google/flame/flame:11/RQ3A.210805.001.A1/7481738:user/release-keys" ro.boot.flash.locked=1 ro.ril.oem.imei=<YOUR_IMEI> ro.ril.oem.imei1=<YOUR_IMEI> ro.ril.oem.imei2=<YOUR_IMEI> ro.ril.oem.sno=<YOUR_SERIAL> ro.serialno=<YOUR_SERIAL> gsm.sim.operator.alpha="CMCC" gsm.sim.operator.numeric="46000" gsm.operator.alpha="CMCC" gsm.operator.numeric="46000"
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 |
硬件加速 | 需要设备映射 |
添加UHID支持
Unraid 实现开机自动加载
nano /boot/config/go
添加
modprobe uhid
Redroid 添加参数
--device=/dev/uhid:把宿主的 /dev/uhid 映射进容器
androidboot.redroid_enable_input_subsys=1:启用 redroid 的输入子系统
Magisk 模块添加脚本
adb shell
su
mkdir -p /data/adb/modules/uhidfix
cd /data/adb/modules/uhidfix
cat > module.prop << 'EOF'
id=uhidfix
name=UHID Permission Fix
version=1.0
versionCode=1
author=you
description=Auto chmod 666 /dev/uhid for scrcpy HID
EOF
cat > service.sh << 'EOF'
#!/system/bin/sh
for i in $(seq 1 30); do
if [ -e /dev/uhid ]; then
chmod 666 /dev/uhid
chmod 666 /dev/uinput
exit 0
fi
sleep 1
done
EOF
chmod 755 service.sh
🖥️ 客户端连接工具
安卓端
迭代了好几个版本,现在体验完胜其他方案。
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。