东东's Blog

虚拟机管理工具 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 AAAA... your_email@example.com"
$ 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 AAAA... your_email@example.com"

设置静态 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 AAAA... your_email@example.com"

其他补充#

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

参考#