Agent 工作站:Proxmox VE 选型、安装与代理
一台 ThinkStation P3 Tower Gen 2(Ultra 9 285)不接显示器,专门用来跑虚拟机和调用云端 API 的 agent。底层系统该怎么选?选好之后怎么装?agent 访问外网的代理放在哪里?
一、选型:装 PVE 还是 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 内存运行自己的系统 |
| 出问题怎么排查 | 一个系统里查,路径短 | 要分清是宿主机还是虚拟机的问题,多一层 |
二、安装 PVE:从 U 盘到浏览器管理
在 ThinkStation 上从零装好 PVE,到能在浏览器里管理,大约 30 分钟。
1准备
- 一个 U 盘:8G 以上,里面的数据会被清空
- 临时借一套显示器和键盘:只在安装时用,装完就可以拔掉
- 网线:插在路由器的 LAN 口(不是光猫)。PVE 不支持 Wi-Fi,虚拟机也没法通过 Wi-Fi 桥接进局域网。安装过程本身不需要联网,但插着网线能自动填好网络参数
- 安装镜像:到官网 proxmox.com/en/downloads 下载最新版 Proxmox VE ISO Installer(目前是 9.x)。也可以从国内镜像站下载,更快,比如
https://mirrors.ustc.edu.cn/proxmox/iso/ - 写盘(实际踩过坑,建议按下面的方法来):
- macOS:用终端命令(见下)。balenaEtcher 2.1.7 有 bug,选 ISO 时会报
(0 , h.requestMetadata) is not a function,要用的话装 2.1.6 - Windows:Rufus,提示选择模式时选 DD 模式
- 不建议在工作站原机自带的 Ubuntu 上写:实际两次都报“输入/输出错误”,U 盘随后显示“无媒体”
- macOS:用终端命令(见下)。balenaEtcher 2.1.7 有 bug,选 ISO 时会报
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-d | Enabled | 以后要把硬件直通给虚拟机时用 |
| After Power Loss | Power On | 停电后来电自动开机,适合不接显示器长期运行 |
| Secure Boot | 可以先关掉 | PVE 支持安全启动,但关掉能少踩坑 |
保存后重启,开机时按 F12 调出启动菜单,选 U 盘启动。
3安装向导
- 选择 Install Proxmox VE (Graphical)
- 同意许可协议
- 选目标硬盘:选原装的那块 2T 系统盘。如果装了两块盘,注意别选错
- 点 Options 可以选文件系统。只有一块盘的话,默认的 ext4 就行,最简单
- 地区和时区:Country 选 China,Time zone 选
Asia/Shanghai,键盘选 U.S. - 管理员信息:设置 root 密码,再填一个邮箱(用来接收系统告警,随便填也可以)
- 网络设置(最重要的一步):
- 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
- Hostname:比如
- 确认信息无误,点 Install。等几分钟装完后,拔掉 U 盘,让机器重启
重启后屏幕会显示:
https://192.168.50.205:8006/
4第一次登录
- 在另一台电脑的浏览器里打开
https://192.168.50.205:8006 - 浏览器会提示“连接不安全”。这是因为 PVE 用的是自签名证书,点“高级”,然后选择继续访问
- 登录:用户名
root,密码是安装时设置的密码,Realm 选Linux PAM,Language 可以选“中文” - 登录后会弹出“无有效订阅”提示,直接点 OK 关掉
5改成免费更新源(必做)
PVE 默认用的是付费企业源,没买订阅的话更新会报错,需要换成免费的社区源。
方法 A:在网页里改
点左侧的节点名 → 更新 → 软件仓库:
- 选中
pve-enterprise和ceph enterprise两项,点 禁用 - 点 添加,选择 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 数据盘)
点节点名 → 磁盘:
- 选中新硬盘,点 擦除磁盘
- 选择 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
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 访问。
三、代理:用 LXC 跑 mihomo,所有 agent 共用
Clash Verge 是带桌面界面的客户端,要有显示器和桌面环境才能用。这台机器不接显示器,PVE 宿主机也没有桌面,所以不适合装它。
可以换成 Clash Verge 底层用的那个内核:mihomo(也就是 Clash Meta)。mihomo 能读同样的订阅,再配一个网页面板,用起来和 Clash Verge 差不多:选节点、看连接、看流量都能在浏览器里完成。
LXC 容器是什么
LXC(Linux Containers)是一种轻量级的 Linux 环境。用起来像一台独立的 Linux 电脑:能 SSH 登录、装软件、跑服务;但它不是真正的虚拟机,而是和宿主机共用同一个 Linux 内核。
- 虚拟机(VM):在大楼里盖了一栋独立的小房子,有自己的地基、水电和墙。最安全,但盖起来费材料。
- LXC 容器:大楼里隔出来的一套公寓,有自己的门锁和房间,但地基和水电管道和整栋楼共用。轻便,入住也快。
| 虚拟机 VM | LXC 容器 | Docker 容器 | |
|---|---|---|---|
| 本质 | 一台完整的虚拟电脑 | 一个轻量的 Linux 系统 | 打包好的单个应用 |
| 启动速度 | 几十秒 | 1–3 秒 | 1 秒左右 |
| 额外占用的内存 | 几百 MB | 几十 MB | 很少 |
| 能装什么系统 | Linux、Windows 都行 | 只能装 Linux | 只能跑 Linux 应用 |
| 隔离程度 | 最强 | 中等 | 中等 |
| 在 PVE 里怎么管理 | 网页上直接管 | 网页上直接管 | PVE 不直接管,要先装在 VM 或 LXC 里 |
装在哪里:几种位置对比
| 位置 | 评价 |
|---|---|
| 单独一个 LXC 容器(推荐) | 所有 agent 共用一个出口,统一管理。坏了不影响宿主机;资源占用很小,1 核、512M 内存就够 |
| PVE 宿主机上 | 能用,但会把宿主机装乱,出问题时还可能影响 PVE 本身。不推荐 |
| 每台 agent 虚拟机里各装一个 | 每台都要配订阅、选节点,克隆时也容易出乱子。不推荐 |
| 家里的软路由(OpenWrt 等) | 如果家里已经有软路由,直接用它最省事 |
整体结构
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 网页上:
- 先到
local存储 → CT 模板,下载一个 Debian 模板 - 右上角点 创建 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 都会读这些环境变量。
有两个程序不读这些变量,需要单独配置:
- Docker:拉镜像时需要在 Docker 的 systemd 配置里单独设代理
- apt:用
sudo时环境变量通常不会被带过去。不过 apt 走国内镜像源就行,本来也不需要代理
安全提醒
- 7890 和 9090 端口只在内网用,不要映射到公网
- 网页面板一定要设
secret密码