“VPS”这个词,在不同服务商那里指的是三种截然不同的东西:拥有独立内核的 KVM 虚拟机,与宿主机共享内核的 LXC 容器,或者出自一条比前两者都更古老的技术路线的 OpenVZ 容器。价目表上很少会写明到底是哪一种。我们只销售 KVM,本文会说明另外两种放弃了什么、在哪些方面确实更好,以及如何判断您买到的是哪一种。
切分一台宿主机的三种方式
KVM 是硬件虚拟化。宿主机运行 hypervisor;每个客户机在虚拟硬件上启动自己的内核,拥有专属的内存页,虚拟 CPU 映射到真实的物理核心上。客户机看不到宿主机和其他客户机,宿主机在没有客户机配合的情况下,也看不到客户机内部。
LXC(以及 Proxmox 和 LXD 下的同类方案)属于操作系统级虚拟化。所有容器共享宿主机的内核,并通过 namespace 和 cgroup 相互隔离。它更轻量,一秒钟就能启动,而且由于容器只占用自己实际用到的内存,宿主机可以在用户无感知的情况下超售内存。
OpenVZ 的思路与之相同,只不过用的是更老、打了大量补丁的内核,并配有自己的一套工具;它的现代继任者是 Virtuozzo。如今它在市场最底端依然很常见,因为与其他任何方案相比,它能让一台宿主机塞进更多的容器。
在容器里您会失去什么
- 属于您自己的内核。不能用自定义内核,不能加载内核模块,宿主机不允许的 sysctl 参数也改不了。WireGuard、ZFS、使用某些存储驱动的 Docker、nftables 的部分特性,以及一切标明“需要 6.x 内核”的软件,都取决于宿主机运行的内核,而那往往已经是好几年前的版本。
- 货真价实的内存。容器的内存只是对共享内存池设置的一个 cgroup 上限。服务商完全可以、也确实会卖出比宿主机实际拥有的更多的内存,赌的是不会每个人都把自己的那份用满。赌输的时候,您的进程会被一次与您无关的 OOM 杀掉。
- 不打折扣的 Docker。嵌套容器需要特权标志或 user namespace 的变通手法,而许多宿主机会禁用这些。在 KVM 上,Docker 的运行方式与在您的笔记本电脑上完全一样。
- 隔离性。宿主机上的一个内核漏洞,就是其上每一个容器的漏洞。KVM 客户机的攻击面是虚拟硬件,范围更小,也经过了更充分的审计。
- Swap、文件系统和挂载。宿主机给容器什么,容器就只能用什么。您无法分区,无法使用其他文件系统,也无法挂载镜像。
容器确实更有优势的地方
密度与成本。一台宿主机如果运行 200 个 LXC 容器,而不是 40 个 KVM 客户机,就可以只收五分之一的价格;对于 95% 的时间都处于空闲的负载,比如静态站点、小型机器人、个人代理,这样的价格是公道的。启动只要一秒,而不是二十秒。内存开销几乎为零,所以“512 MB”的容器真有 512 MB 留给您的应用,而 KVM 客户机要拿出 100 MB 给自己的内核。
问题出在负载并不空闲的时候,或者服务商指望负载空闲、而它偏偏并不空闲的时候。主机论坛里满是对“steal time”和“随机 OOM 查杀”的抱怨,几乎全部来自被超售的容器。
我们的 VPS 套餐是什么
- 运行在 Linux 宿主机上的 KVM:宿主机内核由我们掌控,客户机内核由您掌控。
- 内存是独占的:一台宿主机上所有客户机的内存总和,永远不会超过宿主机的物理内存。不使用 balloon 驱动,也没有靠 swap 撑起来的客户机。
- vCPU 是物理核心的份额,由公平调度器调度;套餐里的 vCPU 数量就是您能获得的并行度,并且允许所有 vCPU 持续 100% 满载运行。
- 磁盘是每个客户机独立的 NVMe 额度,公布在价格页面上,由 hypervisor 强制执行,未使用的容量会归还到资源池。
- 磁盘和网络使用 virtio 驱动;采用 UEFI 启动,支持任意发行版,并可通过控制台使用自定义 ISO。
这样做的结果是,本博客教程里的所有内容,从 WireGuard 中心节点到 Docker Compose 栈再到 ZFS,都不用事先问过我们就能正常使用。下单表单里之所以有自定义 ISO 选项,正是因为这是一台真正的虚拟机。
如何判断您买到的是哪一种
如果价目表上没有写明,可以在服务器里运行下面这些命令之一:
systemd-detect-virt # kvm | lxc | openvz | none
cat /proc/1/environ | tr '\0' '\n' | grep -i container
uname -r # a 2.6 or 3.x kernel in 2025 means OpenVZ
ls /dev/kvm /boot/vmlinuz* 2>/dev/null # present on KVM, absent in containers
在我们的任何一台服务器上,systemd-detect-virt 都会输出 kvm,而 uname -r 输出的则是您的发行版所安装的内核版本,因为内核是属于您的。
坦诚小结
| KVM | LXC | OpenVZ | |
|---|---|---|---|
| 独立内核、模块、sysctl | 是 | 否 | 否 |
| 开箱即用的 Docker、WireGuard、ZFS | 是 | 有时可以 | 很少可以 |
| 宿主机可以超售内存 | 只有借助 balloon 才行,而我们不使用 | 很容易 | 设计上就如此 |
| 启动时间 | 10 到 20 s | ~1 s | ~1 s |
| 每个客户机的内核开销 | ~100 MB | ~0 | ~0 |
| 持续负载下是否公平 | 是 | 取决于宿主机 | 通常不行 |
如果只是一台大部分时间闲置的业余小机器,运营良好的 LXC 宿主机是笔不错的买卖。而对于任何丢了会让您心疼的东西,一台内存真正属于您的虚拟机,值得多花那一美元,这也是我们卖的最便宜的套餐依然是 KVM 的原因。
