宿主机这个词听着容易让人觉得费解,拆开理解就简单很多。你在一台实体电脑里安装软件,依靠软件运行另一套完整操作系统,这台物理电脑就叫做宿主机,里面跑起来的系统则称为虚拟机。宿主机是实实在在的硬件载体,自带CPU、内存、硬盘、网卡这些组件;虚拟机只是软件模拟生成的环境,它自身会以为独占整套硬件资源,实际上所有算力和存储都来自宿主机。
虚拟机能够正常运行,依靠的是一层名为Hypervisor的中间程序,中文名称虚拟机监视器。它负责拆分宿主机的CPU运算时间、内存空间、磁盘读写权限,分配给不同虚拟机。虚拟机发出的各类指令,需要先交由Hypervisor完成翻译或者转发,才能够作用到真实硬件上。所以虚拟机运行速度会比物理机略低,这部分性能损耗就来源于这一层调度开销。

Hypervisor分为两大类型。第一种是Type 1,也叫裸金属型,直接部署在硬件之上,不需要依托宿主操作系统。VMware ESXi、微软Hyper-V,还有开源的KVM、Xen都属于这类,服务器场景做虚拟化基本都会选用它。第二种Type 2,安装在已有的操作系统内部,像VMware Workstation、Oracle VirtualBox、Parallels Desktop都属于该类型。举个例子,你在Windows系统中安装VMware,再启动Ubuntu虚拟机,这里Windows就是宿主机,Ubuntu就是虚拟机。
宿主机想要承载虚拟机,硬件本身需要具备对应支持能力。CPU要带有虚拟化扩展指令集,Intel平台的这项功能叫VT-x,AMD平台则命名为AMD-V。这个选项在BIOS里默认大概率处于关闭状态,搭建虚拟机之前需要进入BIOS手动开启,不开启的话虚拟机要么无法启动,要么运行速度慢到无法正常使用。内存容量同样不能忽视,分配给虚拟机的内存会直接从宿主机可用内存中扣除。你给虚拟机划分8G内存,宿主机就会少掉8G可用内存。硬盘也是同理,虚拟磁盘文件保存在宿主机硬盘当中,虚拟机数量越多,占用存储空间就越大。
宿主机操作系统和虚拟机内部的操作系统可以不一样。宿主机跑Windows,虚拟机内部能够运行Linux、macOS,甚至另外一套Windows。二者互相隔离,虚拟机中毒一般不会传染到宿主机,除非你手动在两边传输文件。但这种隔离是单向的,如果宿主机出现蓝屏或者断电关机,所有在上面运行的虚拟机都会同步停止。
资源分配并不是简单的物理硬件切割。宿主机一共有16核CPU,你给虚拟机分配4核,并不是直接划出4个物理核心单独交给虚拟机,而是交由Hypervisor动态调度。多台虚拟机可以共用同一个物理核心,只要不会同时满载运行就可以。内存机制稍有区别,分配给虚拟机的内存一般会提前预留,宿主机不能再使用这部分内存。所以宿主机需要预留足够内存供给自身系统,剩余部分才能分配给虚拟机。
宿主机和虚拟机之间的网络连接存在几种常见模式。桥接模式会让虚拟机如同局域网内独立设备,拥有单独IP地址。NAT模式让虚拟机借助宿主机访问外网,外部网络无法直接识别这台虚拟机。仅主机模式只允许宿主机和虚拟机互相通信,无法访问外网。选择哪一种模式,看你的实际使用需求就行。
还有一个经常被误解的地方。宿主机就是物理机器,并不是虚拟机;虚拟机也不属于宿主机本身,是独立的逻辑计算机。可以拿楼房打比方,宿主机相当于整栋大楼,虚拟机就是大楼里分隔出来的房间。房间可以新增、改造、拆除,但大楼地基和承重墙不能改动。宿主机一旦关机,所有虚拟机都会停止运行。