在我对Hyper-V、WSL终于忍无可忍之后,我大刀阔斧的删掉了Windows 10中所有关于虚拟机的功能(Hyper-V、WSL和Windows SandBox)之后,我收获了VMWare的嵌套虚拟化。自此我又可以在VMWare Workstation中跑Linux,再在Linux中跑VirtualBox运行Windows,然后再在Windows上跑虚拟机了。但随之而来的是如何使用这种嵌套虚拟化的能力弥补我失去的,主要是方便的Linux编译环境和Docker。本文将记述如何使用VMWare搭建一个Linux工作环境和一个Docker服务。
预备
首先自然是在“启用或关闭Windows功能”中关闭所有与虚拟机相关的功能——Hyper-V、Windows沙盒、WSL、虚拟机平台,以及其他所有和虚拟机沾边的东西,全部取消勾选,重启之后VMWare便可以勾选虚拟化Intel VT-x/EPT了(AMD则是AMD-V/RVI)。接下来便可以开始考虑Docker和Linux环境了。
我事先准备了两个安装好的模板,分别是Debian 11.2和OpenSUSE Leap 15.3。准备模板和安装普通虚拟机类似,步骤如下:
- 创建一个虚拟机,默认2核心2GB内存,40GB硬盘,一个NAT网络适配器用于上网,删除声卡和打印机。
- 挂载安装镜像,安装系统,这里我选择了Server角色进行安装,因为不需要图形界面。
- 进行一些通用/初始设置,例如设置一个非root用户,设定禁止root用户登录SSH(虽然root好用,但有时候确实容易翻车),允许非root用户无密码使用sudo命令,安装一些通用的软件包,例如OpenJDK、Python、htop这些。
- 关机,打快照,在虚拟机设置的高级设置中勾选“启用模板模式(用于克隆)”。
得益于VMWare Workstation的模板功能,以后需要使用的时候直接右键模板虚拟机,选择完整克隆即可复制一个开箱即用的虚拟机。
由于本文配置的虚拟机都是常用虚拟机,因此为他们单独分配一个虚拟网络,配置为VMnet2,仅主机模式,禁用DHCP(我们手动配置静态IP),配置子网IP为10.172.0.0/16
。
Docker VM
首先是一个运行Docker的虚拟机。这个虚拟机基于OpenSUSE Leap 15.3,没用风滚草的原因是我不想每次开启docker之前都要滚动更新,而一不小心还有滚挂的风险。
从模板完全克隆一个虚拟机,分配6核心4GB内存,额外加一块VMnet2网卡配置成静态IP用以与主机交互。通过控制台进行如下配置:
- 通过YaST配置第二块网卡(eth1)的IP地址:
10.172.1.10/16
(避开10.172.0.X
上的主机),主机名为vm-docker.internal.skyblond.info
- 在YaST中关闭防火墙(防止后续干扰Docker的端口映射)
- 删除原有的SSH主机密钥(
rm -rf /etc/ssh/ssh_host_*
)
至此我们就可以使用10.172.1.10
通过SSH接入虚拟机了。接入虚拟机之后:
- 首先
sudo zypper up -y
更新一下以表敬意 - 然后安装Docker:
sudo zypper install docker python3-docker-compose
- 开启Docker服务:
sudo systemctl enable docker
- 将当前用户加入docker组:
sudo usermod -G docker -a $USER
- 重启服务器
reboot
验证docker是否开机自启:docker ps -a
重启完成后Docker便可以使用了。日常使用中我经常使用IDEA执行Docker操作,但经过一番尝试发现通过SSH在Windows上连接到Linux服务端还不是很顺溜,所以我决定暂时禁用IDEA的Docker插件,并将整个D盘挂载到Linux系统中(/etc/fstab
):
.host:/d /mnt/d fuse.vmhgfs-fuse defaults,allow_other,uid=1000,gid=100,umask=0027 0 0
这里我将D盘分享成了d
,挂载到了/mnt/d
中,所有者是skyblond
(uid为1000),组为users(gid为100),权限为0750(u=rwx,g=rx)。
当我需要启动docker compose的时候,我便可以通过SSH登录到DockerVM中,切换到/mnt/d/Git/github/ArchiveDAG
,一个docker-compose up -d
就万事大吉了。
这里需要注意的是VMWare共享文件夹没法像Linux文件系统那样,像PostgreSQL需要硬链接,无论如何VMWare也做不到,所以只能将数据文件移动到别的地方,或者使用Docker的volume功能。
Linux VM
Linux环境就更好办了,把CLion删掉就好了,反正我也不写C/Rust,使用VMWare的模板功能,在需要的时候克隆出一个虚拟机即可,或者索性弄一个新的。目前我的Linux环境配置为OpenSUSE 风滚草,使用KDE桌面。与Leap不同,风滚草总是能享受到比较新的软件,并且对于Python和Java的版本选择会更灵活一些。这里我同样共享了整个D盘,过程与DockerVM完全一致,这里就不多赘述了。
关于LinuxVM,我分配的资源比较多:8核心8GB内存60GB硬盘。得益于可以使用VMWare的嵌套虚拟化,因此可以方便的在这个linux中使用VirtualBox和Vagrant测试ansible playbook,或其他简易集群,而避免了对外层的虚拟机大动干戈。由于目前还没有什么使用Linux VM的需求,就暂且先搁置了,什么时候用什么时候再配置。
总结
舍弃了Hyper-V,也就舍弃了许多方便的功能,例如Docker Desktop,但对应的,获得了嵌套虚拟化的能力,以及关掉Hyper-V之后的性能提升,我认为值得。关于关闭Hyper-V之后的性能提升,简单的说,Windows客户机在关掉Hyper-V之后,减少了一半的CPU核心,但图形界面却比原来流畅了不少。
-全文完-
【歪门邪道】去他妈的Hyper-V 由 天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。