MENU

【歪门邪道】去他妈的Hyper-V

February 16, 2022 • 瞎折腾

在我对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。准备模板和安装普通虚拟机类似,步骤如下:

  1. 创建一个虚拟机,默认2核心2GB内存,40GB硬盘,一个NAT网络适配器用于上网,删除声卡和打印机。
  2. 挂载安装镜像,安装系统,这里我选择了Server角色进行安装,因为不需要图形界面。
  3. 进行一些通用/初始设置,例如设置一个非root用户,设定禁止root用户登录SSH(虽然root好用,但有时候确实容易翻车),允许非root用户无密码使用sudo命令,安装一些通用的软件包,例如OpenJDK、Python、htop这些。
  4. 关机,打快照,在虚拟机设置的高级设置中勾选“启用模板模式(用于克隆)”。

得益于VMWare Workstation的模板功能,以后需要使用的时候直接右键模板虚拟机,选择完整克隆即可复制一个开箱即用的虚拟机。

由于本文配置的虚拟机都是常用虚拟机,因此为他们单独分配一个虚拟网络,配置为VMnet2,仅主机模式,禁用DHCP(我们手动配置静态IP),配置子网IP为10.172.0.0/16

Docker VM

首先是一个运行Docker的虚拟机。这个虚拟机基于OpenSUSE Leap 15.3,没用风滚草的原因是我不想每次开启docker之前都要滚动更新,而一不小心还有滚挂的风险。

从模板完全克隆一个虚拟机,分配6核心4GB内存,额外加一块VMnet2网卡配置成静态IP用以与主机交互。通过控制台进行如下配置:

  1. 通过YaST配置第二块网卡(eth1)的IP地址:10.172.1.10/16(避开10.172.0.X上的主机),主机名为vm-docker.internal.skyblond.info
  2. 在YaST中关闭防火墙(防止后续干扰Docker的端口映射)
  3. 删除原有的SSH主机密钥(rm -rf /etc/ssh/ssh_host_*

至此我们就可以使用10.172.1.10通过SSH接入虚拟机了。接入虚拟机之后:

  1. 首先sudo zypper up -y更新一下以表敬意
  2. 然后安装Docker:sudo zypper install docker python3-docker-compose
  3. 开启Docker服务:sudo systemctl enable docker
  4. 将当前用户加入docker组:sudo usermod -G docker -a $USER
  5. 重启服务器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 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code