再见了 VMware,一款更轻量级的虚拟机!

Java技术精选

共 10416字,需浏览 21分钟

 · 2021-12-23


Multipass是一个轻量虚拟机管理器,是由 Ubuntu 运营公司 Canonical 所推出的开源项目。运行环境支持 Linux、Windows、macOS。在不同的操作系统上,使用的是不同的虚拟化技术。在 Linux 上使用的是 KVM、Window 上使用 Hyper-V、macOS 中使用 HyperKit 以最小开销运行VM,支持在笔记本模拟小型云。


同时,Multipass 提供了一个命令行界面来启动和管理 Linux 实例。下载一个全新的镜像需要几秒钟的时间,并且在几分钟内就可以启动并运行 VM。(直呼好家伙,大大降低的我们安装虚拟机的成本了)


Multipass官网:https://multipass.run/




1

开始使用


在使用 Multipass 之前 ,首先需要安装 Multipass 工具,可以打开官网进行下载


https://multipass.run/


选择对应的操作系统,因为我的是 Mac 电脑,所以选择 MacOS,点击 Download 开始下载



如果电脑装了 brew 可以直接命令行下载安装:


brew cask install multipass


下载安装成功后, 执行以下命令可以查看当前软件版本:


multipass --version


安装成功后,点击运行,即可打开 Multipass 客户端,这里能够快速的通过 Open Shell 创建和启动一个虚拟机



下面,我们来介绍如何通过命令的方式,创建一台虚拟机



2

创建Ubuntu虚拟机


首先,通过以下指令查看可供下载的 Ubuntu 镜像


multipass find


运行成功后,可以看到下面的这些镜像列表,包含各种版本的


Image                       Aliases           Version          Description
core                        core16            20200818 Ubuntu Core 16
core18                                        20200812 Ubuntu Core 18
18.04                       bionic            20211109 Ubuntu 18.04 LTS
20.04                       focal,lts         20211118 Ubuntu 20.04 LTS
21.04                       hirsute           20211119 Ubuntu 21.04
21.10                       impish            20211103 Ubuntu 21.10
appliance:adguard-home                        20200812 Ubuntu AdGuard Home Appliance
appliance:mosquitto                           20200812 Ubuntu Mosquitto Appliance
appliance:nextcloud                           20200812 Ubuntu Nextcloud Appliance
appliance:openhab                             20200812 Ubuntu openHAB Home Appliance
appliance:plexmediaserver                     20200812 Ubuntu Plex Media Server Appliance
anbox-cloud-appliance                         latest           Anbox Cloud Appliance
minikube                                      latest           minikube is local Kubernetes


下载最新版的 Ubuntu 镜像并运行,初次创建时需要下载 Ubuntu 镜像,网络畅通的情况下,稍等片刻即可。


multipass launch -n vm01 -c 1 -m 1G -d 10G


自定义配置创建可以参考如下方式:


-n, --name: 名称
-c, --cpus: cpu核心数, 默认: 1
-m, --mem: 内存大小, 默认: 1G
-d, --disk: 硬盘大小, 默认: 5G



3

操作虚拟机


查看虚拟机列表


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


% multipass list
Name                    State             IPv4             Image
vm01                    Running           192.168.64.2     Ubuntu 20.04 LTS


可以看到目前正在运行一台 Ubuntu 20.04 版本的虚拟机,并且对应的 IP 地址为 192.168.64.2


外部操作虚拟机


通过multipass exec命令在实例内执行给定的命令。第一个参数是运行命令的实例,也就是 vm01


我们通过 exec 命令,就可以在外部操作刚刚创建的虚拟机,例如查看内部所处的目录,执行 pwd 命令


# multipass exec vm01 pwd
/home/ubuntu


查看虚拟机信息


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


# multipass info vm01
Name: vm01
State: Running
IPv4: 192.168.64.2
Release: Ubuntu 20.04.3 LTS
Image hash: 91740d72ffff (Ubuntu 20.04 LTS)
Load: 0.00 0.00 0.00
Disk usage: 1.3G out of 9.5G
Memory usage: 170.9M out of 1.9G
Mounts: --


进入虚拟机


通过multipass shell命令,即可进入到虚拟机内部


multipass shell vm01


运行后的结果如下所示,可以看到目前虚拟机的一些系统配置信息,以及内存和磁盘的使用情况



同时会运行一个新的 Ubuntu 系统,此时便进入到了Ubuntu 环境中, 在里面可以执行相关的 linux 指令


当然如果不想进入系统内部,也可以通过上述提到的 multipass exce 命令,来操作 Ubuntu 系统


首先执行下面命令,给系统设置一个 root 密码,设置好密码后,使用 su root 切换到 root 用户


# 设置密码
sudo passwd
# 切换 root
su root


ubuntu 是使用 apt-get 来进行包管理的,首先更新一下 apt-get,然后安装 nginx


# 更新apt
apt-get update
# 安装 nginx
apt-get install nginx


安装好 nginx 后,可以到 /etc/nginx 目录即可看到刚刚的 nginx 配置信息


root@vm01:/lost+found# cd /etc/nginx/
root@vm01:/etc/nginx# ls
conf.d fastcgi_params koi-win modules-available nginx.conf scgi_params sites-enabled uwsgi_params
fastcgi.conf koi-utf mime.types modules-enabled proxy_params sites-available snippets win-utf


下面我们可以测试一下,nginx 是否安装成功,在 mac 上打开浏览器,输入虚拟机的 ip 地址 192.168.64.2



可以看出,目前 nginx 已经成功运行了,后续的话,可能会考虑在上面部署更多的应用。


挂载数据卷


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


# 挂载格式
multipass mount 宿主机目录 实例名:虚拟机目录


下面,我在用户的目录下,创建一个 hello 目录


# 创建hello目录
mkdir hello
#
 挂载
multipass mount /Users/moxi/hello vm01:/hello


挂载完成后,我们回到实例 vm01 中,可以看出多了一个 hello 文件夹,说明已经成功挂载~



因此,以后在 vm01 的 hello文件夹 中创建的文件,都会在的宿主机的 hello 文件夹同步显示


卸载数据卷


如果以后不需要用到挂载了,可以使用 unmount 命令卸载


#卸载数据卷
multipass umount 容器名


传输文件


除了使用上述的 mount 挂载卷的方式实现文件的交互,同时还可以通过 transfer 命令,将宿主机的文件,发送到虚拟机内部


multipass transfer 主机文件 容器名:容器目录


例如,将 hello.txt 发送到


multipass transfer hello.txt vm01:/home/ubuntu/


删除和释放实例


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


# 启动实例
multipass start vm01
# 停止实例
multipass stop vm01
# 删除实例(删除后,还会存在)
multipass delete vm01
# 释放实例(彻底删除)
multipass purge vm01


容器配置自动化


为了保持开发环境和线上环境一致性 同时节省部署时间 multipass 给我们提供了 --cloud-init 选项进行容器启动初始化配置:


multipass launch --name ubuntu --cloud-init config.yaml


上面 config.yaml 则是容器的初始化配置文件,例如,我们想在初始化容器的时候,自动下载安装 Node.js,内容如下:


#cloud-config
runcmd:
  - curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
  - sudo apt-get install -y nodejs


runcmd 可以指定容器首次启动时运行的命令


凡是用户自定义的cloud-init的配置文件,必须以#cloud-config开头,这是cloud-init识别它的方式。














容器技术可以保证环境一致性,简化项目配置、部署流程,因此很受广大开发者青睐。如果你打算尝试或者已经尝试基于容器简化本地项目环境配置,但又嫌弃 docker 用起来还是不够直截了当,那么可以试下 multipass。


安装

macOS(支持 Sierra 以上版本)可以直接通过 Homebrew 安装:


brew cask install multipass

Windows 用户可以到这里下载安装(只支持 Windows 10,如果是 Windows 家庭版或者 v1803 之前的 Windows 10 专业版/企业版,还需要另外安装 VirtualBox)。


运行一下 multipass version 命令确认安装成功,顺便查看一下版本:


multipass  1.1.0+mac

multipassd 1.1.0+mac

可以看到当前版本是这个月刚发布的 1.1.0。对很多用户来说,这个版本最大的更新是支持代理。从 1.1.0 起,multipass 像很多命令行工具一样,会遵循 http_proxy 环境变量中指定的代理。因为 multipass 创建容器时可能需要从网络下载镜像,而很多地方的网络连通性不尽如人意,因此支持代理能够大大改善使用体验。


上手

先来创建一个容器:


$ multipass launch --name react

Launched: react

初次创建时需要下载镜像,网络畅通的情况下,稍等片刻即可。


容器创建后 multipass 会马上启动它,这样创建好容器后我们就可以直接使用了:


$ multipass exec react -- lsb_release -d

Description:    Ubuntu 18.04.4 LTS

lsb_release 会打印 Linux 发行版的信息。之前我们创建容器的时候并没有指定使用什么样的镜像,上面命令的输出表明,multipass 默认会使用当前 LTS 版本的 Ubuntu。


除了直接在容器上运行(exec)命令外,还可以通过 shell 命令「进入」容器:


multipass shell react

我们进入了一个完整的 Linux 环境,可以进行各种操作。例如,假设我们看到了一篇介绍 React Hooks 的教程,打算体验一下教程的示例项目:


git clone https://github.com/hjiang/react-hook-demo.git

cd react-hook-demo

npm install 

哎呀,系统告诉我们 npm 没有安装,并建议通过 apt 安装。


The program 'npm' is currently not installed. You can install it by typing:

sudo apt install npm

不过,当前 LTS 版本的 Ubuntu 仓库里的 Node.js 比较老旧,我们转而安装 LTS 版本的 Node.js(12):


curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

sudo apt-get install -y nodejs

npm install

npm start

项目跑起来了,太棒了:


Compiled successfully!


You can now view leancloud-react-hook-tutorial in the browser.


  Local:            http://localhost:3000/

  On Your Network:  http://192.168.64.5:3000/


Note that the development build is not optimized.

To create a production build, use npm run build.

这里 192.168.64.5 是 Multipass 分配给 react 这个容器的 IP,所以我们可以直接在宿主机上打开浏览器访问 http://192.168.64.5:3000/ 查看效果。


定制

接下来我们尝试容器化手头正在开发的一个 Node.js 项目。和之前不同,我们将对容器进行一些定制,这样用起来更方便。


首先,我们的 Node.js 项目将部署到云平台,所以我们希望容器的规格尽可能和云平台上的生产环境一致。其次,我们之前手动安装了 Node.js,这次我们希望自动化这一安装过程。


因此,我们使用以下命令创建容器:


multipass launch --name lean --disk 2G --mem 256M --cloud-init lean.yaml 18.04

我们通过命令行参数指定了容器的磁盘和内存大小,并且显式指定使用 Ubuntu 18.04。容器创建成功后,通过 multipass info 可以查看容器的基本信息:


$ multipass info --all

Name:           lean

State:          Running

IPv4:           192.168.64.2

Release:        Ubuntu 18.04.4 LTS

Image hash:     fe3030939822 (Ubuntu 18.04 LTS)

Load:           0.11 0.30 0.16

Disk usage:     1.3G out of 2.0G

Memory usage:   71.4M out of 229.7M


Name:           react

State:          Running

IPv4:           192.168.64.5

Release:        Ubuntu 18.04.4 LTS

Image hash:     fe3030939822 (Ubuntu 18.04 LTS)

Load:           0.00 0.00 0.00

Disk usage:     1.7G out of 4.7G

Memory usage:   112.1M out of 985.7M

可以看到,之前创建的 react 容器,multipass 默认分配了 5G 硬盘和 1G 内存。而 lean 容器则按照我们的要求分配了 2G 硬盘和 256M 内存(这是我们计划使用的云平台 LeanCloud 云引擎 免费版体验实例的规格)。另外,基本信息中没有 CPU 核心的信息,multipass 默认会给容器分配 1 个 CPU 核心。


至于 lean.yaml 则是容器的初始化配置文件,内容如下:


#cloud-config


runcmd:

  - curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

  - sudo apt-get install -y nodejs

  - wget https://releases.leanapp.cn/leancloud/lean-cli/releases/download/v0.21.0/lean-cli-x64.deb

  - sudo dpkg -i lean-cli-x64.deb

runcmd 可以指定容器 首次启动 时运行的命令,这里我们复制了之前安装 Node.js 的命令,还加上了安装 lean-cli 的命令(我们通过 lean-cli 将代码部署到云平台)。


容器初始化配置文件遵循 cloud-init 标准,可以通过 yaml 文件进行用户、文件、软件仓库、 DNS 解析、SSH 密钥、puppet、chef 等各种初始化配置。


我们只打算在容器中测试、部署项目,并不打算 multipass shell 到容器内使用 vim 或 emacs 开发项目。所以,我们直接挂载宿主机上的一个目录:


multipass mount demo lean:/home/ubuntu/demo

demo 是我们的 Node.js 项目目录,如果读者想要测试,可以用下面这个模板项目:

git clone https://github.com/leancloud/node-js-getting-started demo


同时去 LeanCloud 注册账号、创建应用,方便体验下面的部署操作。

挂载完成后,我们就可以在宿主机上使用趁手的 IDE、编辑器开发项目,之后 multipass shell lean 到容器内测试:


cd demo

lean login # 使用之前注册的 LeanCloud 账号登录

lean switch # 选择之前创建的应用

npm install # 安装项目依赖

lean up # 本地(容器内)调试

屏幕会输出:


Node app is running on port: 3000

之前通过 multipass info,我们知道 lean 容器的 IP 是http://192.168.64.2,所以在宿主机上访问 http://192.168.64.2:3000/ 即可查看效果。

如果效果符合预期,我们可以在容器内运行 lean deploy --prod 1 部署项目。


更多

运行 multipass list 可以列出所有的容器:


Name                    State             IPv4             Image

lean                    Running           192.168.64.2     Ubuntu 18.04 LTS

react                   Running           192.168.64.5     Ubuntu 18.04 LTS

如果希望节约资源,我们可以停止暂时用不到的容器,比如之前创建的 react:


multipass stop react

之后我们可以运行 multipass start react 重新运行容器。如果以后不再使用,那么也可以干脆删除:


multipass delete --purge react

最后,很多时候,我们只是想要在 macOS 或 Windows 上起一个 Linux 环境,然后进行一些操作,multipass 应付这一使用场景最是得心应手:


multipass shell

是的,你没看错,只需一条命令,你就可以进入一个与宿主机隔离的 Linux 容器!

multipass 会自动创建并运行一个名为 Primary 的容器(如果还没有创建或运行的话),这个容器也会自动挂载宿主机的 Home 目录,就是这么省心省力。


结语

Multipass 使用起来十分简洁直观。它是由 Canonical (Ubuntu 背后的公司)推出的,因此使用的镜像由 Canonical 负责更新,包含最近的安全更新,以及专门为各个平台的虚拟化方案(Windows 的 Hyper-V、macOS 的 HyperKit、Linux 的 KVM)优化的内核。不过也因为同样的原因,目前支持的镜像也只限于 Ubuntu。


yaml 配置文件可以参考下面的文章


https://cloudinit.readthedocs.io/en/latest/topics/examples.html?highlight=lock-passwd#including-users-and-groups


更多关于 multipass 的高阶的技巧,欢迎访问 multipass 官方文档。


https://multipass.run/docs/


好了,本期关于 Multipass 的基础学习就到这里了,感兴趣的小伙伴环境下载自己动手学习呢~



4

总结


使用了一阵子后,Multipass 在使用起来很简洁直观,在整体操作上和 docker 类似,如果想在自己电脑上快速搭建一个 Linux 系统用于学习的话,选择使用 Multipass 还是非常方便的。


唯一不足的地方就是,Multipass 是由 Ubuntu 背后的 Canonical 公司开发的,因此 Multipass 所使用的镜像也都是 Ubuntu 镜像(这也可以理解,毕竟支持自家的产品),不过对于习惯了使用 CentOS 的用户来说,还是用些许不太习惯。不过瑕不掩瑜,Multipass 在我看来还是一款非常棒的软件~




往期推荐



异步调用@Async注解,提升SpringBoot 项目中API并发能力!

RedisJson 横空出世,性能碾压ES和MongoDB!

MySQL 8.0 的 5 个新特性,太实用了

Notion,程序员最后一款笔记软件!

SpringBoot五种热部署方式,极速开发就是生产力!

告别 Maven,赶快使用他!



浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报