Windows 10 上的 Multipass
Windows 10 上的 Multipass
Multipass 是一个轻量级的虚拟机管理器,支持 Linux,、Windows 以及 macOS 三大主流系统。在 Windows 上,可以选择用 Hyper-V 或者 Virtual Box 作为它底层的虚拟机软件。它实际上是在用户(也就是你)和较为笨重的虚拟机软件上加了一层抽象——没有什么是加一层解决不了的,不行再加——有点像 Spring boot 对于 Spring 的改进,Multipass 可以通过极为简单的命令 mulipass launch -n vmname
来用默认配置装载好一个虚拟机,开箱即用。
安装
根据官网文件,直接下载 .exe
文件,运行即可。这里可以修改程序的安装地址,默认选 Hyper-V 或者 Virtual Box,选择为当前用户或者所有用户创建环境变量。
完成以后,如果本机的 Hyper-V 还没开启的话,会提示重启计算机来进行配置。
这个时候,可以直接开启 Multipass 体验啦,不过,也许你还需要一些配置。
配置
数据存储位置
如果直接创建实例,Multipass 默认是存到C盘的, C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd\virtualbox\vault\instances\primary
,普通用户没有权限访问它!GitHub 上 issue#1112 反应 C 盘空间不够,以及 Windows 10 更新会删掉这些实例,希望存到别的地方去。
有两种解决方案。
MULTIPASS_STORAGE 环境变量
release 1.5.0 提供了一个环境变量 MULTIPASS_STORAGE
,可以修改一些数据的位置:
setting
MULTIPASS_STORAGE
system variable will change where data is stored (#1789)
see PR comment for instructions on how to set it across platforms
在 Windows 管理员身份打开的终端上做如下设置:
# In Administrator's PowerShell
PS> Stop-Service Multipass
PS> Set-ItemProperty -Path "HKLM:System\CurrentControlSet\Control\Session Manager\Environment" -Name MULTIPASS_STORAGE -Value "这里填写自己选择的文件夹"
PS> Set-ItemProperty -Path "HKLM:System\CurrentControlSet\Control\Session Manager\Environment" -Name MULTIPASS_STORAGE -Value "E:\volderoth\Documents\Virtual Machines\multipass"
PS> Start-Service Multipass
# 删除环境变量
PS> Remove-ItemProperty -Path "HKLM:System\CurrentControlSet\Control\Session Manager\Environment" -Name MULTIPASS_STORAGE
改完以后可能出现的问题:
- 文件夹大小与实际不符
- 无法创建新的实例
- ……
是否出现问题以及哪种方式可以解决都很玄学……改环境变量的方式还是有问题的。看到帖子里有说环境变量只是暂时的手段,希望以后的更新版本可以改进吧www
那么,来看下我们第二种解决方案吧!
符号链接
既然程序一定要在这个目录下放实例文件,那么,我等程序进到这个目录以后,从系统层面把请求转到别的目录不就可以了吗?可以类比一下 Nginx 的反向代理,程序发送了对地址 a 的请求,Nginx 截获以后反手转给了地址 b,然后把地址 b 的响应给到程序,程序其实并不知道请求被代理了,它只关注是不是拿到了可以接受的响应。这就是符号链接啦。程序要访问文件夹 a,Windows 发现这个文件夹有符号链接,就会自动重定向到文件夹 b 。它也有点像快捷方式。
命令如下:
mklink "新的目录地址" "C:\Windows\System32\config\systemprofile\AppData\Roaming\multipassd"
静态 IP
如果用 Hyper-V 作为底层的虚拟机软件,希望实例可以拥有一个静态 IP 的话,基本配置跟直接使用 Hyper-V 一致。
默认使用的网络适配器就是它自带的 default switch
,即使自己手动配置了 IP,重启以后它依旧会自动随机获取可用 IP 地址。所以需要在 Hyper-V 的虚拟交换机管理器里新建一个虚拟网络交换机,网络选内部网络,然后到网络适配器的 IPv4 的属性里,手动设定 IP 和网关。接着将实例的网络改成新的交换机,手动设定一下实例的 IP 就好。
用 multipass 创建新实例的时候,也可以手动指定网络适配器:
# 创建一个实例,名字是zero,网络适配器用之前设置的staticIP,手动设置
multipass launch -n zero --network name=staticIP,mode=manual
使用
multipass help
显示所有可用命令。
可以直接运行 multipass launch
,它会自动创建一个实例 primary
,系统是 Ubuntu 最新的 LTS 版:
Launched: primary
Skipping 'Home' mount due to disabled mounts feature
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-90-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information disabled due to load higher than 1.0
1 update can be applied immediately.
To see these additional updates run: apt list --upgradable
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@primary:~$
默认是 ubuntu 用户,没有密码。
也可以用自己的设定来创建实例,比如指定名字 one
,2 核 CPU,4 G 内存,20 G 磁盘:
multipass launch -n one -c 2 -m 4G -d 20G
列出所有已安装实例,显示运行状态、IP、系统版本:
multipass list
SSH 连接到实例,如果不指定实例名称,默认连接到 primary
:
multipass shell [实例名字]
重启、开启、关闭、挂起实例:
multipass restart one
multipass start one
multipass stop one
multipass suspend one
删除实例:
multipass delete one
# 彻底删除
multipass delete --purge one
# 或者在 delete 之后 purge
multipass purge