在 Windows 沙盒中运行 Minecraft 以供计算机使用代理
启动 Windows 沙盒,安装 Minecraft Java Edition,并通过在沙盒内部运行的 cua-driver MCP 服务器使用代理进行驱动。Minecraft 几乎行使了 Windows 沙盒能够做的所有事情:它需要互联网访问、Java 运行时、有效的 OpenGL,以及只能通过点击驱动的 GUI。此指南启动 Windows 沙盒,安装 Minecraft Java Edition,并将其交给一个代理,该代理与沙盒内的 cua-driver 的 MCP 服务器对话——在本地沙盒和 Fleet 之间的相同循环。在开始之前 # cua-sandbox 0.3.3 版本或更高版本。Fleet 上的 Windows 需要 0.3.0,局部 QEMU 运行时的 Image.expose() 在 0.3.1 中实现,该指南读取的 sb.exposed_ports 从 0.3.2 中新增,而 0.3.3 带来了 Image.from_registry(..., os_type=...) 和 pull-secret 修复,允许 Fleet 从其自己的白名单外部启动映像——这需要下面的 containerDisk 部分。需要硬件虚拟化的主机用于本地路径——一台装有 /dev/kvm 的 Linux x86_64 机器,或一台 Intel Mac。这份指南传递 -cpu host ,而 QEMU 仅在 KVM 或 HVF 情况下接受此参数。在 Apple Silicon 上的 x86_64 客户机在 TCG 模拟下运行,其中 -cpu host 被完全拒绝。Fleet 路径在此运行,包括游戏,以及下面的 Fleet 部分中描述的额外环境变量。一个拥有 Minecraft Java Edition 的微软账户。签到使用微软设备授权,因此在中间有一步是手动的:一个代码出现在沙盒内,您需要在自己的浏览器中批准。一个具有视觉能力的 LLM 端点用于代理循环。启动 Windows 沙盒 # Image.windows() 解析为一个固定的 Windows Server 2022 containerDisk。在默认设置上增加了三件事: .expose(3000) 发布了 cua-driver 的 MCP 服务器,该服务器已经在客户机内运行,因此代理可以访问它。第二个网络接口。裸金属运行时以 restrict=on 附加其 NIC,隔离了客户机。sb.shell.run() 仍然可以通过转发的端口工作,但 Windows 内部没有任何东西可以访问互联网——而 Minecraft 需要。 -cpu host 。默认的 qemu64 模型对软件 OpenGL 驱动程序来说过于薄弱:Minecraft 创建其窗口,然后在加载资源时崩溃,没有 Java 异常和崩溃日志。命令行上的最后一个 -cpu 获胜,因此追加它就足够了。导入 asyncio 从 cua 中导入 Image、QEMURuntime、Sandbox EXTRA_ARGS = [ # 一个第二个、不受限制的用户模式 NIC——默认的 NIC 是 restrict=on '-netdev' , 'user,id=net1,net=10.0.3.0/24,host=10.0.3.2,dns=10.0.3.3' , '-device' , 'virtio-net-pci,netdev=net1,mac=52:55:00:d1:55:02' , # 一个软件 OpenGL 驱动程序可以实际使用的 CPU '-cpu' , 'host' , ] async def main (): sb = await Sandbox.create( Image.windows().expose( 3000 ), name = 'mc-win' , local = True , runtime = QEMURuntime( mode = 'bare-metal' , cpu_count = 12 , memory_mb = 16384 , extra_args = EXTRA_ARGS , ), ) mcp_port = sb.exposed_ports[ 3000 ] print ( f 'cua-driver MCP 在 http://127.0.0.1: { mcp_port } /mcp' ) await sb.disconnect() # 沙盒保持运行 asyncio.run(main()) 热启动约需 30 秒。 exposed_ports 将每个暴露的客户机端口映射到其着陆的主机端口,并在该端口上 GET /healthz 在 cua-driver 启动后返回 ok。从 sb.exposed_ports 读取端口,而不是从隧道。 sb.tunnel.forward(3000)——获取转发端口的常用方法,且下面的 Fleet 部分使用此方法——抛出 NotImplementedError:HTTPTransport 不支持本地传输上的端口转发。exposed_ports 是本地等价物:运行时在启动时选择一个空闲主机端口,因此映射只能在运行时确定,并随沙盒状态保存,以便稍后 Sandbox.connect() 可以读取它。在 Fleet 上,此属性为空,因为 Fleet 取而代之地发布服务——在此使用 tunnel.forward()。给第二个 NIC 分配自己的子网。两个用户模式网络默认都为 10.0.2.0/24,并且都为客户机提供 10.0.2.15,因此 Windows 将一个接口降级为没有网关和无有效 DNS 的 169.254.x.x 链路本地地址。在安装任何内容之前,请确认客户机确实可以访问互联网。 async with Sandbox.connect( 'mc-win' , local = True ) as sb: check = await sb.shell.run( 'powershell -Command "(Invoke-WebRequest -UseBasicParsing ' 'https://piston-meta.mojang.com/mc/game/version_manifest.json).StatusCode"' ) print (check.stdout) # 200 安装启动程序和软件 OpenGL 驱动程序 # 沙盒 GPU 是 Microsoft 基本显示适配器,提供 OpenGL 1.1。Minecraft 1.17 及更高版本需要 OpenGL 3.2,因此游戏需要 Mesa3D 的 opengl32.dll (llvmpipe),它在软件中实现 OpenGL。以下两个下载出于目的都是 MinGW 构建。Prism Launcher 和 Mesa 的 MSVC 构建依赖于 Visual C++ 再分发,Windows Server 2022 并不提供:因此 Prism 安静地退出,而 Mesa 的 DLL 无法加载,因此 Windows 静默地回退到系统 opengl32.dll 。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡