买 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.
对买家的含义有三条:
- 独立内核:全机虚拟化给虚拟机配一整套虚拟硬件,里面跑的是自己的内核。你可以自己换内核、编译内核、装内核模块。
- KVM 本身不是完整产品:它只是内核提供的能力,通常要配 QEMU 这类用户态程序才能跑起来。商家说「KVM 架构」,指的是用了这套方案。
- 硬件虚拟化扩展是前提: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
容器里这条命令返回的是宿主内核的版本。如果商家宣传的系统版本与你看到的内核版本明显对不上,通常就是容器方案。
以上两条命令依据官方手册整理,未在本文环境复现,具体参数以你所用系统的文档为准。
买之前该问的三件事
- 虚拟化方式写没写清:商家页面只写「KVM」或只写「OpenVZ」,都要能对应到具体套餐。含糊其辞的,按未核处理。
- 资源是上限还是独占:容器方案尤其要问清内存超限后的行为(限速、拒绝分配还是直接终止)。KVM 一般不涉及这个问题。
- 你的用途要不要碰内核:需要自己编译内核、装特定版本的 BBR 或第三方模块、在机器里再跑虚拟机——这三类需求在容器方案里做不到,选型时先排除。
反过来说,如果只是建站、跑常规服务,容器的「轻」是优点不是缺点。本站不评价商家优劣,也不认为某条路线天然更好,只看它是否匹配你的用途。
三个常见误判
误判一:把 OpenVZ 当成 KVM 的一种。 两者不在一类。KVM 给的是带独立内核的虚拟机,OpenVZ 给的是共享内核的容器,官网自己写的是 “container-based virtualization”。
误判二:以为容器型一定更快。 容器省掉了第二份内核的内存与启动开销,但网络、磁盘仍然受宿主与其他租户影响。快不快取决于宿主负载与商家配置,不是一个技术名词能保证的。
误判三:拿「1核1G」直接跨方案比价。 同一个标称在两种方案里语义不同。比价前先统一口径:是独占还是上限、有没有超出余量、带宽是独享还是共享——这些在条款里都能查到。
一句话总结
KVM 给你一台有自己的内核的虚拟机;OpenVZ 和 LXC 给你一个和宿主共用内核的容器。判断方式就一条命令 systemd-detect-virt,判断依据只看一件事:你能不能自己动内核。