搭建 Hyper-V 虚拟机作为脏区使用-仅供记录

又是全让 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 指令,组合拳:

  1. 在 OOBE 任意界面按 Shift + F10 呼出命令提示符。
  2. 输入 oobe\bypassnro 回车,系统自动重启。
  3. 重启后重新走一遍国家/键盘选择。
  4. 关键:在进入联网界面之前,回到宿主机 Hyper-V Manager,把虚拟机的 Network Adapter 临时改为 Not connected(相当于拔网线)。
  5. 此时联网界面右下角会出现灰色的 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