前言
自从使用上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程序得以解决。