1. 极空间不只是存储柜它天生就是折腾游戏机的料子我用极空间已经两年多了说实话最初也就是拿它当个家庭影音中心和数据仓库。直到有一次出差住酒店半夜想玩几局童年时代的《超级马力欧》手机模拟器装了删、删了装存档还老是丢才突然意识到我家里那台吃灰的极空间其实比手机更适合干这件事。NAS 当游戏机听起来像伪需求但真琢磨起来逻辑完全通。第一存储空间天生够大一个街机 ROM 才几十 KB 到几 MB一台主机游戏镜像算上冗余也不过几百 MB塞几百款经典游戏进去连零头都占不满第二极空间自带虚拟机套件和 Docker 环境模拟器跑起来不吃力第三也是最重要的一点——极空间的客户端覆盖了手机、平板、电脑和电视而且它的外网访问能力比多数传统 NAS 要顺手得多。这意味着游戏不用装在本地设备上统一放在 NAS 里走到哪儿玩到哪儿存档跟着账号走。不过这里有一个绕不开的问题极空间自带的远程访问虽然方便但对游戏场景来说有两个硬伤。一是速度不够稳玩一些实时性要求稍高的动作游戏会有可感知的延迟二是有些第三方模拟器或者自定义服务要暴露到公网自带的穿透通道并不直接支持任意端口。所以我开头标题里提到的 cpolar就是专门来补这块短板的。这篇东西不是标准的教程文档更像是把我从零折腾到稳定运行的全过程记录。我会把折腾的动机、方案取舍、每一步具体操作和后来踩到的坑都摊开讲目标就一个让手里有极空间、又想在手机上随时掏出来玩一把童年游戏的朋友少走我走过的弯路。2. 把极空间当游戏舱之前先把这几个需求想清楚2.1 我到底需要什么样的随时随地随时随地这四个字拆开之后其实包含两个完全不同的场景必须分开考虑。第一个场景是在家里。客厅沙发上、卧室床上、书房电脑前设备都在同一个局域网里只要极空间和客户端设备在同一网段访问就是纯粹的局域网速度延迟低到几乎无感。这个场景下其实不太需要 cpolar极空间自己的内网访问能力就够用了。第二个场景才是真正麻烦的在公司午休、在高铁上、在酒店里、在咖啡馆。设备在公网环境要穿过 NAT 访问家里的 NAS这时候就需要内网穿透。而且要注意游戏场景和看视频不一样——看视频可以接受缓冲游戏不行操作之后画面反馈超过 200 毫秒就会觉得飘超过 500 毫秒基本没法玩。所以我给自己定的标准很明确*策略类、回合制、解谜类游戏延迟在 1 秒内都能忍受动作类、格斗类、飞行射击类游戏延迟必须控制在 300 毫秒以内。*这两个标准直接影响了后面选穿透方案和模拟器方案时的取舍。2.2 模拟器选型极空间上最适合跑什么极空间设备用的 CPU 一般是 x86 架构这意味着兼容性比 ARM 架构的群晖入门机型要强不少。回顾我用过的几套方案按体验排序大概是这样的RetroArch全能型选手几乎所有经典主机的核心都支持但配置过程对小白不太友好而且它的中文界面和 ROM 扫描机制在 NAS 这种非典型游戏设备上需要花不少时间调。优点是核心统一、存档管理规范。Docker 版 EmulatorJS这个方案我在极空间上实测跑通了体验超出预期。EmulatorJS 是一个网页版模拟器项目跑在 NAS 的 Docker 容器里客户端不需要装任何 App只要浏览器打开一个网页就能玩。这对随时随地来说是巨大的优势——在别人的电脑上、在公司电脑上、在酒店房间的智能电视浏览器里只要能上网就能玩不用装软件不用带 U 盘。极空间自带的虚拟机装 RetroPie方案可行但资源开销大而且虚拟机启动要时间不符合掏出来就玩的直觉体验。更关键的是虚拟机里的游戏画面要通过 VNC 或者串流传到客户端延迟天然偏高。综合来看我最后定的是Docker 部署 EmulatorJS 作为游戏前端ROM 统一放在极空间存储里再用 cpolar 把 EmulatorJS 的 Web 服务穿透出去。这套组合的好处是客户端零安装、跨平台通吃、延迟相对可控、存档存在 NAS 上不丢失。2.3 游戏资源从哪来、怎么管这个话题我必须先说一句请只使用你自己拥有合法权益的游戏 ROM。很多经典老游戏的版权方后来陆续推出过合辑、重制版、复刻版支持正版的途径比十年前多得多能买到的就尽量买。我自己日常玩的大部分是已进入公共领域、或同人社区明确授权免费分发的作品还有一些是早年购买的正版光盘自己做的备份镜像。从实际管理角度我强烈建议在极空间的文件管理器里单独建一个games共享文件夹下面按机种分子目录nes、snes、gba、md世嘉 MD、arcade街机、ps1。这样做的好处是后面配置 EmulatorJS 的 ROM 目录时可以一次性映射不用每个机种单独改路径。另外建议给每个子目录放一个cover文件夹存游戏封面图EmulatorJS 的界面会自动加载浏览体验会好很多。3. 一步一步把 EmulatorJS 跑在极空间上3.1 镜像选择与安装环节的若干细节极空间的 Docker 功能在系统设置里的Docker应用里实际上它封装了标准的 Docker 管理界面可以直接搜索镜像、创建容器、管理日志。不过要注意的是极空间应用商店里的 Docker 版本界面和标准 Portainer 不完全一样有些字段名对不齐第一次用容易懵。我选的镜像是linuxserver/emulatorjs因为这个镜像维护很勤而且和极空间的目录结构配合最顺。也有别的镜像比如codewithweeb/emulatorjs但实测下来 linuxserver 版本的默认配置文件和目录划分更清晰。创建容器时有四个关键配置点端口映射容器内部默认跑在 3000 端口我映射到极空间的 3000 或者其他空闲端口比如 8432。记住这个外部端口后面 cpolar 配置要对着它来。存储映射把 NAS 里的games目录挂载到容器的/data目录。这一步是核心所有 ROM 和存档都走这个映射关系。环境变量不需要额外设置太多默认值就能跑起来。重启策略选总是重启这样即使极空间重启游戏服务也会自动跟着起来不用每次手动进 Docker 界面启动容器。配置完点创建等镜像拉取完成、容器状态变成运行中就可以用浏览器访问极空间IP:8432验证一下。第一次打开会看到 EmulatorJS 的初始化界面因为此时还没有配置游戏库是空的这是正常的。3.2 上传 ROM 并触发自动扫描很多人在这一步会卡住因为 EmulatorJS 不会自动扫描你已经塞进目录的 ROM需要通过它的管理后台执行一次扫描操作。在浏览器里打开 EmulatorJS 的管理页面通常是访问/admin路径或者在主页面右上角找设置的入口。进入后台之后找到文件扫描 / File Scan相关的按钮触发一次全量扫描。EmulatorJS 会根据文件格式自动识别机种比如.nes结尾的文件归入 NES 分类.smc或.sfc归入 SNES.gba归入 Game Boy Advance.zip结尾的街机文件归入 Arcade 分类。这里有一个经验教训街机 ROM 不要只放 ZIP 包最好连模拟核心对应的 BIOS 文件也一起放进去。我一开始没有放 BIOS结果街机分类里不少游戏能显示封面但点进去黑屏退出后来查日志发现是缺neogeo.zipBIOS。把 BIOS 文件放到 ROM 目录后重新扫描问题就解决了。扫描完成后回到主页游戏封面墙就会出现。如果某个游戏没有封面图可以在管理后台手动关联图片也可以在cover目录里丢一张同名图片文件EmulatorJS 加载封面的优先级是目录内同名图片高于自动抓取。3.3 实测本地玩一把确认基线体验在接 cpolar 穿透之前一定要先在局域网里把游戏跑通。这一步花不了几分钟但能帮你在后续排障时区分是模拟器的问题还是是穿透的问题。我用手机开热点测试排除局域网因素干扰然后用手机浏览器访问极空间IP:8432。实测结果NES 游戏从点击封面到进入游戏大约 2 秒加载 ROM 的速度取决于文件大小基本上几百 KB 的 ROM 都是瞬开。GBA 游戏因为要加载 BIOS 和更大容量的 ROM会慢个半秒左右也算正常。按键手感方面EmulatorJS 在触屏设备上会自动显示虚拟按键这套虚拟按键的布局可以自定义强烈建议进设置里把按键调大一点、透明度调到半透明不然会挡住游戏画面下半部分。如果是接手柄玩在电脑浏览器上插上 USB 手柄浏览器会识别为 Gamepad配置一次按键映射后体验会接近实机。本地测试没问题之后接下来才是真正的重头戏——把这条游戏通道从家里的局域网延伸到任何有网的地方。4. cpolar 穿透把游戏舱从客厅搬到全世界4.1 为什么要选 cpolar而不是自带远程访问或 frp说句公道话极空间自带的远程访问功能日常用起来很顺手看照片、备份、访问文件都够用。但放在游戏场景里它有几个先天限制不支持自定义域名绑定第三方服务时的某些配置方式、端口暴露策略偏向内部应用、对 WebSocket 长连接的支持不透明。EmulatorJS 这种实时交互型 Web 应用恰恰对 WebSocket 依赖很重所以用自带通道可能出现页面开了、手柄连了、ROM 加载了、游戏画面却一直转圈的情况。frp 当然也是一个选择我自己早期就搭过 frp 服务端但说实话自己搭 frp 的前提是你得有一台有公网 IP 的云服务器还得维护服务端和客户端两端的配置、处理域名解析和 HTTPS 证书这套活儿对只想好好玩游戏的人来说太重了。cpolar 在这个场景里的价值是不用买服务器、不用解析域名、一条命令或者一次配置就把内网服务暴露出去而且自带访问控制和流量统计免费额度对轻度游戏玩家来说够用。更重要的是cpolar 的隧道配置对 WebSocket 的支持很完整实测 EmulatorJS 跑在 cpolar 隧道上的连接稳定性比我预期要好。4.2 极空间上安装 cpolar 的完整过程cpolar 在极空间上的安装方式主要有两种直接通过 Docker 跑官方镜像或者在极空间的容器里跑。我采用的是 Docker 方式因为这样和极空间的整合最干净卸载也方便。大致流程是这样的在极空间的 Docker 界面搜索cpolar/cpolar镜像拉取最新版。创建容器关键配置如下网络模式选桥接让容器可以访问宿主机的任意端口。环境变量里设置认证 tokenCPOLAR_AUTH_TOKEN你的token。这个 token 在 cpolar 官网注册后能在后台看到。端口映射不需要额外设置因为 cpolar 是主动外向连接不依赖入站端口映射。容器启动后进入日志页面会看到 cpolar 自动创建了一条默认隧道日志里会输出一条公网访问地址类似https://xxxx.cpolar.top。这里要强调一个细节默认隧道映射的是容器的 80 端口但 EmulatorJS 跑在宿主机极空间的 8432 端口。所以默认隧道不能用需要手动配置一条映射到宿主机 8432 端口的隧道。cpolar 的配置文件在容器内的/usr/local/etc/cpolar/cpolar.yml。你可以直接修改这个文件也可以在 cpolar 后台创建隧道后重启容器让它自动拉取配置。我个人推荐在后台创建因为可视化界面更直观而且能直接在后台看到连接状态和流量数据。4.3 隧道配置的几个关键参数与避坑点在 cpolar 后台创建隧道时有几个参数决定了游戏体验的上限参数推荐配置原因协议类型HTTPEmulatorJS 是网页应用不合适用 TCP 隧道裸连本地地址127.0.0.1:8432指向极空间上 EmulatorJS 的监听端口域名类型随机域名免费套餐够用想要固定域名可以绑定但要用实名认证流量限制按套餐来游戏 ROM 加载会消耗流量但单次会话量不大免费额度够日常玩创建完隧道后cpolar 容器需要重启一次来加载新配置。重启完成去日志里看公网地址如果状态显示online就是成功了。避坑点有两个。第一个是HTTPS 证书的问题。cpolar 的免费隧道自带 HTTPS 证书但如果你用浏览器访问时提示不安全先别慌检查一下是不是用 http 访问了强制 https 的隧道。在地址栏手动输入https://前缀或者直接使用 cpolar 日志里给出的完整 https 地址即可。第二个是本地地址绑定。cpolar 容器的本地地址要写宿主机 IP 或127.0.0.1。写宿主机 IP 更保险因为127.0.0.1在某些桥接网络模式下可能指向容器自身而不是宿主机。我实际踩过这个坑写127.0.0.1后隧道状态显示 online但浏览器访问一直 502改成宿主机 IP 后瞬间正常。4.4 从公网实测延迟哪个游戏能玩、哪个勉强配置完隧道我用手机切成 4G 网络完全不走 Wi-Fi排除局域网干扰访问 cpolar 给的公网地址对几类游戏做了延迟实测。NES《坦克大战》点击进入游戏约 3 秒游戏过程中方向键响应基本跟手体感延迟在 200 到 300 毫秒之间可以接受。这种节奏较慢的射击游戏玩起来问题不大。SNES《超级马力欧世界》跳跃手感能感觉到一点滞后就是按键按下去之后角色不是瞬发起跳有轻微的延迟感。玩普通关卡没问题但挑战极限操作的时间赛段会明显难受。GBA《逆转裁判》这是文字推理游戏对实时性几乎零要求体验和本地运行没有区别。这类游戏是最适合穿透远程玩的。街机《拳皇97》延迟在 400 毫秒左右波动连招基本搓不出来格斗游戏重度玩家可以放弃这个场景。不过用模拟器的减速设置稍微补偿一下单机打电脑还能凑合。结论很直接文字类、回合制、慢节奏动作游戏通过 cpolar 公网畅玩无压力快节奏格斗和弹幕类游戏只能作为应急解馋方案不适合竞技向玩法。这算是对随时随地畅玩的一个理性注解。5. 存档同步、多人同玩和远程访问的安全问题5.1 存档机制为什么放 NAS 上反而比本地更稳EmulatorJS 的存档机制有个很好的特性模拟器的即时存档和游戏内存档默认保存在 ROM 同目录下也就是放在极空间的games对应子目录中。这意味着只要模拟器容器不删除存档理论上是跟随 NAS 的不管你在公司玩了一半还是在家玩到一半下次通过哪个入口访问进度都是同一个。不过这里面有个小坑EmulatorJS 的自动存档写入时机不好判断有些核心是定时写有些是退出时写。如果你在公网玩着玩着突然锁屏再回来发现进度回退了十几分钟就是自动存档没来得及写入。我的做法是养成手动存档的习惯。在 EmulatorJS 的游戏菜单里组合键呼出快捷菜单点保存状态。手动存档会立刻写入 NAS 磁盘稳得很。另外极空间自身的文件快照功能可以给games目录开一个定期快照策略哪怕闹出手滑覆盖了存档这种事也能从快照里捞回来。5.2 多人同玩把网页链接发给朋友而不是把 NAS 账号交出去EmulatorJS 其实还带一个联机观战/协作模式但这个功能在 NAS 部署场景下用得不多。我更想强调的是另一种同玩你把 cpolar 生成的公网链接直接发给朋友他在浏览器里打开就能进到你的游戏库选游戏直接玩。这个分享方式的关键点在于对方完全不需要接触你的 NAS 账号体系也看不到你的极空间文件系统他看到的只是一个游戏网页。因为 EmulatorJS 本身就是一个独立 Web 应用cpolar 隧道暴露的只是 8432 端口的网页服务并没有把极空间的存储接口、系统后台暴露出去。这样既实现了把游戏舱分享给朋友又把安全边界控制在了单应用维度。当然cpolar 本身也提供简单的访问认证可以在隧道设置里开启基本认证给隧道加一个用户名密码。这样陌生人即使扫到链接也进不来。我强烈建议开启这个功能。毕竟把你的游戏舱完全暴露在公网除了安全风险还会被无聊的人塞垃圾 ROM 进来污染你的游戏库。5.3 安全排查公开一个端口至少要确认这几件事把内网服务穿透到公网本质上是给家里开了一扇门。开门可以但得确认门的结构牢靠。我做的安全确认清单大致是这样的确认 8432 端口没有越权暴露到局域网外部设备。EmulatorJS 本身没有账号体系所以任何知道地址的人都能访问这意味着隧道认证是最后一道防线必须开。确认 cpolar 容器和 EmulatorJS 容器的文件映射只限于games目录不要让 EmulatorJS 容器挂载极空间的根目录或其他敏感数据目录。容器里被攻破攻击者能看到的所有文件也仅限于 games 目录影响可控。定期检查极空间的系统日志看看有没有可疑的外部 IP 扫描或连续访问记录。cpolar 后台也有访问日志偶尔翻一下心里有数。公网链接不要到处贴。发给朋友用私聊别贴到公开群或论坛。实在要公开分享就必须开密码认证且密码要跟 NAS 登录密码不同。这套清单做完游戏的公网访问才算是一个用过脑子的决定而不是裸奔行为。6. 折腾完之后的日常维护与体验优化思路6.1 容器重启与极空间系统升级对游戏服务的影响极空间系统每隔一段时间会推送系统升级升级过程会重启服务。因为 EmulatorJS 容器设置了总是重启容器本身会自动拉起来。但 cpolar 容器我建议也设置相同策略否则系统重启后穿透通道不会自动恢复你就得手动进 Docker 界面点启动出门在外才发现连不上就晚了。另外有一个和端口相关的细节极空间系统升级后宿主机端口占用情况可能变化。如果 Docker 端口映射写的是自动而不是指定固定端口升级后外部端口号可能会变cpolar 隧道映射的还是老端口那隧道状态虽然 online实际流量也到不了 EmulatorJS。排查思路就是先本地访问确认游戏正常再查 cpolar 日志确认连接状态最后从公网访问一次三步定位问题出在哪一层。6.2 两类设备的真机体验报告这段时间我实际用过的访问设备类型不算很多但足够说明问题。iPhone Safari体验是最好的。浏览器直接打开网址就能玩手势操作偶尔和虚拟按键冲突比如从屏幕边缘滑动触发 iOS 的返回手势会误触游戏按键解决办法是在 iOS 浏览器里把从边缘滑动关掉或者用添加到主屏幕的方式打开全屏沉浸感更强。安卓 Chrome也流畅虚拟按键位置可以自定义配合大屏手机手感尚可。Windows 电脑接手柄是终极形态。浏览器识别手柄后映射按键一次之后任何游戏都是这套映射玩街机和 MD 游戏几乎有实机手感。电视端的浏览器极空间自带 TV 客户端的浏览器内核比较旧打开 EmulatorJS 有时会白屏需要强制刷新。电视加无线手柄是客厅最爽的组合但兼容性需要一点耐心。6.3 后记这套玩法还能扩展成什么把这个游戏舱跑通之后我发现 cpolar 隧道其实是一套通用能力不只是为了游戏。同样的思路可以复制到其他场景比如把极空间上的阅读器 Web 应用穿透出去就是一个随身书库把 RSS 阅读服务穿出去就是一个独立的信息中枢甚至把家庭相册的 Web 界面穿出去也能实现全平台免客户端看照片。但这条折腾之路给我最大的收获其实是重新理解了 NAS 的定位。极空间这类产品出厂定位是存储和管理数据但它的 Docker 能力和应用生态决定了上限远不止于此。只要愿意折腾一台 NAS 可以根据你的生活方式变成任何东西——游戏舱只是其中一个形态。如果你照着这个流程搭起来遇到 EmulatorJS 有游戏打不开先检查 ROM 格式和 BIOS不要急着怀疑穿透问题遇到公网访问速度特别慢先分清是隧道带宽瓶颈还是模拟器渲染瓶颈办法是在同一网络里用电脑访问本地端口对比着看。折腾本身就是这些设备最大的乐趣所在。