天空 Blond - Hyper-V
type: channel
link: https://skyblond.info/tag/Hyper-V/
items: 【歪门邪道】去他妈的Hyper-V

【歪门邪道】去他妈的Hyper-V
type: item
date: 2022-02-16T21:57:00+08:00
description: 在我对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…