Multipass 核心知识点
- 官方文档: https://documentation.ubuntu.com/multipass/en/latest/
- 系统: 跨平台,我的环境是 MacOS Arm64
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 目录。 另外还有两个不太好的地方,
- 配置文件不明确,只能通过命令行去 set 配置
- 无法使用自己下载的镜像文件
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 list
或 multipass info
查看。宿主机通常可以直接访问这个 IP。Multipass 默认使用桥接网络(在 Linux 上可能需要配置)或 NAT 网络。更复杂的网络配置(如静态 IP、端口转发)通常不直接通过 Multipass 命令配置,可能需要调整底层虚拟化提供者的设置,或依赖 mount
和 exec
/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 是这样的路径和格式
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