虚拟化技术是指在一个物理主机上创建多个虚拟机,实现在同一台计算机上运行多个操作系统的技术。操作系统的虚拟化技术可以分为完全虚拟化和半虚拟化两种。
完全虚拟化
完全虚拟化指的是虚拟出的操作系统与物理主机是相互隔离的,它们之间的通信是由虚拟化软件来协调完成的。完全虚拟化的虚拟机不需要对操作系统内核进行修改,可以直接运行原生操作系统。主要通过Hypervisor来实现。Hypervisor是一种运行在裸机(bare metal)上的软件,它可以将主机的物理资源虚拟化为多个虚拟机。
完全虚拟化的过程如下:
- Hypervisor创建虚拟机,并将虚拟机的启动信息保存在虚拟机控制块中。
- 当虚拟机启动时,Hypervisor将处理器切换到虚拟机的上下文,以便虚拟机可以执行操作系统代码。
- 虚拟机将代码发送到Hypervisor,Hypervisor会将代码翻译为物理主机上可识别的指令并将其执行。
- 在虚拟机中运行的应用程序将与虚拟化软件进行通信,并将其视为主机内的其它程序。虚拟化软件工作在虚拟机的VMM内(虚拟化内存管理)以达到隔离的安全目的。
代码示例
以下是使用KVM (Kernel-based Virtual Machine)实现的一个完全虚拟化的虚拟机创建过程的示例代码:
# 安装KVM相关组件
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils virt-manager
# 创建Ubuntu虚拟机镜像
sudo ubuntu-vm-builder kvm trusty --suite=trusty --flavor=virtual --arch=amd64 --mirror=http://archive.ubuntu.com/ubuntu --rootsize=10240 --mem=1024 --user=<username> --pass=<password> --hostname=ubuntu --dest=/var/lib/libvirt/images/ubuntu.img --no-kvm --libvirt qemu:///system
# 启动虚拟机
sudo virsh create /etc/libvirt/qemu/ubuntu.xml
# 进入虚拟机
sudo virsh console ubuntu
半虚拟化
半虚拟化是指在虚拟机系统中预留出一部分系统调用与底层硬件进行通信,这样虚拟系统在调用这些系统调用的时候就不会受到完全虚拟化的性能损失了。半虚拟化主要需要修改操作系统内核以支持虚拟化。
半虚拟化的过程如下:
- 虚拟机在运行时调用系统调用时,最终进入的是虚拟化模块的系统调用函数。
- 虚拟化模块将虚拟化的参数和底层实际的物理参数进行参数转换,并调用物理系统调用进行操作。
- 物理系统调用完成后,将结果转换为虚拟系统可以识别的格式,然后返回给虚拟化模块。
- 虚拟化模块将返回值转换为虚拟机可识别的格式并返回给虚拟机。
代码示例
以下是使用Xen实现的一个半虚拟化的虚拟机创建过程的示例代码:
# 安装Xen相关软件
sudo apt-get install xen-hypervisor-4.4-amd64 xen-tools bridge-utils
# 创建虚拟机配置文件
sudo xen-create-image --hostname=mysystem --memory=512M --vcpus=2 --pygrub --noswap --dir=/etc/xen/
# 启动虚拟机
sudo xl create /etc/xen/mysystem.cfg