虚拟机管理工具 multipass 使用笔记


Multipass 是一个轻量级的虚拟机管理器(VM),可能是开发人员启动虚拟机的理想方式。支持 Linux、MacOS 或 Windows,支持 cloud-init 元数据,它允许用户通过单个命令启动全新的 Ubuntu 环境,可用于模拟小型云部署。

我用这个工具来快速启动一个 Ubuntu 系统,这比连到国外机器速度快的多,随时创建销毁,也方便的多。

基本命令

启动

# 获取最新的 Ubuntu LTS 版本
$ multipass launch --name foo

# focal 指代 Ubuntu 20.04 LTS 版本
$ multipass launch --name foo --memory 512M --timeout 3600 focal

--timeout 指代命令最长运行时间,3600 即一个小时

运行命令

$ multipass exec foo -- lsb_release -a

登入实例(交互式执行命令)

$ multipass shell foo

查看实例

$ multipass list

启动停止实例

# 停止
$ multipass stop foo bar

# 启动
$ multipass start foo

删除、恢复、永久删除实例

# 删除
$ multipass delete bar

# 恢复
$ multipass recover bar

# 对已删除的实例永久删除
$ multipass purge

查看所有支持的镜像

$ multipass find

通过 multipass shell 命令即可进入容器实例,如如果你仍想通过 SSH 免密登陆,方法如下:

通过 SSH 登录进实例(方式一)

这种方式适用于已启动的容器实例

首先获取本机的公钥,一般名为 ~/.ssh/id_rsa.pub,我这里是 ~/.ssh/id_ed25519.pub,公钥这里可以参考我的另一篇笔记:《使用 ECDSA 与 Ed25519 公钥算法》

通过 multipass transfer 传输公钥,而后放置到 authorized_keys 文件中(注意文件名替换)

$ multipass transfer ~/.ssh/id_ed25519.pub foo:/tmp
$ multipass exec foo -- bash -c "cat /tmp/id_ed25519.pub >> ~/.ssh/authorized_keys && rm /tmp/id_ed25519.pub"

通过 SSH 登录进实例(方式二)

这种方式适用于初始化容器实例时即添加 SSH 免密支持

先创建 Cloud init 脚本 cloud-init.yaml

users:
  - name: vmuser
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
    - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBuNnO7V7EEmk8RzwMATfO8djYChfks72jUtGufQEr9P joecovert@JoedeMacBook-Pro.local"
$ multipass launch --name bar --memory 512M --cloud-init cloud-init.yaml focal

创建成功后可以使用 multipass info bar 命令查询机器 IP

➜ multipass info bar
Name:           bar
State:          Running
IPv4:           192.168.64.3
Release:        Ubuntu 20.04.6 LTS
Image hash:     61f990edc97a (Ubuntu 20.04 LTS)
CPU(s):         1
Load:           0.52 0.14 0.05
Disk usage:     1.4GiB out of 4.7GiB
Memory usage:   145.9MiB out of 459.9MiB
Mounts:         --

而后通过 SSH 进行登录验证

$ ssh vmuser@192.168.64.3 -o StrictHostKeyChecking=no

如果不想新增用户,用系统默认的 ubuntu,可以这样写 cloud-init.yaml

ssh_authorized_keys:
  - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBuNnO7V7EEmk8RzwMATfO8djYChfks72jUtGufQEr9P joecovert@JoedeMacBook-Pro.local"

设置静态 IP

在测试过程中发现删除容器实例后,再次创建容器实例,它的 IP 是递增的,如果需要设置静态 IP,官方文档在 Ubuntu Desktop 下的设置教程如下:

How to configure static IPs

补充:如果想创建一个集群用于 k3s 等服务测试,可能使用域名绑定 IP 地址是更好的方式。

在 Multipass 中使用 Docker 镜像

Multipass 提供了一个 docker 的方案,可以通过 multipass 快速测试 Docker 容器。

$ multipass launch docker

$ multipass exec docker docker

根据终端提示设置 PATH

export PATH="$PATH:/Users/joecovert/Library/Application Support/multipass/bin"

重启终端,输入 docker ps 命令可以看到一个 portainer 容器已经自动创建。

使用 multipass list 查看 docker 实例的地址,有两个地址,其中一个加 9000 端口可以访问 Portainer(我的是:http://192.168.64.7:9000)

首次访问提示我需要重启下 portainer (docker restart portainer),之后就能访问 Portainer 了,它是一款免费、开源的 Docker 的图形化管理工具,首次登陆需设置管理员密码。

之后可以借助 Portainer 安装服务等,不过我还是更习惯通过 docker cli 来使用。另外虽然能够借助 multipass 使用 Docker 功能,但如果有条件安装使用原生的 Docker 会更好。

使用 Cloud init 初始化系统

这里有一个简单的 Cloud init 脚本,换源、安装软件、设置 SSH Key,如需创建系统时就进行设置的功能,可以问 AI 要配置进行补充。

#cloud-config
apt:
  sources:
    source.list: |
      deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
      deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
      deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
      deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

packages:
  - net-tools

ssh_authorized_keys:
  - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBuNnO7V7EEmk8RzwMATfO8djYChfks72jUtGufQEr9P joecovert@JoedeMacBook-Pro.local"

其他补充

如果你对 Multipass 有兴趣,可以再翻翻 HowTo 教程,如果你想在本机电脑快速起两个 Ubuntu 服务器测试用,Multipass 是个不错的选择。

参考