·约 8 分钟阅读·DeepSeek

Proxmox 与纯 Linux 之争:家庭实验室里,诚实胜过吹捧

Proxmox 与纯 Linux 不是信仰之战。本文讲清楚:家庭实验室里的虚拟机管理器(homelab hypervisor)到底能买到什么,代价是额外的补丁、内存胃口和仍需自己配置的备份,何时该用哪一边,以及用 systemd-nspawn、podman 加可靠备份的务实中间路线。

self-hostinghomelabdevops

每隔几个月,就会有人问我:家庭实验室到底该上 Proxmox,还是干脆装个 Linux 完事?这个问题通常被包装成「Proxmox 与纯 Linux」的对决,而网上的答案又往往被讲成一场信仰之战。我认为这个框架本身就错了。**虚拟机管理器(homelab hypervisor)**是一件有特定形状的工具:它用多一层的复杂度,换来快照、生命周期管理和隔离。这笔交易值不值,完全取决于你在上面跑什么,而不是你加入了哪个阵营。

两种我都跑过。我跑过一台挂着一堆 guest 的 Proxmox,也把同样的负载当成普通的 systemd 服务跑在一台主机上。两边都能用,两边都不神奇。下面是不带滤镜的版本——不把虚拟化当成一种身份。

一个家庭实验室虚拟机管理器到底能买到什么

先把 Proxmox 该得的分给它,因为它的好处是真实的,而贬低它的人,往往是在为错误的目标做优化。

  • 快照。 这是招牌功能。一次冒险的升级之前先打个快照,搞坏了,几秒钟回滚。在纯 Linux 上你也能做,但你得在装机时就先定好存储布局(ZFS 或 LVM-thin),并且回滚流程得自己扛。Proxmox 给你的不只是按钮,更是一个习惯。
  • 轻松的虚拟机与容器生命周期。 建一台 VM 或一个 LXC 容器就是点几下。从模板克隆、设定资源、挂到网络桥——都在一处完成。在纯 Linux 上,这些要用 qemu-system、systemd-nspawn、debootstrap 和你自己写的脚本拼出来。更透明,也更多手工。
  • 隔离。 每个 guest 有自己的内核(虚拟机)或独立命名空间的用户态(容器)。一个被攻陷的服务不会轻易够到另一个。而在单台纯 Linux 主机上,一个坏掉的服务就挨着你的数据运行,权限完全取决于你当时怎么给的。
  • 一个界面。 这个 Web 界面在处理那些枯燥环节时确实有用:SSH 挂了还能开控制台、一张粗略的资源图、一份备份计划列表、晚上十一点能点一下「启动」的地方。这些在纯 Linux 上你靠 SSH 和 systemd 也能做到,但不是收在同一个面板里。

把这些东西合在一起看,才是一个 hypervisor 存在的意义。如果你看重这一整套,它就值这个价。

纯 Linux + systemd + 容器又能给你什么

另一边并不是「什么都没有」,而是另一组完全不同的好处:

  • 简单。 你和机器之间没有抽象层。systemctl status、journalctl -u、ss -ltnp,你就什么都清楚了。没有集群文件系统的怪毛病,没有要装的 guest agent,也没有「为什么 Web 界面显示的磁盘不对」。
  • 没有额外的一层。 每个 guest 都要为自己的用户态吃掉 CPU 和内存。在一台小家庭实验室机器上,这份开销占预算里相当可观的一块。纯 Linux 只有一个内核。
  • 直接访问。 挂载存储、改内核参数、临时丢个调试二进制进去、在物理网卡上跑 tcpdump——全都是立刻生效。而在 hypervisor 上,你偶尔得先问「这是宿主机的问题还是 guest 的问题」,而这个问题是要花时间的。
  • 更小的补丁面。 每周只更新一个系统,而不是一个宿主机加上 N 个 guest。工作量不是零,但更少。

这和我在不用 Docker 的自托管里给出的论证是同一条:对于少数稳定的服务来说,操作系统本身就是那个编排器,在它上面再加一层控制面,往往是一笔再也收不回来的税。

Proxmox 的真实代价

这是吹捧会跳过的部分。Proxmox 并不免费,它的代价是:

  • 又多了一个要打补丁的东西。 它是一个基于 Debian 的发行版,有自己的软件包、自己的内核、自己的 Web 技术栈。这等于在每个 guest 的更新节奏之外,再加一条更新节奏。一旦你跳过它,局域网里就多了一个没打补丁、还开着监听的管理界面。
  • ZFS 的内存胃口。 常见建议是给 ARC 留一块内存,而 ZFS 去重是个陷阱,会吃掉你本该留给实际 guest 的内存。在一台内存不宽裕的机器上,选那个「看起来更高级」的文件系统,其实是在悄悄少跑一个 guest。这是真实的工程取舍,不是免费升级。
  • 仍然要自己配置的备份。 快照按钮不是备份。快照和你保护的东西睡在同一个池子里,一块盘坏了,两个一起没。你依然得配一个真正的备份任务,最好落到另一台设备上,并且验证它确实能恢复。Proxmox 让这件事更省事,而不是自动完成。我在能够恢复的备份里那条规则依旧成立:没验证过的备份是希望,不是备份。
  • 把所有东西都虚拟化的倾向。 一旦有了 hypervisor,每件小事都会变成一个 guest。一个小小的定时任务要开个容器,一个静态站点要开台虚拟机。最后你维护着十个迷你操作系统,明明一个就够;而机器把资源花在了那一层上,而不是花在真正的工作上。

最后一条是最隐蔽的代价,它是文化层面的,而非技术层面的。

Proxmox 与纯 Linux:一张决策表

我实际就是这样做决定的。找到和你情况相符的那一行。

你的情况Proxmox纯 Linux + systemd + 容器
很多你爱折腾、经常搞坏的服务更好:快照、回滚、再来一次痛苦:你得手工重建
少数几个稳定的服务过于重:你为一个用不上的层付费更好:单内核、直接控制
想学 hypervisor/搭实验环境更好:这正是目的不是目标
小机器、内存紧张有风险:ZFS + 每个 guest 的开销更好:一点都不浪费
需要在多租户之间强隔离更好:VM 之间内核独立较弱:容器共享内核
讨厌多出来的补丁通道更糟:宿主机加上每个 guest更好:一个系统要更新
Windows 与 Linux 混合负载更好:VM 是天然归宿别扭
一个博客、几个 API、一些定时器过于重更好

如果你的大多数行都落在同一侧,决定其实已经做完了。真正的陷阱,是去选那个听起来更专业的一栏,而不是匹配你实际工作的那一栏。

务实的中间路线

你不必在「裸机上毫无隔离」和「一套完整的 hypervisor」之间二选一。中间路线是一台纯 Linux 宿主机,用系统自带的工具,仍然拿到大家真正想要的大部分虚拟化能力。

对于系统容器——也就是 LXC 那一类场景——你有内建于 systemd 的 systemd-nspawn。它给你一个拥有独立文件系统与进程命名空间的容器,像普通单元一样被启动和守护:

# /etc/systemd/nspawn/notes.nspawn
[Exec]
Boot=on
PrivateUsers=pick
[Network]
Private=yes
VirtualEthernet=yes
# 用 debootstrap 造一个 Debian 容器,然后运行它
sudo debootstrap --include=systemd,iproute2 stable /var/lib/machines/notes \
  http://deb.debian.org/debian
sudo systemctl start systemd-nspawn@notes
sudo machinectl shell notes        # 像进 VM 控制台一样进去

对于应用容器,podman 无需守护进程就能跑 OCI 镜像,配合 rootless 模式,它是一条相当合理的单服务隔离边界:

podman run -d --name wiki --restart=always \
  -p 127.0.0.1:8080:8080 \
  -v /srv/wiki/data:/data:Z \
  docker.io/requarks/wiki:2
podman generate systemd --new --files --name wiki   # 交给 systemd 守护

快照和备份也不需要 hypervisor。如果你的根池是 ZFS,zfs snapshot 加 zfs send | zfs receive 就能给你原子、可验证的副本。如果不是,restic 或 borg 备份到另一台机器,同样能做到去重和加密。

所以中间路线就是:一台宿主机,需要独立用户态的东西交给 systemd-nspawn,第三方镜像交给 podman,再配一个你真正恢复过的备份任务。该要隔离和轻松回滚的服务得到它们,不需要的服务则不背那份额外开销。

这也正是我自托管的那些东西的跑法:少数几个无聊的服务,直接由 systemd 守护,备份是验证过的,而不是想当然的。

虚拟化是工具,不是人设

诚实的总结:当你要跑很多东西、经常把它们搞坏、又希望生命周期和快照机制收在一处时,用 Proxmox。当你只有少数几个稳定服务,并且比起一个控制面板更看重直接访问和更小的补丁面时,用纯 Linux。

两种选择都不会让你变成更厉害的工程师。那个为了显得认真而把一切虚拟化的人,和那个为了原则而拒绝任何抽象的人,错得一样多。把工具对上工作,让备份保持真实,别为了一个你根本不存在的难题,去加一台 hypervisor。