← 全部笔记

Linux 入门 · 10 虚拟机与沙箱

虚拟机给你一台
有自己内核的机器

虚拟机(Virtual Machine,VM)把 CPU、内存、磁盘和网卡呈现成一台机器,供里面的操作系统使用。你可以单独启动它的客户机内核,而容器通常共享运行它的那台 Linux 的内核。

约 15 分钟 · 截至 2026-11-06,Ubuntu 26.04 LTS · Multipass 实验未实测

两台客户机拥有各自的内核,共用一台物理宿主机 应用向各自的客户机内核请求服务。客户机内核看到的是虚拟 CPU、内存、磁盘和网卡。Hypervisor 管理这些虚拟资源和实际硬件之间的关系。 应用、Shell 与依赖 客户机内核 A 虚拟 CPU · 内存 · 磁盘 · 网卡 应用、Shell 与依赖 客户机内核 B 虚拟 CPU · 内存 · 磁盘 · 网卡 Hypervisor · 管理虚拟资源并对接物理资源 宿主机 · 物理 CPU、内存、磁盘、网卡 重启 A 的内核B 可以继续运行 读图:上层请求下层提供资源 客户机 A · Ubuntu应用 →客户机内核 A虚拟 CPU、内存、磁盘、网卡 客户机 B · 另一套系统应用 →客户机内核 B虚拟 CPU、内存、磁盘、网卡 Hypervisor · 管理与对接资源 宿主机 · 物理硬件
  • 宿主机承载虚拟机的一侧
  • 客户机自己的系统与内核
  • 虚拟化机制提供并管理虚拟资源
图 1 虚拟机把边界放在客户机内核之下;每台客户机可以独立启动,仍共用物理资源。

学完你能

内核边界

虚拟机把一套操作系统一起隔开

你在上一页的隔离层次已经见过不同边界。现在把一整套 Ubuntu 26.04 放进虚拟机:里面有自己的用户、目录、服务和客户机内核。这样你可以练习系统启动、内核更换或系统配置,同时让其他项目留在另一台机器里。

Hypervisor(虚拟机监控器)是创建和运行虚拟机的底层软件机制。它把物理资源呈现给客户机,并控制客户机如何使用这些资源。客户机看到的磁盘通常由宿主机上的磁盘镜像文件承载;“独立机器”不代表你又添了一块实体硬盘。

容器则把应用和用户态依赖放进隔开的环境,普通 Linux 容器仍调用承载它的 Linux 内核。因此,容器镜像里写着 Ubuntu 26.04,不能据此断定运行的内核就是该发行版的内核。这个区别决定了哪些实验需要虚拟机。[1]

客户机 A 与 B 在同一台宿主机上。你只让 A 重启它自己的操作系统,哪项符合图 1 的结构?

A、B 各有客户机内核,重启 A 不要求重启 B。两者仍依赖同一宿主机;宿主机停机或资源不足可以同时影响它们。独立的客户机生命周期,与独享一台物理机是两回事。

虚拟化分工

KVM 与 QEMU 合作提供一台虚拟机

Type 1 与 Type 2 描述 Hypervisor 放在哪里:Type 1 直接在硬件上承担资源管理;Type 2 作为已有宿主操作系统上的程序运行。两种结构都能运行拥有自己内核的客户机,分类不表示客户机“完整程度”不同。[2]

Type 1 · 裸机型

客户机 · 含自己的内核 使用资源 Hypervisor 管理硬件 物理硬件

Type 2 · 托管型

客户机 · 含自己的内核 Hypervisor 程序 宿主操作系统 · 提供硬件服务 物理硬件
图 2 两类 Hypervisor 的部署位置不同,客户机都拥有自己的内核。

在 Linux 上,KVM(Kernel-based Virtual Machine,基于内核的虚拟机机制)借助 CPU 的硬件虚拟化支持来执行客户机代码。QEMU则在宿主用户态组织整台虚拟机器,提供磁盘、网卡等设备模型,并调用 KVM 加速。两者分工合作,所以经常写成“QEMU/KVM”。[3]

Linux 宿主机 客户机应用 + 客户机内核 看到虚拟 CPU、磁盘、网卡 QEMU · 宿主用户态程序 请求虚拟化 /dev/kvm 宿主 Linux 内核 · 含 KVM ↓ 硬件虚拟化支持

操作入口在更上面

你不必手写 QEMU 的整套设备参数。Multipass负责准备 Ubuntu 镜像、创建实例并提供登录入口;截至本页日期,它在 Linux 上使用 QEMU 驱动。[4]

另一个常见管理栈是 libvirt(管理虚拟机的接口与服务)配 virt-manager(图形管理界面)。这些名字属于管理入口,KVM/QEMU 属于运行虚拟机的机制,不能当成同一层的替代品。

/dev/kvm 是用户态程序访问 KVM 的设备接口。它位于宿主机;本页不要求你记住接口调用细节。[5]

图 3 QEMU 在宿主用户态提供机器模型,KVM 在宿主内核里提供硬件虚拟化能力;客户机内核仍是另一套。
深入一点:QEMU 不用 KVM 也能运行吗?

可以。QEMU 的 TCG(Tiny Code Generator)通过软件翻译执行客户机指令,也能模拟不同 CPU 架构。KVM 加速则需要适合的 CPU、内核支持及访问权限;硬件虚拟化不等于自动跨架构。如果当前已经在云端 VM 里,再启动 KVM 客户机还需要平台开放“嵌套虚拟化”,即虚拟机里再运行虚拟机。[3] [6]

客户机要用虚拟网卡。填出这条分工链中的工具名。

在宿主用户态提供设备模型的是 ;位于宿主 Linux 内核、提供硬件虚拟化加速的是 。

QEMU 组织虚拟机器和设备,KVM 提供内核侧的虚拟化能力。客户机的内核使用这台虚拟机器;Multipass 则替你管理创建与连接等操作。

你从 Linux 桌面打开 virt-manager 启动一台 QEMU/KVM 虚拟机。哪句话正确?

分类看 Hypervisor 的位置,不能用有没有窗口判断。KVM 位于宿主内核。

这是普通 Linux 容器的内核关系;VM 里启动的是另一套客户机内核。

管理界面、用户态设备模型、内核虚拟化机制各司其职。用 GUI 或命令行启动,不会把客户机内核变成宿主内核。

一个 Ubuntu 范例

Multipass 把建机流程收进一条命令

Multipass 是 Canonical 提供的 Ubuntu 虚拟机管理工具,适合快速取得一套可丢弃、可重建的 Ubuntu 环境。它把下载镜像、配置虚拟硬件和启动系统串起来,之后你仍然是在操作一台有自己内核的客户机。[7]

实验边界

本轮环境无法运行 Multipass,以下命令未实测,按官方文档列出。创建实例会下载镜像并占用宿主资源;若要继续练习安装软件或改系统配置,建议在虚拟机或容器里试,本节使用新建的 lab-vm 客户机。

multipass launch 26.04 --name lab-vm
multipass info lab-vm
multipass exec lab-vm -- cat /etc/os-release
multipass exec lab-vm -- uname -r

第一行指定发行版和实例名,避免依赖会变化的默认镜像。第二行查看实例状态、发行版、地址等信息;第三行读取客户机的发行版标识;第四行读取客户机正在运行的内核版本。观察 info 的 Release 与 os-release 是否对应 Ubuntu 26.04;不用预设 IP、内核版本号或资源用量。

宿主机终端 → Multipass 选择 Ubuntu 26.04 镜像 准备 lab-vm 的虚拟磁盘 后端配置虚拟 CPU、内存与网卡 启动客户机内核与用户态 exec / shell 进入客户机执行 stop:停止客户机,保留磁盘
  1. launch 26.04 选择发行镜像,首次使用时需要下载。猜猜:有镜像后,是否已经有正在运行的内核?
  2. 还没有。先为 lab-vm 准备它自己的可写虚拟磁盘;镜像是起点,实例磁盘承接之后的改动。
  3. Multipass 通过后端准备虚拟硬件。在 Linux 上这里由 QEMU/KVM 承担运行机制。
  4. 客户机内核启动,再带起服务和用户态环境;launch 还要等待实例初始化就绪。猜猜:接下来 exec 里的 uname 查询哪一侧?
  5. exec lab-vm -- uname -r 查询客户机内核;shell lab-vm 打开客户机里的交互 Shell。
  6. stop lab-vm 让客户机停机,磁盘保留。下一次 start lab-vm 继续使用这个实例。
图 4 镜像、虚拟磁盘与运行中的客户机是不同对象;退出 Shell 不等于关闭虚拟机。
multipass shell lab-vm
# 现在位于客户机;exit 只退出这个 Shell
exit
# 回到宿主机后,明确停止实例
multipass stop lab-vm
multipass list

list 用来核对实例已停止。需要继续时,在宿主机运行 multipass start lab-vm。本节停在“保留实验磁盘”的状态;若确认不再需要,可按官方的删除与清理指南释放实例数据。

不要执行命令,只按位置填空:multipass exec lab-vm -- uname -r 这一行发起于哪一侧,查询哪一侧?

发起于 ,查询 的内核。

Multipass 客户端在宿主机发送请求,-- 后的命令在指定客户机内执行。Shell 的位置和被查询内核的位置可以不同。

日常平台的剖面

WSL2 与 Docker Desktop 把虚拟机藏在工具后面

WSL2(Windows Subsystem for Linux 2)让你在 Windows 上使用 Linux 环境。它在受管理的轻量虚拟机里运行真正的 Linux 内核;Ubuntu、Debian 等发行版的用户态环境在里面隔开,通常共享这套内核。不要把每个 WSL2 发行版都数成一台独立内核的虚拟机。[8]

macOS 的内核不能直接提供 Linux 容器需要的接口,所以 macOS 上的 Docker Desktop在 Linux 虚拟机里运行容器。容器共享的是那套客户机 Linux 内核,不是 macOS 内核。具体虚拟机后端随平台和版本变化,结构上的这层 Linux VM 不应被省略。[9]

你在云服务器里租用的普通云实例通常也是虚拟机,只是物理硬件和 Hypervisor 由提供商管理。比如 EC2 提供虚拟服务器实例;云上也有裸金属产品,所以“在云上”本身不能保证一定是 VM。判断时看实例类型。[10]

先猜再切换:从 macOS Docker Desktop 换成 Linux 上直接安装的 Docker Engine,哪一层可以消失?用下面的剖面对照你的答案。

macOS Docker Desktop 的 Linux 虚拟机容器调用虚拟机里的 Linux 内核,下面是虚拟硬件和 macOS 宿主机。 受管理的 Linux 虚拟机 容器 A 的进程 · 容器 B 的进程 客户机 Linux 内核 虚拟 CPU、内存、磁盘、网卡 虚拟化后端 · 对接物理资源 macOS 宿主机 · 物理资源

容器共享 VM 里的 Linux 内核

macOS 提供宿主环境,Linux VM 提供容器所需的 Linux 内核。多个容器可以共用这一个客户机内核,虚拟机与容器在这里叠在一起。

无脚本时:本图显示 macOS Docker Desktop。Linux Docker Engine 可直接共用宿主内核;WSL2 的发行版共享受管理 VM 的 Linux 内核;普通云 VM 有自己的客户机内核,底层由提供商维护。

图 5 沿程序往下找它实际调用的内核,就能看出虚拟机和容器有没有叠在一起。

按“这些程序调用哪套内核”分类。这里的 Linux Docker Engine 直接装在宿主 Linux 上。

  • macOS Docker Desktop 中的 Linux 容器
  • Linux Docker Engine 中的普通容器
  • WSL2 的 Ubuntu 用户态程序
  • 普通 Ubuntu 云 VM 中的 Shell
宿主 Linux 内核
VM 中的 Linux 内核

“共享内核”要说清共享的是谁的内核。容器在 VM 内时,共享那台 VM 的 Linux 内核;它与物理宿主机之间仍有一层虚拟化边界。

选择与回顾

需要独立内核时,选择虚拟机

先问环境需要隔开到哪里,再选工具。要试一套系统的启动、内核与系统服务,或者在同一台电脑上运行另一种操作系统,虚拟机通常合适。只想让项目拥有清楚的依赖、目录与进程边界,容器往往更轻便,也更容易批量重建。

容器 · 隔开用户态环境

项目 A 进程项目 B 进程 调用同一个内核 承载容器的 Linux 内核

虚拟机 · 隔开到客户机内核

项目 A 进程项目 B 进程 客户机内核 A客户机内核 B 分别使用虚拟硬件,底层仍共享物理资源
图 6 独立内核换来更完整的系统边界,也增加系统启动、内存、磁盘和维护成本。

虚拟机多维护一套操作系统,通常比容器需要更多资源;具体快慢取决于工作负载和配置,不用记一个固定比例。虚拟机也不保证环境自动可复现:镜像版本、初始化步骤、数据与凭据的来源仍需记录,可联系环境为什么难以复制来理解。共享目录打开后,两侧会有明确的数据通道。

你和 agent 要并行准备两个环境:一个实验 Ubuntu 内核更新与重启,一个只验证 Python 项目依赖。分别选什么,为什么?

内核实验选 VM,让实验拥有独立的客户机内核与启动过程;Python 依赖实验可以选容器,为应用提供单独的用户态依赖。若后者也要求独立的内核边界,再放进另一台 VM。资源和共享目录按任务明确分配。

  • 把“需要独立内核”作为第一个环境选 VM 的原因
  • 把“用户态依赖边界”作为第二个环境可选容器的原因
  • 说明资源与共享接口仍需安排

你想在 macOS 上验证 Ubuntu 26.04 的内核更新与重启过程。哪个方案最符合目标?

Desktop 里有 Linux VM,但普通容器共用那台 VM 的内核;容器发行版标签不能为它创建独立内核。

目录边界可以组织文件,不能启动另一套内核。

你要验证的是内核与系统启动过程,所以需要能管理这套内核的 Ubuntu VM。容器适合打包用户态环境,不能把容器镜像标签当作客户机内核版本。

下一页继续往内核里看:容器隔离的原理会解释共享一个 Linux 内核时,进程视图、资源与权限怎样分别受到约束。

本页结构与操作依据以下官方资料

核对日期:2026-11-06。命令示例面向 Ubuntu 26.04 LTS。图中对象为结构说明,不代表实测配置、地址或性能。

  1. Ubuntu Server:Virtualisation and containers;Docker:What is a container? — 虚拟机、容器与内核边界。
  2. Red Hat:What is a hypervisor? — Type 1、Type 2 与 KVM 的定位。
  3. QEMU:System emulation introduction — 机器模型、KVM/TCG 加速方式、libvirt 管理入口。
  4. Multipass:Driver — Linux 的 QEMU 后端。
  5. Linux Kernel:KVM API,General description — 宿主用户态通过 /dev/kvm 创建与控制 VM。
  6. Linux Kernel:Running nested guests with KVM — 嵌套虚拟化的层次。
  7. Ubuntu Server:How to create a VM with Multipass — 26.04 镜像、launch、info、exec、shell、stop/start;另见 launch 参数与初始化、stop。
  8. Microsoft:What is WSL? — WSL2 VM、Linux 内核及发行版环境;另见 WSL 版本比较、WSL2 与 Hyper-V。
  9. Docker:Virtual Machine Manager — Desktop 的 Linux VM 与平台后端;另见 Docker Engine。
  10. AWS:What is Amazon EC2? — 云虚拟服务器;EC2 documentation overview — 包含 Bare Metal 裸金属实例的产品范围。