跳到主要内容

Multipass 核心知识点

1. Multipass 简介

说明

Multipass 是由 Canonical (Ubuntu 背后的公司) 开发的一款轻量级虚拟机管理器。它旨在为开发者在本地 Linux、Windows 和 macOS 系统上快速、轻松地启动和管理 Ubuntu 虚拟机(称为“实例”)。主要优势在于其简洁的命令行接口和快速的实例创建、销毁能力,非常适合用于本地开发、测试环境搭建、运行隔离的应用等场景。它底层根据宿主操作系统的不同,可能使用 Hyper-V (Windows)、HyperKit (macOS)、QEMU/KVM (Linux) 或 VirtualBox (跨平台) 作为虚拟化提供者。

示例

# 查看 Multipass 版本信息
multipass version

# 查看 Multipass 后端驱动信息
multipass info

2. 安装与配置

说明

Multipass 在不同操作系统上的安装方式各异。通常在 macOS 上使用 brew, 在 Windows 上使用安装包,在 Linux 上使用 snap。首次安装后,可能需要进行一些基础配置,例如默认的 CPU、内存、磁盘大小等,但这通常在启动实例时指定更常见。

示例

# 在支持 snap 的 Linux 发行版上安装 Multipass
sudo snap install multipass
# MacOS 上使用 Homebrew
brew install multipass

# (可选) 配置默认实例规格 - 不常用,通常在 launch 时指定
# multipass set local.cpus=2
# multipass set local.memory=2G
# multipass set local.disk=10G

3. 实例生命周期管理

3.1 启动实例 (Launch)

说明

这是最核心的操作之一。multipass launch 命令用于创建并启动一个新的 Ubuntu 实例。可以指定 Ubuntu 版本、实例名称、CPU 核心数、内存大小、磁盘空间等。不指定名称会自动生成一个。

示例

# 启动一个默认的 Ubuntu LTS 实例 (自动生成名称)
multipass launch

# 启动一个指定名称、Ubuntu 22.04 镜像的实例
multipass launch --name my-vm jammy

# 启动一个自定义资源的实例 (2 CPU, 4GB RAM, 20GB Disk)
multipass launch --name resource-vm --cpus 2 --mem 4G --disk 20G

# 启动实例并执行 cloud-init 配置 (详见后续章节)
# multipass launch --name cloudinit-vm --cloud-init cloud-config.yaml

有时,我们会遇到网络问题,导致无法从官方镜像仓库下载镜像,这里有两个办法可以解决这个问题:

一个是使用国内镜像,比如腾讯的镜像源:

multipass set local.image.mirror=https://mirrors.cloud.tencent.com/ubuntu-cloud-images/

注意,截止目前,清华的镜像仓库还不支持,因为 multipass 默认是去找 release 目录的,清华的镜像仓库里没有 release 目录。 另外还有两个不太好的地方,

  1. 配置文件不明确,只能通过命令行去 set 配置
  2. 无法使用自己下载的镜像文件

3.2 列出实例 (List)

说明

multipass list 命令用于显示当前由 Multipass 管理的所有实例及其状态(如 Running, Stopped)、IP 地址等信息。

示例

# 列出所有 Multipass 实例
multipass list

3.3 查看实例详情 (Info)

说明

multipass info <instance-name> 用于获取指定实例的详细信息,包括 IP 地址、资源配置、状态、挂载点等。

示例

# 查看名为 my-vm 的实例详情
multipass info my-vm

3.4 停止实例 (Stop)

说明

multipass stop <instance-name> 用于停止正在运行的实例。实例的数据会保留,可以稍后重新启动。

示例

# 停止名为 my-vm 的实例
multipass stop my-vm

# 停止所有实例
multipass stop --all

3.5 启动已停止的实例 (Start)

说明

multipass start <instance-name> 用于启动一个之前已停止的实例。

示例

# 启动名为 my-vm 的实例
multipass start my-vm

3.6 删除实例 (Delete)

说明

multipass delete <instance-name> 用于删除一个实例。默认情况下,实例的文件系统会被标记为待删除,但并未完全清理。这允许使用 recover 命令恢复。

示例

# 删除名为 my-vm 的实例 (可恢复)
multipass delete my-vm

# 删除所有实例
multipass delete --all

3.7 彻底清除实例 (Purge)

说明

multipass purge 命令用于永久性地、不可恢复地删除那些已被 delete 命令标记为待删除的实例及其所有数据。

示例

# 彻底清除所有已删除的实例
multipass purge

3.8 恢复已删除实例 (Recover)

说明

如果实例是用 delete 删除且未被 purge 清除,可以使用 multipass recover <instance-name> 尝试恢复它。

示例

# 恢复名为 my-vm 的已删除实例 (如果还未被 purge)
multipass recover my-vm

4. 与实例交互

4.1 进入实例 Shell (Shell)

说明

multipass shell <instance-name> 是最常用的交互方式,它会直接打开一个到指定实例内部的 Shell 会话,就像 SSH 连接一样。

示例

# 进入名为 my-vm 实例的 Shell 环境
multipass shell my-vm

4.2 在实例中执行命令 (Exec)

说明

multipass exec <instance-name> -- <command> 允许在不进入 Shell 的情况下,直接在宿主机上执行指定实例内部的命令。

示例

# 在 my-vm 实例中执行 'ls -l /' 命令
multipass exec my-vm -- ls -l /

# 在 my-vm 实例中更新 apt 包列表
multipass exec my-vm -- sudo apt update

4.3 文件传输 (Transfer)

说明

multipass transfer <source> <destination> 用于在宿主机和 Multipass 实例之间传输文件或目录。路径格式为 [instance-name:]path

示例

# 将宿主机的 local-file.txt 复制到 my-vm 实例的 /home/ubuntu/ 目录下
multipass transfer local-file.txt my-vm:/home/ubuntu/

# 将 my-vm 实例的 /var/log/syslog 文件复制到宿主机的当前目录
multipass transfer my-vm:/var/log/syslog .

# 将宿主机的 local-dir 目录复制到 my-vm 实例的 /tmp/ 目录下
multipass transfer local-dir my-vm:/tmp/

5. 目录挂载 (Mount)

说明

multipass mount <host-path> <instance-name>:[instance-path] 是一个非常强大的功能,允许将宿主机的一个目录挂载到实例内部的指定路径。这使得宿主机和实例可以实时共享文件,非常适合代码开发和共享配置文件。默认挂载到实例的 /home/ubuntu/ 下与宿主目录同名的目录。

示例

# 将宿主机的 ~/projects 目录挂载到 my-vm 实例的 /home/ubuntu/projects 路径
multipass mount ~/projects my-vm

# 将宿主机的 /data 目录挂载到 my-vm 实例的 /mnt/data 路径
multipass mount /data my-vm:/mnt/data

# 查看 my-vm 的挂载点信息
multipass info my-vm

# 解除挂载 (假设挂载点是 /home/ubuntu/projects)
# multipass umount my-vm:/home/ubuntu/projects # 或者更简单的
multipass umount my-vm # 如果只有一个或想解除所有该实例的挂载

注意: 挂载的权限和用户映射可能需要关注,有时实例内访问挂载目录需要 sudo 或调整权限。

6. 镜像管理 (Find / Images)

说明

Multipass 使用基于 Ubuntu 的镜像来创建实例。multipass find 命令可以列出所有可用的远程镜像,包括不同版本的 Ubuntu 和一些特殊镜像(如带 Docker 的 Anbox Cloud appliance)。

示例

# 查找可用的远程镜像
multipass find

# (本地) 列出已下载到本地的镜像 - 不直接提供此命令,但 launch 时会自动下载
# 通常通过 `multipass launch <image>` 使用,如果本地没有会自动下载
multipass launch 20.04 # 使用 focal 镜像,如果本地没有会下载

7. Cloud-init 配置

说明

Multipass 支持使用 Cloud-init 在实例首次启动时进行自动化配置。这对于需要预装软件、添加用户、配置网络等的场景非常有用。可以通过 --cloud-init 参数传递一个 YAML 格式的配置文件。

示例

# cloud-config.yaml 文件内容示例
#cloud-config
package_update: true
package_upgrade: true
packages:
- nginx
- git
runcmd:
- echo "Hello from cloud-init!" > /tmp/cloud-init-was-here.txt
- systemctl enable --now nginx
# 使用 cloud-init 文件启动实例
multipass launch --name web-server --cloud-init cloud-config.yaml jammy

# 验证配置 (进入 shell 查看)
multipass shell web-server
# 在实例内执行:
# cat /tmp/cloud-init-was-here.txt
# systemctl status nginx
# dpkg -l | grep nginx
# exit

8. 网络

说明

每个 Multipass 实例默认会获得一个私有 IP 地址,可以通过 multipass listmultipass info 查看。宿主机通常可以直接访问这个 IP。Multipass 默认使用桥接网络(在 Linux 上可能需要配置)或 NAT 网络。更复杂的网络配置(如静态 IP、端口转发)通常不直接通过 Multipass 命令配置,可能需要调整底层虚拟化提供者的设置,或依赖 mountexec/shell 进行服务访问。对于需要从外部访问实例内服务的简单场景,有时会结合 SSH 端口转发或使用反向代理(如 Caddy, Traefik)在宿主机上实现。

示例

# 获取 my-vm 实例的 IP 地址
multipass info my-vm | grep IPv4

# (示例) 假设实例 IP 是 10.x.x.x 并且实例内运行了 web 服务在 80 端口
# 你可能可以在宿主机浏览器中直接访问 http://10.x.x.x
# (注意:网络可达性取决于具体的网络配置和防火墙规则)

9. 获取帮助 (Help)

说明

Multipass 提供了详细的命令行帮助信息。

示例

# 查看 Multipass 的全局帮助信息和可用命令
multipass help

# 查看 launch 命令的详细帮助信息
multipass help launch

10. 给 Ubuntu 换源

常规操作,这里注意不同的 Ubuntu 的换源格式不一样,24.04 是这样的路径和格式

/etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: https://mirrors.aliyun.com/ubuntu-ports/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg