KVM学习:基础功能
虚拟化:在X86平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(Virtual Machine Monitor,VMM),也叫做Hypervisor。虚拟机监控器的运行环境,也就是真实的物理机平台,称之为宿主机。而虚拟出来的平台通常称为客户机,里面运行的操作系统对应地也称为客户机操作系统。虚拟机监控器的主要职能是:管理真实的物理硬件平台,并为每个虚拟客户机提供对应的虚拟硬件
·
虚拟化:
在X86平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(Virtual Machine Monitor,VMM),也叫做Hypervisor。
虚拟机监控器的运行环境,也就是真实的物理机平台,称之为宿主机。
而虚拟出来的平台通常称为客户机,里面运行的操作系统对应地也称为客户机操作系统。
虚拟机监控器的主要职能是:管理真实的物理硬件平台,并为每个虚拟客户机提供对应的虚拟硬件平台。
实现虚拟化的重要一步就在于:虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重定向到虚拟资源池中。
“截获并重定向”的实现方式:软件虚拟化和硬件虚拟化。
软件虚拟化:纯软件的方法在现有的物理平台上实现对物理平台访问的截获和模拟。
QEMU:纯软件仿真,所有的指令都是软件模拟执行。
VMWare:动态二进制翻译,虚拟机监控器在可控制的范围内,允许客户机的指令在物理机平台上直接运行。
但是,客户机指令在运行前会被虚拟机监控器扫描,其中突破虚拟机监控器限制的指令会被动态替换为可以在物理平台上直接运行的安全指令。
硬件虚拟化:物理平台本身提供了对特殊指令的截获和重定向的硬件支持。
VMM将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM。
准虚拟化:
改动客户机操作系统,是它认识到自己运行在虚拟化环境下,能够与虚拟机监控器系统工作。
本质上,弱化了对虚拟机特殊指令的被动截获要求,将其转换成客户机操作系统的主动通知。
XEN是准虚拟化的例子。
全虚拟化:
全虚拟化为客户机提供了完整的虚拟X86平台。
不需要修改操作系统
KVM
虚拟化模型:
底层是整个物理系统,主要包括处理器、内存和输入输出设备
物理系统之上,与以往熟悉的操作系统模型不同,运行的是虚拟机监控器。
虚拟化类型:
类型一虚拟机是在系统上电之后首先加载运行VMM。
VMM一般会提供一个具有一定特权的特殊虚拟机,由这个特殊虚拟机来运行需要提供给用户日常操作和管理使用的操作系统环境。
ESX/ESXi、Xen、Hyper-V
类型二虚拟机监控程序,在系统上电之后仍然运行一般意义上的操作系统(俗称的宿主机操作系统)。
VMM作为特殊的应用程序,可以视作操作系统功能的扩展。
KVM、Virtual Box、VMware Workstation
KVM:Kernel-based Virtual Machine
伟大成就:
2006年10月,KVM模块的源代码正式进入Linux Kernel。
2010年11月,RHEL 6集成最新KVM,去掉了Xen。
KVM基于硬件虚拟化扩展(Intel VT或者AMD-V)技术,是Linux完全原生的全虚拟化解决方案。
KVM本身不执行任何模拟,需要用户空间应用程序(QEMU)通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。
KVM仅支持硬件虚拟化。打开并初始化系统硬件以支持虚拟机的运行,是KVM模块的职责所在。
在被内载加载的时候,KVM模块会先初始化内部的数据结构;
做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关;
通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于虚拟化模式中的根模式;
最后,KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令(QEMU)。
虚拟机的创建和运行将是一个用户空间的应用程序QEMU和KVM模块相互配合的过程。
QEMU:
虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。
遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口处QEMU,由QEMU来负责解析和模拟这些设备。
从QEMU的角度来看,也可以说QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,从而极大地提高了虚拟机的性能。
虚拟机的配置和创建,虚拟机运行依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术(诸如动态迁移),都是由QEMU自己实现的。
在使用qemu-kvm命令行启动客户机时,不一定需要root来操作,但是需要让当前用户对/dev/kvm这个接口具有可读可写权限。
另外,在涉及网络配置、设备分配等特权操作时,还是需要root的权限,所以为了简单起见,都采用root操作
CPU配置:
QEMU提供对CPU的模拟,展现给客户机一定的CPU数目和CPU的特性;
CPU指令的执行由硬件处理器的虚拟化功能(VT-x或者AMD-V)来辅助执行,效率非常高
在KVM环境中,每个客户机都是一个标准的Linux进程(QEMU进程),而每一个vCPU在宿主机中是QEMU进程派生的一个普通线程。
在KVM环境中,进程有三种执行模式:内核模式、用户模式和客户模式。
用户模式(Use Mode):
主要处理IO设备的模拟和管理,由QEMU代码实现。
内核模式(Kernel Mode):
主要处理特别需要高性能和安全相关的代码。
客户模式到内核模式的转换
处理客户模式下的IO指令或者其他特权指令引起的退出(VM-EXIT)
影子页表的处理
客户模式(Guest Mode):
主要执行客户机中的大部分指令。IO和一些特权指令除外。
-smp n[,maxcpus=MAX-CPUS][,cores=CORES][,threads=THREADS][,sockets=SOCKETS]
n: 客户机中使用的逻辑CPU数量(默认是1)
maxcpus: 客户机中最大可能被使用的CPU数量(可以实现CPU热插拔)
cores: 每个CPU socket上core数量(默认是1)
threads: 每个CPU core上的线程数量(默认是1)
sockets: 设置客户机中看到的总的CPU socket的数量
在宿主机中查看虚机对应的QEMU进程和线程
ps -efL | grep qemu
在客户机系统中查看cpu数量
ls /sys/devices/system/cpu/
CPU过载使用:
推荐做法:对多个单CPU的客户机使用OVER-COMMIT。
不推荐做法:让某一个客户机的vCPU数量超过物理机系统上的逻辑CPU数量。
CPU模型:
查看当前的QEMU支持的所有CPU模型:qemu-system-x86_64 -cpu ?
创建虚机时指定cpu模型
-cpu CPU_MODEL:-cpu SandyBridge
内存配置:-m
存储配置:
cache:
writethrough:双写磁盘和缓存
writeback:回写(先写缓存后刷磁盘)
none:只写磁盘
QEMU支持的镜像文件格式:
qemu-img -h 可以查看当前的镜像文件格式
raw:
qemu-img命令默认的文件格式。
如果客户机文件系统支持空洞,那么镜像文件只有在被写有数据的扇区才会真正占用磁盘空间。
但是COPY时,会占用所有的磁盘空间
qcow2
QEMU目前推荐的镜像格式。
支持稀疏文件(即支持空洞)以节省磁盘空间
支持AES加密
支持zlib压缩
支持多个虚机快照
客户机存储方式:
本地存储的客户机镜像文件
物理机磁盘或者磁盘分区
LVM,逻辑分区
注:磁盘分区或者LVM分区由于没有磁盘的MBR引导记录,不能作为客户机的启动镜像,只能作为客户机附属的非启动快设备。
NFS,网络文件系统
iSCSI
本地或光纤通道连接的LUN
GFS2
网络配置:
基于网桥的虚拟网卡:
在QEMU/KVM的网络使用中,网桥(bridge)模式可以让客户机和宿主机共享一个物理网络设备连接网络。
客户机有自己独立的IP地址,可以直接连接与宿主机一模一样的网络。
客户机可以访问外部网络,外部网络也可以直接访问客户机。
基于NAT的虚拟网络:
-net nic -net tap
QEMU/KVM中,默认使用IP伪装的方式去实现NAT,而不是使用SNAT或者DNAT。
在KVM中配置客户机的NAT网络方式,需要在宿主机中运行一个DHCP服务器给宿主机分配NAT内网的IP地址,可以使用dnsmasq工具来实现。
bridge-utils:包含管理bridge的工具brctl。
iptables:是对内核网络协议栈中IPv4包的过滤工具和NAT管理工具
dnsmasq:一个轻量级的DHCP和DNS服务器软件。
QEMU内置的用户模式网络:
-net nic -net user
用户模式网络是完全由QEMU自身实现的,不依赖于其他的工具(如前面提到的bridge-utils、dnsmasq、iptables)
QEMU使用Slirp实现了一整套TCP/IP协议栈,并且使用这个协议栈实现了一套虚拟的NAT网络
直接分配网络设备的网络(包括VT-d和SR-IOV)
图形显示:
SDL:
在QEMU模拟器中的图形显示默认就是使用SDL的,当然需要在编译qemu-kvm时配置对SDL的支持。
如果不想将SDL的支持编译进去,在编译配置qemu-kvm时加上--disable-sdl的参数即可。
在运行qemu命令的系统中必须安装SDL软件包
SDL只能图形界面中使用。通过ssh连接到宿主机创建虚机的方式不能使用。
VNC:
VNC(Virtual Network Computing)是图形化的桌面分享系统,它使用RFB(Remote FrameBuffer)协议来远程控制一台计算机系统。
VNC通过网络将控制端的键盘、鼠标的操作传递到远程受控计算机中,而将远程计算机中的图形显示屏幕反向传输回控制端的VNC窗口中。
在qemu-kvm命令行中,添加“-vnc display,option”参数就能让VGA显示输出到VNC会话中而不是SDL中。
-vnc [IP]:N 在IP主机上(若IP为空,则任何与宿主机联通的主机上)通过端口(5900+N)连接虚拟机的VNC-Server
-vnc CLIENT-IP:PORT,reverse 启动主机上自动连接上CLIENT-IP主机上PORT端口处于监听状态的VNC客户端,在客户端中显示启动过程
VNC显示中的鼠标偏移问题:
-usb -usbdevice tablet
或者 -device piix3-usb-uhci -device use-tablet
VNC关闭图形输出:
(1)客户机启动命令增加-nographic
(2)客户机系统的grub配置文件,将console输出重定向到串口ttyS0中
在X86平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(Virtual Machine Monitor,VMM),也叫做Hypervisor。
虚拟机监控器的运行环境,也就是真实的物理机平台,称之为宿主机。
而虚拟出来的平台通常称为客户机,里面运行的操作系统对应地也称为客户机操作系统。
虚拟机监控器的主要职能是:管理真实的物理硬件平台,并为每个虚拟客户机提供对应的虚拟硬件平台。
实现虚拟化的重要一步就在于:虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重定向到虚拟资源池中。
“截获并重定向”的实现方式:软件虚拟化和硬件虚拟化。
软件虚拟化:纯软件的方法在现有的物理平台上实现对物理平台访问的截获和模拟。
QEMU:纯软件仿真,所有的指令都是软件模拟执行。
VMWare:动态二进制翻译,虚拟机监控器在可控制的范围内,允许客户机的指令在物理机平台上直接运行。
但是,客户机指令在运行前会被虚拟机监控器扫描,其中突破虚拟机监控器限制的指令会被动态替换为可以在物理平台上直接运行的安全指令。
硬件虚拟化:物理平台本身提供了对特殊指令的截获和重定向的硬件支持。
VMM将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM。
准虚拟化:
改动客户机操作系统,是它认识到自己运行在虚拟化环境下,能够与虚拟机监控器系统工作。
本质上,弱化了对虚拟机特殊指令的被动截获要求,将其转换成客户机操作系统的主动通知。
XEN是准虚拟化的例子。
全虚拟化:
全虚拟化为客户机提供了完整的虚拟X86平台。
不需要修改操作系统
KVM
虚拟化模型:
底层是整个物理系统,主要包括处理器、内存和输入输出设备
物理系统之上,与以往熟悉的操作系统模型不同,运行的是虚拟机监控器。
虚拟化类型:
类型一虚拟机是在系统上电之后首先加载运行VMM。
VMM一般会提供一个具有一定特权的特殊虚拟机,由这个特殊虚拟机来运行需要提供给用户日常操作和管理使用的操作系统环境。
ESX/ESXi、Xen、Hyper-V
类型二虚拟机监控程序,在系统上电之后仍然运行一般意义上的操作系统(俗称的宿主机操作系统)。
VMM作为特殊的应用程序,可以视作操作系统功能的扩展。
KVM、Virtual Box、VMware Workstation
KVM:Kernel-based Virtual Machine
伟大成就:
2006年10月,KVM模块的源代码正式进入Linux Kernel。
2010年11月,RHEL 6集成最新KVM,去掉了Xen。
KVM基于硬件虚拟化扩展(Intel VT或者AMD-V)技术,是Linux完全原生的全虚拟化解决方案。
KVM本身不执行任何模拟,需要用户空间应用程序(QEMU)通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。
KVM仅支持硬件虚拟化。打开并初始化系统硬件以支持虚拟机的运行,是KVM模块的职责所在。
在被内载加载的时候,KVM模块会先初始化内部的数据结构;
做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关;
通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于虚拟化模式中的根模式;
最后,KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令(QEMU)。
虚拟机的创建和运行将是一个用户空间的应用程序QEMU和KVM模块相互配合的过程。
QEMU:
虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。
遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口处QEMU,由QEMU来负责解析和模拟这些设备。
从QEMU的角度来看,也可以说QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,从而极大地提高了虚拟机的性能。
虚拟机的配置和创建,虚拟机运行依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术(诸如动态迁移),都是由QEMU自己实现的。
在使用qemu-kvm命令行启动客户机时,不一定需要root来操作,但是需要让当前用户对/dev/kvm这个接口具有可读可写权限。
另外,在涉及网络配置、设备分配等特权操作时,还是需要root的权限,所以为了简单起见,都采用root操作
CPU配置:
QEMU提供对CPU的模拟,展现给客户机一定的CPU数目和CPU的特性;
CPU指令的执行由硬件处理器的虚拟化功能(VT-x或者AMD-V)来辅助执行,效率非常高
在KVM环境中,每个客户机都是一个标准的Linux进程(QEMU进程),而每一个vCPU在宿主机中是QEMU进程派生的一个普通线程。
在KVM环境中,进程有三种执行模式:内核模式、用户模式和客户模式。
用户模式(Use Mode):
主要处理IO设备的模拟和管理,由QEMU代码实现。
内核模式(Kernel Mode):
主要处理特别需要高性能和安全相关的代码。
客户模式到内核模式的转换
处理客户模式下的IO指令或者其他特权指令引起的退出(VM-EXIT)
影子页表的处理
客户模式(Guest Mode):
主要执行客户机中的大部分指令。IO和一些特权指令除外。
-smp n[,maxcpus=MAX-CPUS][,cores=CORES][,threads=THREADS][,sockets=SOCKETS]
n: 客户机中使用的逻辑CPU数量(默认是1)
maxcpus: 客户机中最大可能被使用的CPU数量(可以实现CPU热插拔)
cores: 每个CPU socket上core数量(默认是1)
threads: 每个CPU core上的线程数量(默认是1)
sockets: 设置客户机中看到的总的CPU socket的数量
在宿主机中查看虚机对应的QEMU进程和线程
ps -efL | grep qemu
在客户机系统中查看cpu数量
ls /sys/devices/system/cpu/
CPU过载使用:
推荐做法:对多个单CPU的客户机使用OVER-COMMIT。
不推荐做法:让某一个客户机的vCPU数量超过物理机系统上的逻辑CPU数量。
CPU模型:
查看当前的QEMU支持的所有CPU模型:qemu-system-x86_64 -cpu ?
创建虚机时指定cpu模型
-cpu CPU_MODEL:-cpu SandyBridge
内存配置:-m
存储配置:
cache:
writethrough:双写磁盘和缓存
writeback:回写(先写缓存后刷磁盘)
none:只写磁盘
QEMU支持的镜像文件格式:
qemu-img -h 可以查看当前的镜像文件格式
raw:
qemu-img命令默认的文件格式。
如果客户机文件系统支持空洞,那么镜像文件只有在被写有数据的扇区才会真正占用磁盘空间。
但是COPY时,会占用所有的磁盘空间
qcow2
QEMU目前推荐的镜像格式。
支持稀疏文件(即支持空洞)以节省磁盘空间
支持AES加密
支持zlib压缩
支持多个虚机快照
客户机存储方式:
本地存储的客户机镜像文件
物理机磁盘或者磁盘分区
LVM,逻辑分区
注:磁盘分区或者LVM分区由于没有磁盘的MBR引导记录,不能作为客户机的启动镜像,只能作为客户机附属的非启动快设备。
NFS,网络文件系统
iSCSI
本地或光纤通道连接的LUN
GFS2
网络配置:
基于网桥的虚拟网卡:
在QEMU/KVM的网络使用中,网桥(bridge)模式可以让客户机和宿主机共享一个物理网络设备连接网络。
客户机有自己独立的IP地址,可以直接连接与宿主机一模一样的网络。
客户机可以访问外部网络,外部网络也可以直接访问客户机。
基于NAT的虚拟网络:
-net nic -net tap
QEMU/KVM中,默认使用IP伪装的方式去实现NAT,而不是使用SNAT或者DNAT。
在KVM中配置客户机的NAT网络方式,需要在宿主机中运行一个DHCP服务器给宿主机分配NAT内网的IP地址,可以使用dnsmasq工具来实现。
bridge-utils:包含管理bridge的工具brctl。
iptables:是对内核网络协议栈中IPv4包的过滤工具和NAT管理工具
dnsmasq:一个轻量级的DHCP和DNS服务器软件。
QEMU内置的用户模式网络:
-net nic -net user
用户模式网络是完全由QEMU自身实现的,不依赖于其他的工具(如前面提到的bridge-utils、dnsmasq、iptables)
QEMU使用Slirp实现了一整套TCP/IP协议栈,并且使用这个协议栈实现了一套虚拟的NAT网络
直接分配网络设备的网络(包括VT-d和SR-IOV)
图形显示:
SDL:
在QEMU模拟器中的图形显示默认就是使用SDL的,当然需要在编译qemu-kvm时配置对SDL的支持。
如果不想将SDL的支持编译进去,在编译配置qemu-kvm时加上--disable-sdl的参数即可。
在运行qemu命令的系统中必须安装SDL软件包
SDL只能图形界面中使用。通过ssh连接到宿主机创建虚机的方式不能使用。
VNC:
VNC(Virtual Network Computing)是图形化的桌面分享系统,它使用RFB(Remote FrameBuffer)协议来远程控制一台计算机系统。
VNC通过网络将控制端的键盘、鼠标的操作传递到远程受控计算机中,而将远程计算机中的图形显示屏幕反向传输回控制端的VNC窗口中。
在qemu-kvm命令行中,添加“-vnc display,option”参数就能让VGA显示输出到VNC会话中而不是SDL中。
-vnc [IP]:N 在IP主机上(若IP为空,则任何与宿主机联通的主机上)通过端口(5900+N)连接虚拟机的VNC-Server
-vnc CLIENT-IP:PORT,reverse 启动主机上自动连接上CLIENT-IP主机上PORT端口处于监听状态的VNC客户端,在客户端中显示启动过程
VNC显示中的鼠标偏移问题:
-usb -usbdevice tablet
或者 -device piix3-usb-uhci -device use-tablet
VNC关闭图形输出:
(1)客户机启动命令增加-nographic
(2)客户机系统的grub配置文件,将console输出重定向到串口ttyS0中
更多推荐
已为社区贡献12条内容
所有评论(0)