跳转到内容

虚拟化与容器

把一台物理机虚拟成许多台,有两条技术路线:虚拟机(虚拟整个硬件)与容器(共享内核、隔离视图)。本章讲硬件虚拟化、Hypervisor 类型、容器的三件套,以及两者的隔离强度与开销比较。

**虚拟机(VM)**虚拟整个硬件:CPU、内存、设备,Guest 操作系统不知道自己被虚拟。两种路线:

  • 纯软件虚拟化(早期:二进制翻译):慢,逐条翻译指令;
  • 硬件辅助虚拟化(VT-x / AMD-V):CPU 增加特权模式,Guest 内核跑在"非 root 模式",敏感指令陷入 Hypervisor——现代虚拟化的基础,性能接近裸机。

Hypervisor 类型:

  • Type 1(裸金属):直接跑在硬件上(Xen、ESXi、KVM 内置在 Linux);
  • Type 2(宿主):跑在 OS 之上(VirtualBox、Parallels)。

半虚拟化(paravirtualization):Guest 知道自己被虚拟,用超级调用(hypercall)代替陷入—— virtio 设备(网络/磁盘的半虚拟化前端)让 I/O 接近原生。

EPT/NPT(嵌套页表)让地址翻译由硬件两级完成(Guest 虚拟地址 → Guest 物理 → Host 物理),否则影子页表要软件维护、代价高昂。

容器 = 命名空间(隔离"看到什么")+ cgroups(限制"用多少")+ 联合文件系统(打包与分层)——不是虚拟化硬件,是共享内核的进程级隔离:

  • 命名空间(namespaces):PID(进程表)、NET(网络栈)、MNT(挂载点)、UTS(主机名)、IPC、USER——每个容器看到自己独立的视图;
  • cgroups:CPU、内存、I/O、pids 的配额与统计——限制资源使用;
  • 联合文件系统(overlayfs):镜像分层与写时复制——镜像只读层叠加可写层,多个容器共享同一只读层,写时才复制到自己的可写层。

容器的"启动"就是创建一组命名空间 + 启动进程——毫秒级(对比虚拟机的秒级),因为不启动内核。

虚拟机容器
隔离强度强(独立内核)弱(共享内核)
启动秒级毫秒级
密度十~百百~千
开销内存 + 转换成本几乎无
内核版本各自任意共享宿主内核

容器共享内核,隔离弱于虚拟机:内核漏洞(提权、逃逸)在容器间共享;容器逃逸是真实的攻击面(→ 内存安全与常见漏洞)。安全敏感的多租户用 VM(或 kata 等"VM + 容器接口"的混合)。

  • VM 解决了资源隔离与多租户:一台机器卖成许多台,租户互不干扰——IaaS 的基础;
  • 容器解决了部署与打包:应用 + 依赖打成一个镜像,任何装了容器运行时的机器上行为一致——PaaS 与微服务的部署单位。

两者的组合是云的默认形态:物理机上跑 VM(隔离租户),VM 里跑容器(部署应用)。Kubernetes 把容器的调度、扩缩、自愈做成平台——它假设的是容器模型(共享内核、快速启停)。

  • 硬件辅助虚拟化(VT-x)让 VM 性能接近裸机;virtio 与 EPT 是两个关键加速
  • 容器 = 命名空间(隔离视图)+ cgroups(限制资源)+ 联合文件系统(分层)
  • 容器共享内核,隔离弱于虚拟机;隔离敏感的多租户用 VM 或混合方案
  • 镜像分层与写时复制让容器启动毫秒级、存储共享
  • VM 解决多租户,容器解决部署打包;组合是云的默认形态