又是全让 AI 写的,仅做一点修改,当个记录使用。
我感觉最近有些模型降智了,写出来的文章质量感觉还更差了一些。而且我有点没有力气改了,所以在这里要叠甲了:我下面写的这些完全不代表我个人观点,完全不代表我个人真的这么做了,可能只是 AI 出了一些幻觉,完全不提供任何建议,包括对以后的我。只能说是一个和我实际搭建过程宏观上大差不差的一个记录而已。
说在前面
All-in AI (你看,比如说这句就是 AI 预测的,我还没决定好要不要这么做)的过程中,我需要在台式机上跑越来越多的 Agent 工具——CLI 的、GUI 的、开源的、闭源的,有些我压根就不想判断它可不可信。之前用 Sandboxie 隔离 QQ/微信这种"数据小偷"绰绰有余,但到了 Agent 这个量级(能执行任意命令、能读写文件系统、能联网),沙盒的隔离粒度远远不够。
核心矛盾就三个字:不信任。
我不信任闭源 GUI Agent 不偷我文件,不信任 CLI Agent 不 rm -rf 我的用户目录,也不信任"便携版"软件说的"删文件夹就干净"。我需要的是一个字面意义上的、完整的、可以随时炸掉重来的独立电脑,但又不想真买一台新机器。
于是就有了这次折腾:在台式机上用 Hyper-V 搭一个带快照回滚的 Windows 11 虚拟机,作为所有不可信 Agent 和脏软件的专属隔离舱。
本次折腾概览
- Hyper-V Generation 2 虚拟机,动态内存,关机时资源占用为 0
- 纯净正版 Win11 Pro 25H2,纯英文本地离线账号(绕过微软强制登录)
- External Switch 外部网络,虚拟机作为独立设备接入局域网
- 宿主机单目录受限 SMB 共享,虚拟机映射为
Z:盘,物理隔绝其余所有文件 - 虚拟机内独立跑代理软件(TUN 模式),不依赖宿主机代理
- 宿主机防火墙放行 3000 端口,虚拟机可直连宿主机 New API
- CC Switch 导入配置后成功拉取模型列表,Codex 端到端写文件验证通过
- 冷快照
Clean-Baseline+ 调优快照Dev-Ready,两级回滚体系 - 语音输入方案:宿主机/虚拟机双 Client 物理分键(宿主机 F13,虚拟机 Insert)
- 一键启动快捷方式 + Hyper-V Administrators 组权限消灭 UAC 弹窗
- 任务计划程序绑定"会话连接"事件,自动重启虚拟机内的语音输入客户端
一、技术选型:为什么是 Hyper-V
台式机跑着 WSL 2 和 Docker,意味着 Hyper-V 虚拟化层已经在底层激活了 。在这个前提下再加一个 VM,不会引入任何新的虚拟化层开销。而 VMware / VirtualBox 反而会和已有的 Hyper-V 打架。
Hyper-V 相比 Sandboxie 和 WSL 的核心优势就一个:快照(Checkpoint)。打一个快照,虚拟硬盘即刻变为只读,后续所有写操作进差量文件(.avhdx)。回滚时只需把指针拨回原始盘,1-5 秒整台机器时光倒流——注册表、系统文件、病毒残留、Agent 写的所有垃圾,全部人间蒸发。这和 Windows 自带的"系统还原点"完全不是一个维度:还原点只管注册表和部分系统文件,Agent 偷偷塞进 AppData 的东西它根本管不着。
动态内存也很关键:启动分配 4GB,上限锁 16GB,闲置时自动归还宿主机;关机后 CPU 和内存占用均为 0。
二、虚拟机创建与系统安装
基础配置
| 参数 | 设置 |
|---|---|
| Generation | 2(UEFI + Secure Boot + TPM,Win11 硬性要求) |
| 启动内存 | 4096 MB,勾选 Dynamic Memory |
| 最大内存 | 16384 MB(锁死上限防爆) |
| vCPU | 8(动态共享,非独占,闲时归还) |
| 虚拟硬盘 | 100GB 动态扩展 .vhdx |
| 网络 | External Switch(绑定有线网卡) |
| Security | Secure Boot + TPM 2.0 均开启 |
镜像来源:微软官网 https://www.microsoft.com/software-download/windows11,选 “Download Windows 11 Disk Image (ISO) for x64 devices”,Multi-edition ISO。文件名类似 Win11_25H2_English_x64_v2.iso,约 7.9GB。只有这个来源是正版,别去第三方站下。
坑 1:精简版系统(Tiny11 / Ghost Spectre 等)千万别用。 它们会暴力阉割系统组件(Edge WebView2、.NET 运行库、网络凭证服务等),跑 Agent 和 Node.js 时缺 dll 报错排查起来会让你痛不欲生。官方完整版哪怕后台多跑点垃圾,至少环境完整。
OOBE 绕过微软账号强制登录
Win11 25H2 的安装向导已经彻底删除了"离线账户"按钮。传统的 no@thankyou.com / a@a.com 废邮箱绕过法也被封堵——输入后不再弹 “Oops, something went wrong” 让你回退本地账户,而是死循环在密码框报 “You’ve tried to sign in too many times”。
最终解法是断网 + BypassNRO 指令,组合拳:
- 在 OOBE 任意界面按
Shift + F10呼出命令提示符。 - 输入
oobe\bypassnro回车,系统自动重启。 - 重启后重新走一遍国家/键盘选择。
- 关键:在进入联网界面之前,回到宿主机 Hyper-V Manager,把虚拟机的 Network Adapter 临时改为
Not connected(相当于拔网线)。 - 此时联网界面右下角会出现灰色的
I don't have internet,点击后再点Continue with limited setup,直接进入本地离线账户创建。
用户名必须纯英文(如
agent),路径C:\Users\agent。中文用户名会导致C:\Users\张三\这种路径,一堆 Python / Node.js / Agent 工具会因为编码问题暴毙。系统显示语言进桌面后可以随时在设置里切中文,不影响底层路径。
进桌面后,记得回 Hyper-V Manager 把 Network Adapter 改回 External-Switch 恢复网络。
三、增强会话与性能调优
增强会话模式(Enhanced Session)
Hyper-V 的增强会话底层走 RDP 协议,开启后获得:
- 剪贴板双向同步(宿主机复制,虚拟机
Ctrl+V) - 动态分辨率适配(窗口大小变化时虚拟机内部自动重新协商分辨率)
- 鼠标无缝进出(不需要手动释放焦点)
连接时的 Local Resources 设置需要注意安全红线:
- Clipboard:勾选(打通剪贴板)
- Drives:绝对不勾(勾了虚拟机会直接挂载宿主机的全盘文件,隔离白做)
- Smart cards / WebAuthn:不勾(脏区不需要读取宿主机的安全芯片)
坑 2:剪贴板突然失效。 断开重连或改设置后,虚拟机内部的
rdpclip.exe进程可能假死。重启虚拟机是最稳的恢复方式。
解除 RDP 30 FPS 帧率锁
默认的增强会话把桌面传输帧率锁死在 30 FPS(存疑)。在高刷屏上拖动窗口会有严重的粘滞感,甚至连拖拽虚线框都卡。
在虚拟机内执行:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations" /v DWMFRAMEINTERVAL /t REG_DWORD /d 15 /f
15 对应约 66 FPS,是 RDP 协议的实际天花板(存疑)。改完重启生效。再高的数值没有意义,RDP 不支持。
其他系统优化
禁止休眠/睡眠(防止 Agent 跑到一半虚拟机自己睡着):
powercfg /change standby-timeout-ac 0
powercfg /change monitor-timeout-ac 0
禁止 Windows 自动更新:通过组策略(gpedit.msc)禁用 Windows Update 服务。脏区不需要追最新补丁,而且后台更新会抢 CPU。
深色模式(未激活系统强制开启):
New-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name SystemUsesLightTheme -Value 0 -Type Dword -Force
New-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize -Name AppsUseLightTheme -Value 0 -Type Dword -Force
未激活的 Win11 不让在设置里改主题,但注册表管不着你。
四、网络:代理与 API 互通
虚拟机科学上网
虚拟机走 External Switch,在路由器层面是一台独立设备,不会自动继承宿主机的代理。
最一劳永逸(存疑)的做法是在虚拟机内独立跑代理软件并开启 TUN 模式(虚拟网卡全局路由)。这样所有流量(包括系统、浏览器、终端命令行)都会被强制路由,不需要手动配 HTTP_PROXY 环境变量。
坑 3:代理软件报 DLL 缺失。 纯净官方镜像不带 Microsoft Visual C++ Redistributable。从微软官网下
vc_redist.x64.exe(https://aka.ms/vs/17/release/vc_redist.x64.exe) ,通过共享目录传进虚拟机安装即可。
坑 4:代理软件的配置不是真"便携"。 把程序文件夹复制过来后发现是空壳——订阅链接等用户数据存在宿主机的
AppData里。需要在宿主机上用软件自带的导入导出功能,把配置导出后在虚拟机重新导入。
宿主机 New API 端口放行
虚拟机访问宿主机的 New API(Docker 部署,端口 3000)时,会被宿主机的 Windows Defender 防火墙拦截——因为虚拟机在网络层面是"外部设备"。
在宿主机 PowerShell(管理员)执行:
New-NetFirewallRule -DisplayName "Allow NewAPI Port 3000" -Direction Inbound -LocalPort 3000 -Protocol TCP -Action Allow
之后虚拟机内的 CC Switch 和各种 Agent,都可以通过 http://<宿主机内网IP>:3000/v1 正常连接 New API 。
五、文件隔离通道(SMB 共享)
架构思路
代码和工作产物放宿主机,通过 SMB 共享映射给虚拟机;Agent 软件和运行环境装在虚拟机内部 C 盘。
这样做的核心好处是:快照回滚不会丢代码。虚拟机被还原时,只有内部 C 盘被重置,宿主机共享目录里的项目文件完全不受影响。
性能方面不用担心——虽然走 SMB 协议,但虚拟机和宿主机在同一块主板、同一套内存总线上,虚拟交换机的吞吐量远超千兆物理网络。
具体配置
宿主机:右键共享目录 -> Properties -> Sharing -> Advanced Sharing -> 勾选 Share this folder -> Permissions 给 Everyone 分配 Change + Read。
虚拟机:File Explorer -> This PC -> Map network drive -> Z: -> \\<宿主机IP>\Agent-Projects -> 勾选 Reconnect at sign-in 和 Connect using different credentials(填宿主机的 Windows 账密)。
坑 5:忘记勾 Remember my credentials。 不用慌,打开虚拟机的 Credential Manager -> Windows Credentials -> Add a Windows credential,手动补录宿主机 IP、用户名、密码即可。
六、快照体系
两级黄金快照
| 快照名称 | 打快照时机 | 用途 |
|---|---|---|
Clean-Baseline |
系统装完 + 帧率/防休眠/防更新/深色模式/共享目录全部就绪 | 彻底重置到最干净的开发底座 |
Dev-Ready |
在 Clean-Baseline 基础上装好 Git、Node.js、代理软件 | 日常折腾弄脏后的常规回滚点 |
必须在关机(Off)状态下打快照。开机快照会把当前内存状态也写进磁盘,体积大、恢复时容易出协议冲突。关机快照(冷快照)只锁硬盘扇区,体积最小、恢复最稳。
回滚与分支
右键快照选择 Apply 时,Hyper-V 会问你"是否先给当前状态也打个快照再回滚"。选"是"就会形成分支树——以后可以在不同环境之间来回横跳(类似 Git 分支)。
坑 6:安装好的 ISO 文件删不掉。 宿主机的 System 进程锁住了它——因为 Hyper-V 的虚拟 DVD 驱动器还在挂载这个 ISO。在 Hyper-V Manager -> 虚拟机 Settings -> SCSI Controller -> DVD Drive -> 改成
None,Apply 后即可删除。
七、Agent 运行时安装
虚拟机内直接在 Windows 原生环境装:
winget install --id Git.Git -e --source winget
winget install --id OpenJS.NodeJS.LTS -e --source winget
坑 7:winget 下载 GitHub 资源报
0x80072efd。 虚拟机没有科学上网时,直连 GitHub 超时。用宿主机下好安装包,扔进共享目录(Z:盘),虚拟机里双击安装。
坑 8:装完后
node -v报 “not recognized”。 Windows 经典行为:当前 PowerShell 窗口不会自动刷新 PATH。关掉重开一个就好。
坑 9:npm 执行报 Execution Policy 错误。 纯净 Win11 默认禁止运行外部脚本。执行
Set-ExecutionPolicy Unrestricted -Scope CurrentUser解除。
CC Switch(API 配置管理工具)不放进快照基线——它和 Agent 软件一样属于"测试工具"。放在共享目录 Z: 盘里,虚拟机里直接运行即可。回滚快照后 CC Switch 本体依然在 Z 盘,不用重新下载。
八、语音输入方案
核心痛点
我日常 99% 的输入依赖语音转文字(Caps Writer)。Caps Writer 是 Client-Server 架构,Server 跑在宿主机负责识别,Client 监听按键并发送音频。
问题在于:Hyper-V 的连接窗口(不管增强还是基本会话)底层都是 RDP 协议,只要焦点在虚拟机窗口内,宿主机的热键监听软件就收不到任何按键信号。 这不是某个设置没调对,是 RDP 协议的设计本质。
尝试过的无效方案:
- Hyper-V Settings -> Keyboard ->
Use on the physical computer:只透传 Windows 键,其他按键依然被吃 - 以管理员身份运行 Caps Writer:UIPI 权限提升无效
- 关闭增强会话退回基本会话:基本会话底层依然是 RDP
最终方案:双 Client 物理分键
放弃"统一一个按键控制两端"的幻想,接受物理分流:
- 宿主机 Client 监听 F13(机械键盘固件改键)
- 虚拟机 Client 监听 Insert
两个 Client 都指向宿主机同一个 Server(虚拟机 Client 的 config 里 server 地址改为宿主机内网 IP + 端口)。互不抢占、互不串台。
坑 10:虚拟机的 Caps Writer Client 报"未找到录音设备"。 Hyper-V 增强会话默认只开了音频播放,没开录制。断开虚拟机连接 -> 重新连接时在弹窗里点
Show Options->Local Resources->Remote audio-> Settings -> 把 Remote audio recording 改成Record from this computer。
坑 11:每次断开重连后虚拟机的 Client 都要手动重启。 RDP 断开时虚拟音频设备会被"拔出",Client 的音频流句柄死锁,不会自动重连。解法是在虚拟机的任务计划程序里新建任务,触发器选
On connection to user session(连接到用户会话时),操作指向一个先taskkill旧进程再重启 Client 的.bat脚本。这样每次重新连进虚拟机,Client 会自动重生并咬住新的麦克风设备。
九、一键启动与 UAC 消灭
桌面快捷方式
vmconnect.exe localhost Win11-DirtyZone
放在开始菜单目录(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\)或个人工具目录,用 PowerToys Run / Everything 搜索即可秒级唤起。
消灭 UAC 弹窗
每次启动 vmconnect.exe 都会弹 “Do you want to allow this app to make changes to your device”,极其烦人。
根本解法:把当前用户加入 Hyper-V Administrators 组 :
net localgroup "Hyper-V Administrators" $env:USERNAME /add
注销并重新登录/重启后生效。同时把快捷方式属性里的"以管理员身份运行"取消勾选。之后不管用什么方式唤起虚拟机,零弹窗,静默拉起。
虚拟机不用时怎么关
用顶栏的 Save(保存状态):把当前内存冻结写入磁盘,CPU 和内存占用瞬间降为 0。下次点 Start/Connect,2 秒内所有窗口和进程原地复活。
最终的隔离分层
| 层级 | 对付谁 | 技术 | 空闲占用 |
|---|---|---|---|
| L0 一次性验毒 | 可疑文件、临时测试 | Windows 沙盒 | 0 |
| L1 数据小偷 | QQ、微信、百度网盘等 | Sandboxie Plus | 0 |
| L2 命令执行型 Agent | Claude Code 等 CLI Agent | WSL 2 | 可锁上限 |
| L3 重型 GUI 脏物 | Codex Desktop、闭源 GUI Agent、一切不可信物 | Hyper-V 虚拟机 | 关机/挂起 = 0 |