买 VPS 时看到的 KVM、OpenVZ、LXC 其实是两条技术路线上的三个名字:KVM 属全机虚拟化,OpenVZ 与 LXC 属容器型虚拟化。这个区分不是名词洁癖——它直接决定你能不能换内核、能不能装内核模块、以及商家标的「1 核 1G」到底是什么含义。

两条路线的官方分法

systemd 的检测工具手册把这件事说得最干净:它能识别虚拟化技术,并且区分全机虚拟化与容器虚拟化。原文:

systemd-detect-virt detects execution in a virtualized environment. It identifies the virtualization technology and can distinguish full machine virtualization from container virtualization.

同一页列出的标识里,正好包含我们要讲的三个:kvm 被写作 “Linux KVM kernel virtual machine, in combination with QEMU”;openvz 对应 “OpenVZ/Virtuozzo”;lxc 对应 “Linux container implementation by LXC”。

所以三种方案可以这样归位:

方案 路线 内核
KVM 全机虚拟化 每台虚拟机有独立内核
OpenVZ 容器型虚拟化 与宿主共用内核
LXC 容器型虚拟化 与宿主共用内核

KVM:内核里的虚拟化模块

KVM 不是一个装在系统上的软件,而是 Linux 内核自带的虚拟化能力。内核官方文档的 KVM API 页写得非常具体:程序先 open("/dev/kvm") 拿到 kvm 子系统的句柄,再用 ioctl 在这上面创建虚拟机、虚拟 CPU 和设备。原文:

An initial open(“/dev/kvm”) obtains a handle to the kvm subsystem; this handle can be used to issue system ioctls. A KVM_CREATE_VM ioctl on this handle will create a VM file descriptor which can be used to issue VM ioctls.

对买家的含义有三条:

  1. 独立内核:全机虚拟化给虚拟机配一整套虚拟硬件,里面跑的是自己的内核。你可以自己换内核、编译内核、装内核模块。
  2. KVM 本身不是完整产品:它只是内核提供的能力,通常要配 QEMU 这类用户态程序才能跑起来。商家说「KVM 架构」,指的是用了这套方案。
  3. 硬件虚拟化扩展是前提:KVM 依赖 CPU 的虚拟化指令集。这一条决定了老机器、以及部分被关闭虚拟化功能的宿主环境跑不了 KVM。

商业 VPS 通常再加一层管理程序(如 SolusVM、Virtualizor)来切分资源,但底下的虚拟化方式仍是 KVM。

OpenVZ:容器型,官网自己就这么定义

OpenVZ 官网的页面标题就是一句定义:“Open source container-based virtualization for Linux.” 首页正文里还有两句关键原文:

OpenVZ allows multiple secure, isolated Linux containers (also known as virtual private servers or virtual environments) to run on a single physical server.

By sharing system resources dynamically among containers, OpenVZ optimizes the usage of CPU, memory, and storage.

第一句值得单独拎出来:官网把 container 直接等同于 virtual private server。也就是说,你在 OpenVZ 商家那里买到的「VPS」,本质是一个容器,不是一台拥有独立内核的虚拟机。

第二句解释了它为什么便宜:CPU、内存、存储都是动态共享的。商家卖给你的「内存」通常是上限而非独占,短时超出上限是否允许、超出后是限速还是被杀进程,各家配置不同,只能看具体条款。

LXC:内核隔离特性的用户态接口

LXC 官方介绍页的定义是:

LXC is a userspace interface for the Linux kernel containment features.

同一页还有一句更直观的比喻:

LXC containers are often considered as something in the middle between a chroot and a full fledged virtual machine.

它用到的是内核现成的隔离机制,官方页面列出的是:kernel namespaces(ipc、uts、mount、pid、network、user)、AppArmor 与 SELinux 策略、seccomp 策略、chroot(pivot_root)、kernel capabilities、cgroups。

这串清单说明一件事:LXC 的所有隔离手段都来自宿主内核,它不虚拟出一套新硬件,也没有第二份内核。所以它启动快、开销小,但内核层面的一切(版本、模块、部分可调参数)都由宿主决定。

和 OpenVZ 的关系别搞混:LXC 由 linuxcontainers.org 维护,OpenVZ 官网写明由 Virtuozzo 开发、并作为其商业产品的基础。两者都是容器路线,但不是同一个项目,也不是新旧版本。

对照:对使用到底有什么影响

事项 KVM OpenVZ / LXC
能否更换内核 可以,虚拟机有自己的内核 不能,内核由宿主统一提供
能否装内核模块 可以 不能,模块只能在宿主加载
内存语义 划给虚拟机,由虚拟机内核管理 宿主内核统一调度,常见上限制
嵌套虚拟化(虚拟机里再跑虚拟机) 视宿主配置 基本不具备
启动速度与开销 相对重 相对轻
隔离层级 硬件虚拟化边界 共享内核的内核隔离机制

这张表里唯一需要额外解释的是最后一行。LXC 官方那句「介于 chroot 与完整虚拟机之间」已经把定位说清楚了:容器的隔离比 chroot 强,但边界仍是同一个内核,而不是 KVM 那样的硬件虚拟化边界。

怎么核对自己手上这台

最直接的办法是用 systemd 自带的检测命令:

systemd-detect-virt

它会输出一个短标识,kvm / openvz / lxc 分别对应上面三种方案。想看得更详细可以加 --vm 或 --container 参数,只判断是否属于某一类。

没有 systemd 的环境,退一步用:

uname -r

容器里这条命令返回的是宿主内核的版本。如果商家宣传的系统版本与你看到的内核版本明显对不上,通常就是容器方案。

以上两条命令依据官方手册整理,未在本文环境复现,具体参数以你所用系统的文档为准。

买之前该问的三件事

  1. 虚拟化方式写没写清:商家页面只写「KVM」或只写「OpenVZ」,都要能对应到具体套餐。含糊其辞的,按未核处理。
  2. 资源是上限还是独占:容器方案尤其要问清内存超限后的行为(限速、拒绝分配还是直接终止)。KVM 一般不涉及这个问题。
  3. 你的用途要不要碰内核:需要自己编译内核、装特定版本的 BBR 或第三方模块、在机器里再跑虚拟机——这三类需求在容器方案里做不到,选型时先排除。

反过来说,如果只是建站、跑常规服务,容器的「轻」是优点不是缺点。本站不评价商家优劣,也不认为某条路线天然更好,只看它是否匹配你的用途。

三个常见误判

误判一:把 OpenVZ 当成 KVM 的一种。 两者不在一类。KVM 给的是带独立内核的虚拟机,OpenVZ 给的是共享内核的容器,官网自己写的是 “container-based virtualization”。

误判二:以为容器型一定更快。 容器省掉了第二份内核的内存与启动开销,但网络、磁盘仍然受宿主与其他租户影响。快不快取决于宿主负载与商家配置,不是一个技术名词能保证的。

误判三:拿「1核1G」直接跨方案比价。 同一个标称在两种方案里语义不同。比价前先统一口径:是独占还是上限、有没有超出余量、带宽是独享还是共享——这些在条款里都能查到。

一句话总结

KVM 给你一台有自己的内核的虚拟机;OpenVZ 和 LXC 给你一个和宿主共用内核的容器。判断方式就一条命令 systemd-detect-virt,判断依据只看一件事:你能不能自己动内核。