一款更加轻量级的虚拟机:Multipass

前言

自从使用上Docker之后,不管是生活还是工作都离不开它。尤其是工作,对于开发环境所需要的各类软件服务,都是采用docker一键快速搭建。然而这些服务的运行都离不开Docker,或者说离不开一个可以运行Docker服务的操作系统。
对于Windows操作系统,虽然Docker提供了桌面版,但是本人通常会在本地使用虚拟机安装部署一个Linux操作系统,可以认为耗费时间稍长!
因此,在茫茫网络中发现了一款超级轻量级的虚拟机:Multipass。它专为想要通过单个命令获得全新 Ubuntu 环境的开发人员而设计,下载一个全新的镜像需要几秒钟的时间,并且在几分钟内就可以启动并运行VM。

Multipass

概述

Multipass 是一款适用于 Linux、Windows 和 macOS 的轻量级 VM 管理器。它专为想要通过单个命令获得全新 Ubuntu 环境的开发人员而设计。它在 Linux 上使用 KVM、Windows 上的 Hyper-V 和 macOS 上的 QEMU 以最小的开销运行虚拟机。它还可以在 Windows 和 macOS 上使用 VirtualBox。
Multipass 提供了一个命令行界面来启动和管理 Linux 实例。下载一个全新的镜像需要几秒钟的时间,并且在几分钟内就可以启动并运行 VM。

GitHub:https://github.com/canonical/multipass

Multipass官网:https://multipass.run

Multipass社区:https://discourse.ubuntu.com/c/multipass/21/all

Multipass文档:https://multipass.run/docs

安装Multipass

要使用Multipass,首先需要安装,访问官网下载页面,选择对应的操作系统,这里选择Windows系统。

multipass命令

执行multipass命令,自动打印multipass相关的操作命令、以及简单的功能描述信息,具体如下:

bash 复制代码
C:\Users\Admin>multipass
用法: multipass [选项] <命令>
创建、控制和连接 Ubuntu 实例。

这是一个用于 multipass 的命令行工具,它是一种管理 Ubuntu 实例的服务。

选项:
  -?, -h, --help  显示命令行选项的帮助
  -v, --verbose   增加日志详细程度。重复 'v' 可获得更多细节。
                  最大详细程度需要 4 个 (或更多) 个 v,即 -vvvv。

可用命令:
  alias         创建别名
  aliases       列出所有可用的别名
  authenticate  认证客户端
  delete        删除实例和快照
  exec          在实例上运行命令
  find          显示可用于创建实例的映像
  get           获取配置设置
  help          显示某个命令的帮助
  info          显示关于实例或快照的信息
  launch        创建并启动一个 Ubuntu 实例
  list          列出所有可用的实例或快照
  mount         在实例中挂载一个本地目录
  networks      列出可用的网络接口
  prefer        切换当前的别名上下文
  purge         永久删除所有已删除的实例
  recover       恢复已删除的实例
  restart       重启实例
  restore       从快照中恢复一个实例
  set           设置配置参数
  shell         在正在运行的实例上打开一个 shell
  snapshot      为一个实例创建快照
  start         启动实例
  stop          停止正在运行的实例
  suspend       挂起正在运行的实例
  transfer      在主机和实例之间传输文件
  umount        从实例中卸载目录
  unalias       删除别名
  version       显示版本详细信息

命令使用说明

对于Multipass的命令怎么使用,这里以创建一个虚拟机为例说明。

可以在上面命令中发现,要创建虚拟机,应该使用launch命令,但是初次接触可能还有点懵,此时就应该执行类似于multipass help launch这样的命令来帮助如何更具体的使用。

bash 复制代码
C:\Users\Admin>multipass help launch
用法: multipass launch [选项] [[<远程>:]<镜像> | <URL>]
创建并启动一个新的实例。

选项:
  -?, -h, --help                        显示命令行选项的帮助
  -v, --verbose                         增加日志详细程度。重复 'v' 可获得更多细节。
                                        最大详细程度需要 4 个 (或更多) 个 v,即 -vvvv。
  -c, --cpus <cpus>                     分配的 CPU 数量。
                                        最小值: 1, 默认值: 1。
  -d, --disk <磁盘>                     分配的磁盘空间。正整数,单位为字节,或带有
                                        K、M、G 后缀的小数。
                                        最小值: 512M, 默认值: 5G。
  -m, --memory <内存>                   分配的内存量。正整数,单位为字节,或带有
                                        K、M、G 后缀的小数。
                                        最小值: 128M, 默认值: 1G。
  -n, --name <名称>                     实例的名称。如果它是 'primary'
                                        (配置的主实例名称), 用户的主目录将在新启动的
                                        实例中挂载在 'Home' 目录下。
                                        有效的名称必须由字母、数字或连字符组成,
                                        必须以字母开头,并以字母数字字符结尾。
  --cloud-init <文件> | <URL>           用户数据 cloud-init 配置的路径或 URL,
                                        或 '-' 表示从标准输入读取。
  --network <规格>                      为实例添加网络接口,其中 <规格> 采用
                                        "key=value,key=value" 格式,可用的键有:
                                         name: 要连接的网络(必需),使用 networks
                                        命令查看可用值,或使用 'bridged' 来使用通过
                                        `multipass set local.bridged-network` 配置的接口。
                                         mode: auto|manual (默认: auto)
                                         mac: 硬件地址 (默认: 随机)。
                                        您也可以使用 "<name>" 作为快捷方式,
                                        意为 "name=<name>"。
  --bridged                             添加一个 `--network bridged` 网络。
  --mount <本地路径>:<实例路径>         在实例中挂载一个本地目录。如果 <实例路径> 被省略,
                                        挂载点将与 <本地路径> 的绝对路径相同。
  --timeout <超时>                      命令完成的最长等待时间,以秒为单位。请注意,
                                        某些后台操作可能会在此时间之后继续。默认情况下,
                                        实例启动和初始化分别限制为 5 分钟。

参数:
  image                                 要启动的可选镜像。如果省略,则使用默认的
                                        Ubuntu LTS。
                                        <remote> 可以是 'release' 或 'daily'。
                                        如果省略 <远程>, 将使用 'release'。
                                        <image> 可以是部分镜像散列或 Ubuntu 发行版本、
                                        代号或别名。
                                        <url> 是自定义镜像 URL,格式为 http://、
                                        https:// 或 file://。

Multipass的使用

查看镜像列表

执行以下命令,查看受支持的系统镜像列表

bash 复制代码
multipass find

参数说明:

arduino 复制代码
image:镜像

Aliases: 别名

version:版本

Description:描述

新建和运行虚拟机

创建和运行基本虚拟机的命令语法如下:

bash 复制代码
multipass launch --name <虚拟机实例名称> <系统镜像名称、别名(可选)>

创建一个名为Ubuntu的虚拟机实例,默认使用最新版ubuntu 24.04镜像,此种方式不推荐

bash 复制代码
multipass launch --name node02 jammy

更高级的或更实用的创建方式如下:

创建4核心、4GB内存、200G虚拟磁盘的Ubuntu实例

bash 复制代码
multipass launch --name master -c 4 -m 4G -d 200G
bash 复制代码
-n, --name: 虚拟机名称
-c, --cpus: cpu核心数, 默认: 1
-m, --mem: 内存大小, 默认: 1G
-d, --disk: 硬盘大小, 默认: 5G

查看虚拟机列表

虚拟机创建完成后,可以使用multipass list命令进行查看虚拟机列表

可以看到虚拟机详细信息,名称,状态,地址,镜像名称等信息。

bash 复制代码
multipass list

此时可以看到目前正在运行一台 Ubuntu 20.04 版本的虚拟机,并且对应的IP地址为172.30.125.204,注意:此IP地址局域网内不能被访问

bash 复制代码
C:\Users\Admin>multipass list
Name                    State             IPv4             Image
master                  Running           172.30.125.204   Ubuntu 24.04 LTS

查看虚拟机信息

通过multipass info 虚拟机名称命令,查看当前运行的虚拟机信息

bash 复制代码
C:\Users\Admin>multipass info master
Name:           master
State:          Running
Snapshots:      0
IPv4:           172.30.125.204
Release:        Ubuntu 24.04 LTS
Image hash:     32a9d30d1880 (Ubuntu 24.04 LTS)
CPU(s):         4
Load:           0.00 0.00 0.00
Disk usage:     1.2GiB out of 193.7GiB
Memory usage:   405.9MiB out of 3.8GiB
Mounts:         --

进入虚拟机

1.在任务栏,点击Multipass图标,选择虚拟机实例,点击Open Shell打开虚拟机

2.通过multipass shell 命令,可以进入虚拟机内部,使用exit命令退出

bash 复制代码
multipass shell master

进入虚拟机后,可以看到目前虚拟机的一些系统配置信息,以及内存和磁盘的使用情况

bash 复制代码
C:\Users\Admin>multipass shell master
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-31-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Sun May 19 13:43:27 CST 2024

  System load:  0.06               Processes:             137
  Usage of /:   0.6% of 192.69GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for eth0: 172.30.118.117
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Sun May 19 12:38:24 2024 from 172.30.112.1
ubuntu@master:~$

外部操作虚拟机

通过multipass exec 虚拟机名称 执行命令方式,在实例内执行给定的命令。

查看内部所处的目录,执行pwd命令

bash 复制代码
C:\Users\Admin>multipass exec master  pwd
/home/ubuntu

删除和释放实例

使用以下命令,可以开启、停止、删除和释放实例

bash 复制代码
# 启动vm实例
multipass start vm

# 停止vm实例
multipass stop vm
# 停止全部虚拟机
multipass stop --all

# 删除vm实例(删除后,还存在)
multipass delete vm

# 释放实例(彻底删除)
multipass purge

初始化配置

Multipass提供了--cloud-init选项,在创建虚拟机时,利用一个配置文件,启动初始化配置

创建config.yaml初始化配置文件

使用首次启动时运行命令,在初始化容器的时候,自动配置与更新软件源。

bash 复制代码
#cloud-config 
runcmd:
  - sudo sed -i 's|http://archive.ubuntu.com/|http://mirrors.aliyun.com/|g' /etc/apt/sources.list.d/ubuntu.sources
  - sudo apt update -y
  - sudo apt upgrade -y

注意:

必须以 #cloud-config 开头,这是cloud-init 识别它的方式

bash 复制代码
multipass launch --name ubuntu --cloud-init config.yaml

这里使用了一个简单配置示例,更多配置,参考文档:Cloud config examples

虚拟机的调整

查看multipass set命令的使用说明:

bash 复制代码
C:\Users\Admin>multipass help set
用法: multipass set [选项] <键>[=<值>]
设置与给定键对应的配置设置的值。

一些常见的设置键有:
  - client.gui.autostart
  - local.driver
  - local.privileged-mounts

使用 `multipass get --keys` 可以获得当前可用设置的完整列表。

选项:
  -?, -h, --help  显示命令行选项的帮助
  -v, --verbose   增加日志详细程度。重复 'v' 可获得更多细节。
                  最大详细程度需要 4 个 (或更多) 个 v,即 -vvvv。

参数:
  keyval          一个键,或一个键值对。键指定要配置的设置路径。
                  值是其预期值。如果只给出键,则会提示输入值。

获得当前可用设置的完整列表,发现有几个主要参数可以对虚拟机进行调整

bash 复制代码
C:\Users\Admin\Desktop>multipass get --keys
client.apps.windows-terminal.profiles
client.gui.autostart
client.gui.hotkey
client.primary-name
local.bridged-network
local.driver
local.image.mirror
local.master.cpus
local.master.disk
local.master.memory
local.passphrase
local.privileged-mounts

配置示例如下:

bash 复制代码
multipass set local.[实例名称].cpus=8
multipass set local.[实例名称].disk=300G
multipass set local.[实例名称].memory=8G

设置桥接网络接口

当创建一个虚拟机后,分配的IP地址并不是一个局域网地址,这会造成局域网其他电脑无法访问,因此设置网络为桥接模式,前提是有这个需求。

因为是Windows系统,直接将重命名以太网network,防止乱码问题。 除了以上方式,也可以打开Hyper-V 管理器,创建一个虚拟网络交换机

使用multipass networks命令,列出multipass可将实例连接到的网络接口

bash 复制代码
C:\Users\Admin>multipass networks
Name             Type       Description
Default Switch   switch     Virtual Switch with internal networking
VM               switch     Virtual Switch with external networking
network          ethernet   Realtek PCIe GbE Family Controller

设置Multipass使用桥接模式,使用network网口

bash 复制代码
multipass set local.bridged-network=network

创建桥接模式的虚拟机

bash 复制代码
multipass launch --name master -c 4 -m 4G -d 200G --network bridged

查看虚拟机列表

此时,使用了桥接模式的虚拟机将多出一个可供局域网访问的IP

bash 复制代码
C:\Users\Admin>multipass list
Name                    State             IPv4             Image
master                  Running           172.30.118.69   Ubuntu 24.04 LTS
                                          192.168.1.2

注意:

对于没有使用桥接网络接口的的已创建虚拟机,如何变更让其使用指定桥接网络,根据官方社区、文档,暂时未找到解决方案。

配置软件源

通常来说,当新建一个虚拟机后,需要进行软件源的配置与更新。注意:不同操作系统,软件源配置不一样,

这里使用Ubuntu 24.04为例说明,执行如下命令进行软件源的配置

bash 复制代码
sudo sed -i 's|http://archive.ubuntu.com/|http://mirrors.aliyun.com/|g' /etc/apt/sources.list.d/ubuntu.sources

更新软件源

bash 复制代码
sudo apt update -y
sudo apt upgrade -y

配置静态IP

使用桥接模式后,虚拟机IP地址是随机分配的,因此按需求情况进行静态IP配置。

进入/etc/netplan/目录,编辑类似于50-cloud-init.yaml的文件

默认配置如下:

bash 复制代码
network:
    ethernets:
        default:
            dhcp4: true
            match:
                macaddress: 52:54:00:7b:59:92
        extra0:
            dhcp4:
            dhcp4-overrides:
                route-metric: 200
            match:
                macaddress: 52:54:00:fb:4f:bd
            optional: true
    version: 2

查看IP信息

bash 复制代码
ubuntu@master:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:00:7b:59:92 brd ff:ff:ff:ff:ff:ff
    inet 172.30.118.69/20 metric 100 brd 172.18.111.255 scope global dynamic eth0
       valid_lft 85908sec preferred_lft 85908sec
    inet6 fe80::5054:ff:fe7b:5992/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:00:fb:4f:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 metric 200 brd 192.168.1.255 scope global dynamic eth1
       valid_lft 85909sec preferred_lft 85909sec
    inet6 fe80::5054:ff:fefb:4fbd/64 scope link
       valid_lft forever preferred_lft forever

可以发现使用桥接模式的网络接口是eth1,因此这里就需要配置网口eth1,具体配置如下

bash 复制代码
network:
    ethernets:
        default:
            dhcp4: true
            match:
                macaddress: 52:54:00:7b:59:92
        eth1:
            dhcp4: false
            addresses: [192.168.1.6/24]
            optional: true
            routes:
              - to: default
                via: 192.168.1.1
            nameservers:
              addresses: [8.8.8.8]
    version: 2

应用网络,是配置生效

bash 复制代码
sudo netplan apply

挂载数据卷

multipass提供和Docker一样的挂载数据卷的功能,能够与外部宿主机的目录文件保持同步

挂载语法

bash 复制代码
multipass mount 宿主机目录  实例名:虚拟机目录

挂载

bash 复制代码
multipass mount D:\Data  master:/data

在Windows系统上操作,不出意外会出现如下异常:

bash 复制代码
C:\Users\Admin>multipass mount D:\Data  master:/data
mount failed: Mounts are disabled on this installation of Multipass.

See https://multipass.run/docs/set-command#local.privileged-mounts for information
on how to enable them.

原因:

Windows系统上挂载是不安全的,默认情况下禁用挂载,因为具有TCP访问权限localhost( 127.0.0.1) 的任何人都可以使用Multipass,并且通过扩展,可以访问整个文件系统。

可通过local.privileged-mounts参数更改,自1.7.0起需要。

bash 复制代码
C:\Users\Admin>multipass get local.privileged-mounts
false

C:\Users\Admin>multipass set local.privileged-mounts=true

C:\Users\Admin>multipass get local.privileged-mounts
true

再次挂载完成后,使用multipass info 虚拟机名称,查看是否挂载成功

bash 复制代码
C:\Users\Admin> multipass info master
Name:           master
State:          Stopped
Snapshots:      0
IPv4:           --
Release:        --
Image hash:     32a9d30d1880 (Ubuntu 24.04 LTS)
CPU(s):         --
Load:           --
Disk usage:     --
Memory usage:   --
Mounts:         D:/Data => /data
                    UID map: -2:default
                    GID map: -2:default

卸载数据卷

使用unmount命令卸载数据卷

bash 复制代码
multipass umount 虚拟机名称

传输文件

可以通过transfer命令,将宿主机的文件,发送到虚拟机内部

bash 复制代码
multipass transfer 主机文件 容器名: 容器目录

更改默认存储位置

参考官方文档:Configure where Multipass stores external data

参考社区回答:[Configure where Multipass stores external data

打开具有管理员权限的PowerShell提示符进行相关操作。

停止Multipass守护进程:

bash 复制代码
Stop-Service Multipass

创建并设置新的存储位置,替换<path>为您选择的绝对路径

bash 复制代码
New-Item -ItemType Directory -Path "<path>"

Set-ItemProperty -Path "HKLM:System\CurrentControlSet\Control\Session Manager\Environment" -Name MULTIPASS_STORAGE -Value "<path>"

将数据从原始位置传输到新位置

bash 复制代码
Copy-Item -Path "C:\ProgramData\Multipass\*" -Destination "<path>" -Recurse

注意:

将现有数据复制到新位置非常重要。这可以避免未经身份验证的客户端问题、权限问题,并且通常可以避免任何以前创建的实例可用。

启动Multipass守护进程

bash 复制代码
Start-Service Multipass

自行删除原始数据,以释放空间

bash 复制代码
Remove-Item -Path "C:\ProgramData\Multipass\*" -Recurse

其他问题

异常1

有的时候,在执行Multipass命令时,可能会出现如下异常:

bash 复制代码
launch failed: Remote "" is unknown or unreachable.

原因:

据了解大概率是一个Bug,因为经常发生

解决办法:

打开Windows的任务管理器,杀死Multipass进程与multipassd.exe进程。
然后重新打开Multipass。需注意:Multipass进程与multipassd.exe进程一定要启动成功。

异常2

在执行multipass find命令时出现如下异常:

bash 复制代码
list failed: The client is not authenticated with the Multipass service.
Please use 'multipass authenticate' before proceeding.

原因:

大概率是因为进行了Multipass的存储目录更改,未进行数据复制迁移导致的。相关验证信息丢失,Multipass要求客户端在允许命令完成之前通过服务进行身份验证。

解决方法:

参考: How to authenticate clients with the Multipass service。本人采用重新安装multipass程序得以解决。

相关推荐
雨中rain15 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
Bessssss35 分钟前
centos日志管理,xiao整理
linux·运维·centos
s_yellowfish35 分钟前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
豆是浪个37 分钟前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&38 分钟前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
我一定会有钱40 分钟前
【linux】NFS实验
linux·服务器
Ven%43 分钟前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip
是阿建吖!1 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库
张暮笛1 小时前
蓝牙协议——音量控制
linux
陈君豪1 小时前
OpenCV的FAST和goodFeaturesToTrack的區別
linux