pages.chenos.dev / workstation / 选型、安装与代理

Agent 工作站:Proxmox VE 选型、安装与代理

一台 ThinkStation P3 Tower Gen 2(Ultra 9 285)不接显示器,专门用来跑虚拟机和调用云端 API 的 agent。底层系统该怎么选?选好之后怎么装?agent 访问外网的代理放在哪里?

2026-10-06主题:家用 / 小团队 agent 服务器

一、选型:装 PVE 还是 Ubuntu

结论:推荐装 Proxmox VE。需求本来就是跑虚拟机,PVE 正是专门干这个的。两者也不冲突:PVE 装在机器上,Ubuntu 装在 PVE 的虚拟机里,agent 就在这些 Ubuntu 虚拟机里跑。

推荐结构

ThinkStation
└── Proxmox VE(底层,负责管理虚拟机)
    ├── Ubuntu 虚拟机  agent-01
    ├── Ubuntu 虚拟机  agent-02
    ├── Ubuntu 虚拟机  agent-03
    └── Windows 虚拟机(需要时再开)

两种装法对比

PVE(推荐)直接装 Ubuntu
开虚拟机网页上点几下就好要自己装 KVM 或 virt-manager,基本靠命令行
agent 之间的隔离每个 agent 一台 VM,互不影响一般用 Docker 隔离,隔离程度弱一些
环境搞坏了一键回滚快照要自己修,或者重建容器
新开一个 agent从模板克隆,几秒钟要写脚本或 Docker 配置
资源监控网页上直接看每台机器的占用要自己装监控工具
跑 Windows 等其他系统随时开也能开,但麻烦
上手难度要学一点 PVE 的概念熟悉 Linux 的话直接就能用
资源损耗每台 VM 有一点额外开销最省资源

怎么选

什么情况选 Ubuntu

满足下面全部条件,直接装 Ubuntu 会更简单:

  • 只跑 agent,不需要 Windows 或其他系统
  • agent 全部放在 Docker 容器里就够了,不需要完整的虚拟机
  • 熟悉 Linux 命令行,愿意自己写脚本管理

为什么这里选 PVE

  • 要跑虚拟机:PVE 的本职工作
  • 不接显示器:全部靠网页管理
  • agent 一般权限很大,容易把环境搞乱:需要隔离和快照回滚
  • PVE 里也能开 LXC 容器,轻量程度接近 Docker。所以 PVE 能覆盖直接装 Ubuntu 的大部分好处,反过来 Ubuntu 要补齐 PVE 这些能力就麻烦多了

日常用起来的区别

Ubuntu 是通用操作系统,它就是“一台电脑”;PVE 是专门管理虚拟机的系统(也是 Debian Linux,加了一整套虚拟机管理工具和网页界面),定位是“管很多台电脑的电脑”,自己基本不干活。

直接装 Ubuntu:                      装 PVE:
┌─────────────────────┐          ┌──────────────────────────────┐
│ Ubuntu              │          │ PVE(只负责管理)             │
│  ├ agent-1(容器)  │          │  ├ VM: Ubuntu → agent-1      │
│  ├ agent-2(容器)  │          │  ├ VM: Ubuntu → agent-2      │
│  └ agent-3(容器)  │          │  └ VM: Windows(按需)       │
│ 大家共用一个系统内核 │          │ 每台都是独立的电脑            │
└─────────────────────┘          └──────────────────────────────┘
场景直接用 Ubuntu用 PVE
日常操作SSH 登录,用命令行和 Docker 管理浏览器打开网页点按钮;进虚拟机里干活时也用 SSH
新开一个 agent写好 Dockerfile 或脚本,docker run 启动右键模板,点“克隆”,几秒钟就有一台新机器
agent 把环境搞坏了删掉容器重建;如果改坏的是宿主机,就得手动修一键回滚到快照,宿主机不受影响
agent 执行了危险命令容器里影响有限,但有挂载目录或权限给大了,可能波及宿主机只会弄坏它自己那台虚拟机
想试一个新环境再开一个容器,或者直接装在宿主机上,有把系统装乱的风险克隆一台出来试,不满意就删掉
系统升级升级宿主机时所有 agent 都要停宿主机很少需要升级,各个虚拟机分别升级
资源分配容器默认共享全部资源,一个 agent 跑大型构建可能拖慢其他 agent每台虚拟机固定分配 CPU 和内存
资源利用率更高,几乎没有额外开销每台虚拟机多占几百 MB 内存运行自己的系统
出问题怎么排查一个系统里查,路径短要分清是宿主机还是虚拟机的问题,多一层
一句话:Ubuntu 是所有 agent 住在同一个大房间,一个人弄乱,大家都受影响;PVE 是每个 agent 有自己的独立房间,弄乱了直接恢复原样。agent 权限大、会自己执行命令、偶尔会把环境弄坏,所以“隔离”和“一键恢复”比省下那一点资源更值。

二、安装 PVE:从 U 盘到浏览器管理

在 ThinkStation 上从零装好 PVE,到能在浏览器里管理,大约 30 分钟。

1准备

macOS 写盘命令(实际成功的做法,disk4 换成你的盘号):

cd ~/Downloads
shasum -a 256 proxmox-ve_9.2-1.iso      # 和官网公布的 SHA256 对比
hdiutil convert proxmox-ve_9.2-1.iso -format UDRW -o proxmox-ve_9.2-1.dmg
diskutil list external                  # 找 (external, physical)、大小和 U 盘一致的那个,比如 /dev/disk4
diskutil unmountDisk /dev/disk4
sudo dd if=proxmox-ve_9.2-1.dmg of=/dev/rdisk4 bs=1m     # 按 Ctrl+T 看进度,约 1~2 分钟
diskutil eject /dev/disk4

写完后的几种情况:

  • dd 最后显示的字节数等于 ISO 大小(9.2-1 是 1706178560 bytes),没有 error,就算写好了
  • Mac 弹出“此电脑不能读取您插入的磁盘”是正常的(Linux 启动盘格式),点“忽略”,不要初始化
  • 想校验的话:拔插 U 盘后用 sudo cmp -n $(stat -f%z proxmox-ve_9.2-1.dmg) proxmox-ve_9.2-1.dmg /dev/rdisk4。要用 rdisk,用 /dev/disk4 可能读到缓存里的旧数据,误报 differ
  • 实际情况:写完后 Mac 一度认不出这个 U 盘,但插到工作站上 F12 照样能启动安装。认不出来时,先直接去工作站上试

2BIOS 设置

开机时连续按 F1 进入联想 BIOS,检查以下几项:

设置项改成作用
Intel Virtualization Technology(VT-x)Enabled运行虚拟机必须打开
VT-dEnabled以后要把硬件直通给虚拟机时用
After Power LossPower On停电后来电自动开机,适合不接显示器长期运行
Secure Boot可以先关掉PVE 支持安全启动,但关掉能少踩坑

保存后重启,开机时按 F12 调出启动菜单,选 U 盘启动。

3安装向导

  1. 选择 Install Proxmox VE (Graphical)
  2. 同意许可协议
  3. 选目标硬盘:选原装的那块 2T 系统盘。如果装了两块盘,注意别选错
    • 点 Options 可以选文件系统。只有一块盘的话,默认的 ext4 就行,最简单
  4. 地区和时区:Country 选 China,Time zone 选 Asia/Shanghai,键盘选 U.S.
  5. 管理员信息:设置 root 密码,再填一个邮箱(用来接收系统告警,随便填也可以)
  6. 网络设置(最重要的一步):
    • Hostname:比如 pve.lan
    • 管理网卡:机器有两个网口(主板一个、扩展卡一个),选显示已连接(插着网线)的那个
    • IP 地址:安装程序会按路由器的 DHCP 自动填一个,比如 192.168.50.205/24。这里填的就是 PVE 的固定 IP,直接用就行,装好后到路由器上绑定
    • Gateway:路由器地址,比如 192.168.50.1
    • DNS:可以填路由器地址,或 223.5.5.5
    • 建议同时在路由器里把这个 IP 绑定到这台机器,避免和别的设备冲突
    • ⚠️ 自动填入的 IP 如果是 192.168.100.x 这类和电脑前三段不一样的地址,说明网线插在了光猫上。先改插路由器的 LAN 口,再回到这一步,见 规划网段和 IP
  7. 确认信息无误,点 Install。等几分钟装完后,拔掉 U 盘,让机器重启

重启后屏幕会显示:

https://192.168.50.205:8006/
看到这行就说明装好了,显示器和键盘可以拔掉了。

4第一次登录

  1. 在另一台电脑的浏览器里打开 https://192.168.50.205:8006
  2. 浏览器会提示“连接不安全”。这是因为 PVE 用的是自签名证书,点“高级”,然后选择继续访问
  3. 登录:用户名 root,密码是安装时设置的密码,Realm 选 Linux PAM,Language 可以选“中文”
  4. 登录后会弹出“无有效订阅”提示,直接点 OK 关掉

5改成免费更新源(必做)

PVE 默认用的是付费企业源,没买订阅的话更新会报错,需要换成免费的社区源。

方法 A:在网页里改

点左侧的节点名 → 更新 → 软件仓库:

  1. 选中 pve-enterprise 和 ceph enterprise 两项,点 禁用
  2. 点 添加,选择 No-Subscription

方法 B:用命令改,顺便换成国内镜像,更新更快

点节点名 → Shell,粘贴下面的命令(适用于 PVE 9,基于 Debian 13 trixie):

# 禁用企业源(没有订阅,会报 401)
for f in pve-enterprise ceph; do
  [ -f /etc/apt/sources.list.d/$f.sources ] && mv /etc/apt/sources.list.d/$f.sources /etc/apt/sources.list.d/$f.sources.bak
done

# Debian 源换成中科大镜像
sed -i 's|http://deb.debian.org|https://mirrors.ustc.edu.cn|g; s|http://security.debian.org|https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list.d/*.sources

# 如果已经在网页上添加过 No-Subscription 源,它指向国外官方地址,也换成中科大
sed -i 's|http://download.proxmox.com/debian|https://mirrors.ustc.edu.cn/proxmox/debian|g' /etc/apt/sources.list.d/*.sources

# 还没有免费源的话再添加
grep -rqs 'pve-no-subscription' /etc/apt/sources.list.d/*.sources || cat > /etc/apt/sources.list.d/pve-no-subscription.sources <<'EOF'
Types: deb
URIs: https://mirrors.ustc.edu.cn/proxmox/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF

# 检查:URIs 应该全部是 mirrors.ustc.edu.cn
grep -h '^URIs' /etc/apt/sources.list.d/*.sources

# 更新系统(强制 IPv4,避免家里 IPv6 不通时卡住)
apt -o Acquire::ForceIPv4=true update && apt -o Acquire::ForceIPv4=true full-upgrade -y

更新完重启一次:reboot。实际从 9.2.2 升级到了 9.2.21。

实际遇到的几个现象:

  • 装好后任务列表里有一条红色的“更新软件包数据库”:开机自动检查更新时用了企业源,返回 401,换源后就好了
  • 执行 reboot 的那个 Shell 任务会显示红色错误:机器重启把网页终端断开了,可以忽略
  • apt update 很慢:几乎都是因为还在用国外的源,换成国内镜像就好;还慢的话,先试 -o Acquire::ForceIPv4=true,有效就写进 /etc/apt/apt.conf.d/99force-ipv4:Acquire::ForceIPv4 "true";
  • 不要让 apt 走笔记本上的 Clash 代理:实际试过,大量 502 Bad Gateway,换国内镜像才是正解

6添加第二块硬盘(如果加了 4T 数据盘)

点节点名 → 磁盘:

  1. 选中新硬盘,点 擦除磁盘
  2. 选择 LVM-Thin → 创建,名称填 data4t,勾选“添加存储”

以后新建虚拟机时,硬盘位置选 data4t,虚拟机就都放在这块大盘上。

7准备 Ubuntu 镜像

在 PVE 的 Shell 里直接下载到 ISO 目录:

cd /var/lib/vz/template/iso
F=$(curl -s https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/24.04/ | grep -o 'ubuntu-24\.04\.[0-9]*-live-server-amd64\.iso' | sort -u | tail -1)
echo "要下载:$F"          # 2026-10 时是 ubuntu-24.04.5-live-server-amd64.iso
for M in https://mirrors.tuna.tsinghua.edu.cn https://mirrors.aliyun.com https://mirror.nju.edu.cn https://repo.huaweicloud.com; do
  echo "===== 尝试 $M ====="
  if wget -c "$M/ubuntu-releases/24.04/$F"; then
    wget -qO- "$M/ubuntu-releases/24.04/SHA256SUMS" | grep " \*\?$F\$" | sha256sum -c && break
  fi
done
ls -lh $F                 # 约 3.1G
实际踩过的坑:中科大镜像下载 Ubuntu ISO 返回 403 Forbidden(它对 ISO 大文件有访问限制;apt 软件源不受影响)。上面的命令会依次尝试清华、阿里云、南京大学、华为云,下载完自动校验 SHA256,看到 OK 才算成功。

下载完成后,在 local (pve) → ISO 镜像 里刷新就能看到。

常见问题

浏览器打不开 8006 端口
确认电脑和 PVE 在同一个网段,网关填对了,网线也插好了。
U 盘启动不了
重新写一遍(macOS 用上面的 dd 命令,Windows 用 Rufus 的 DD 模式),或者在 BIOS 里关掉 Secure Boot。
写盘时报“输入/输出错误”,之后 U 盘显示“无媒体”或识别不到
实际遇到过:在原机 Ubuntu 上连续写坏两个 U 盘的状态。拔插一次有时能恢复。换到 Mac 上用 dd 写入后成功安装。
balenaEtcher 报 h.requestMetadata is not a function
Etcher 2.1.7 的已知 bug,换 2.1.6,或者直接用 dd。
电脑打不开 PVE 网页,或者 PVE 的 IP 和电脑不在同一网段
多半是网线插在了光猫上。改插路由器的 LAN 口,重装一次最省事(刚装好时什么都没配置)。
在外面想访问
在 PVE 宿主机上装 Tailscale,或者通过 Cloudflare Tunnel 访问。
不要把 8006 端口直接暴露到公网。
下一步:做一个 Ubuntu agent 模板,再从模板克隆出多个 agent。

三、代理:用 LXC 跑 mihomo,所有 agent 共用

结论:不装 Clash Verge,在 PVE 里单独开一个 LXC 容器跑 mihomo,当所有 agent 共用的代理。

Clash Verge 是带桌面界面的客户端,要有显示器和桌面环境才能用。这台机器不接显示器,PVE 宿主机也没有桌面,所以不适合装它。

可以换成 Clash Verge 底层用的那个内核:mihomo(也就是 Clash Meta)。mihomo 能读同样的订阅,再配一个网页面板,用起来和 Clash Verge 差不多:选节点、看连接、看流量都能在浏览器里完成。

LXC 容器是什么

LXC(Linux Containers)是一种轻量级的 Linux 环境。用起来像一台独立的 Linux 电脑:能 SSH 登录、装软件、跑服务;但它不是真正的虚拟机,而是和宿主机共用同一个 Linux 内核。

虚拟机 VMLXC 容器Docker 容器
本质一台完整的虚拟电脑一个轻量的 Linux 系统打包好的单个应用
启动速度几十秒1–3 秒1 秒左右
额外占用的内存几百 MB几十 MB很少
能装什么系统Linux、Windows 都行只能装 Linux只能跑 Linux 应用
隔离程度最强中等中等
在 PVE 里怎么管理网页上直接管网页上直接管PVE 不直接管,要先装在 VM 或 LXC 里
规律:简单、可信的小服务(比如代理)用 LXC 省资源;要跑不受控代码(比如 agent)的环境用 VM 求安全。

装在哪里:几种位置对比

位置评价
单独一个 LXC 容器(推荐)所有 agent 共用一个出口,统一管理。坏了不影响宿主机;资源占用很小,1 核、512M 内存就够
PVE 宿主机上能用,但会把宿主机装乱,出问题时还可能影响 PVE 本身。不推荐
每台 agent 虚拟机里各装一个每台都要配订阅、选节点,克隆时也容易出乱子。不推荐
家里的软路由(OpenWrt 等)如果家里已经有软路由,直接用它最省事
另外,不要依赖笔记本上的 Clash Verge 来给工作站代理。笔记本一合盖,所有 agent 就都断网了。

整体结构

PVE 宿主机(更新走国内镜像,不需要代理)
├── LXC: proxy      192.168.50.101   ← mihomo,端口 7890;网页面板端口 9090
├── VM: agent-01    HTTPS_PROXY=http://192.168.50.101:7890
├── VM: agent-02    同上
└── ...

1创建 LXC 容器

在 PVE 网页上:

  1. 先到 local 存储 → CT 模板,下载一个 Debian 模板
  2. 右上角点 创建 CT,配置如下:
    • 1 核 CPU,512M 内存,4G 硬盘
    • 固定 IP,比如 192.168.50.101/24
    • 勾选 开机自启

2安装 mihomo

到 GitHub 的 MetaCubeX/mihomo 页面,在 Releases 里下载 mihomo-linux-amd64-*.gz。如果容器里访问 GitHub 很慢,可以先在自己电脑上下载好,再传到容器里。然后在容器里执行:

gunzip mihomo-linux-amd64-*.gz
install -m 755 mihomo-linux-amd64-* /usr/local/bin/mihomo
mkdir -p /etc/mihomo

3写配置文件 /etc/mihomo/config.yaml

mixed-port: 7890
allow-lan: true            # 允许其他虚拟机连进来
bind-address: "*"
mode: rule
log-level: info

external-controller: 0.0.0.0:9090
secret: "改成你自己的密码"
external-ui: ui
external-ui-url: "https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip"

proxy-providers:
  airport:
    type: http
    url: "你的订阅链接"      # 和 Clash Verge 里用的是同一个订阅链接
    interval: 3600
    path: ./providers/airport.yaml
    health-check:
      enable: true
      url: https://www.gstatic.com/generate_204
      interval: 300

proxy-groups:
  - name: PROXY
    type: select           # 手动选节点
    use: [airport]

rules:
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - GEOIP,CN,DIRECT        # 第一次启动时会自动下载 IP 数据库
  - MATCH,PROXY
节点组建议用 select 固定一个节点,不要用 url-test 自动切换。调用 API 时出口 IP 频繁换地区,容易触发风控。

4设置成开机自启的系统服务

cat > /etc/systemd/system/mihomo.service <<'EOF'
[Unit]
Description=mihomo
After=network-online.target

[Service]
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl enable --now mihomo

5打开网页面板

浏览器访问 http://192.168.50.101:9090/ui。连接时填上面设置的密码,就能像在 Clash Verge 里一样选节点、看连接了。

6让 agent 虚拟机走代理

在 Ubuntu 模板机里编辑 /etc/environment,加上下面几行。之后从模板克隆出来的 agent 都会自动带上:

http_proxy=http://192.168.50.101:7890
https_proxy=http://192.168.50.101:7890
HTTP_PROXY=http://192.168.50.101:7890
HTTPS_PROXY=http://192.168.50.101:7890
no_proxy=localhost,127.0.0.1,192.168.0.0/16,.lan
NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,.lan

Claude Code、curl、git、npm、pnpm 都会读这些环境变量。

有两个程序不读这些变量,需要单独配置:

安全提醒

  • 7890 和 9090 端口只在内网用,不要映射到公网
  • 网页面板一定要设 secret 密码
完整的逐步操作(含 GitHub 下载、选节点、Ubuntu 虚拟机安装与代理配置)见 手把手搭建教程。
进阶:如果想让 agent 虚拟机不用设置任何环境变量就自动走代理,可以把这个 LXC 改成透明网关(TUN 模式),再把虚拟机的网关指向它。配置会复杂一些。