网站有了如何做推广,宁波网站seo公司,校园网站建设WBS,白嫖域名的申请地址【虚拟化】内核级虚拟化技术KVM介绍#xff0c;全/半虚拟化的区别#xff0c;使用libvirt搭建虚拟化平台#xff08;go/java/c#xff09; 文章目录 1、虚拟化技术分类与架构#xff08;KVM#xff0c;Xen#xff09;#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…【虚拟化】内核级虚拟化技术KVM介绍全/半虚拟化的区别使用libvirt搭建虚拟化平台go/java/c 文章目录 1、虚拟化技术分类与架构KVMXen全/半虚拟化的区别2、libvirt介绍3、使用libvirt搭建虚拟化平台 1、虚拟化技术分类与架构KVMXen全/半虚拟化的区别 根据运行介质分类裸金属虚拟化主机虚拟化多套了一层操作系统 根据虚拟化技术原理分类 全虚拟化KVM为主模拟一套真实的硬件设备半虚拟化Xen为主 或者KVMVirtIO性能更高通过调度策略优化资源使用 虚拟化定义
虚拟化主要指的是特殊的技术通过隐藏特定计算平台的实际物理特性为用户提供抽象的、统一的、模拟的计算环境称为虚拟机(IBM定义)。虚拟化为有效利用大型机的资源提供了技术支持。
面向主机的的虚拟机 vs 面向裸机的虚拟机
可以通过是否在裸机上部署来分为面向主机的的虚拟机和面向裸机的虚拟机。面向主机的虚拟机是指的在一台已经安装操作系统的主机上安装虚拟机管理(VMM)程序而面向裸机的是指在裸机上直接安装虚拟机管理程序。所有的虚拟机调用都是直接由虚拟机管理程序来负责没有了操作系统这一步所以这种方式在效率上要高于面向主机的。不过比较流行的技术比如vmwarexen都是面向主机的。
全虚拟化 vs 半虚拟化
Full Virtualization全虚拟化几乎是完整地模拟一套真实的硬件设备。大部分操作系统无须进行任何修改即可直接运行在全虚拟化环境中。像kvm等技术是全虚拟化。Paravirtualization半虚拟化不对硬件设备进行模拟虚拟机拥有独立的运行环境通过虚拟机管理程序共享底层的硬件资源。大部分操作系统需要进行修改才能够运行在半虚拟化环境中。 它的性能要稍微高于全虚拟化。像Xen。因为需要改动托管系统的内核所以xen是不支持win虚拟机的。 操作系统通过特定的Hypercall与全虚拟化不同来直接与Hypervisor通信以执行敏感操作如内存分配、设备连接等。 对于多核处理KVM通过调度策略优化CPU资源的使用。Partial Virtualization部分虚拟化仅仅提供了对关键性计算组件或者指令集的模拟。操作系统可能需要做某些修改才能够运行在部分虚拟化环境中。补充Hypercall 是一种机制允许虚拟机VM直接与Hypervisor进行通信。 Hypercalls的功能类似于系统调用system call但针对的是运行在虚拟化环境中的客户机操作系统与Hypervisor之间的交互。通过hypercall虚拟机可以请求Hypervisor提供特定的服务。 Hypervisor 又称为虚拟机监控器是一层运行在物理硬件上或操作系统上方的虚拟化软件。它负责创建、管理和调度虚拟机并提供对物理资源的访问。 Hypercall是虚拟机与Hypervisor之间的通信接口而Hypervisor是负责管理虚拟机与物理计算资源的软件组件。通过hypercall虚拟机可以高效地请求Hypervisor的服务。
传统虚拟化架构半虚拟化和 KVM虚拟化架构全虚拟化
内核级虚拟化技术Kernel-based Virtual Machine简称KVM 嵌入到Linux正式Kernel提高兼容性 代码级资源调用提高性能 虚拟机就是一个进程内存易于管理 直接支持NUMA技术提高扩展性KVM只是虚拟化解决方案的一部分想要实现全虚拟化还需要的条件是 1 CPU处理器提供的虚拟化支持(VT-x 硬件辅助虚拟化可以为GuestOS创建虚拟化处理器本质是对寄存器的隔离模拟和对指令集的划分)。 2 内存可以通过kvm虚拟化成独立的虚拟化地址(/dev/kvm) 3I/O虚拟化(QEMU) 所以说 KVM虚拟化 KVM内核模块 /dev/kvm QEMU
kvm全虚拟化原理
1/dev/kvm Linux操作系统标准内核中的KVM内核模块生成了一个名为/dev/kvm的设备有了/dev/kvm设备使得GuestOS的地址空间(内存地址、磁盘地址)能够独立于标准内核或其他任何GuestOS的地址空间。 KVM内核模块通过/dev/kvm设备提供了内存虚拟化给予GuestOS与内核或者其他GuestOS相对独立的地址空间。每个GuestOS都有自己的地址空间并且这些地址空间是在实例化GuestOS时创建映射的。 映射给GuestOS的物理内存实际上是映射给这个GuestOS在VMM中相应进程的虚拟内存。 所以总的来说/dev/kvm设备的作用就是将不同的GuestOS之间的地址隔离或将GuestOS和HostOS(VMM)之间的地址隔2QEMU QEMU是一个I/O虚拟化解决方案能够对一个完整的计算机物理层环境进行虚拟化(EG. 磁盘、图形适配器、网络设备)。 在GuestOS中生成的所有I/O请求都会被QEMU中途截获并重新发送到QEMU进程模拟的User Mode中。3Openstack、KVM、QEMU KVM 用来模拟 CPU 的运行但缺少了对 Network 和 I/O 的支持。QEMU-KVM 是一个完整的模拟器它基于 KVM 上提供了完整的 Network 和 I/O 支持。 其中 Openstack 为了跨 VM 性所以不会直接控制 QEMU-KVM而是通过 libvit 的库去间接控制 QEMU-KVM 。
参考资料1,
2、libvirt介绍 kvm、libvirt、qemu三者的关系与区别 KVM 是 Linux 系统的虚拟化核心提供直接的硬件支持允许多个操作系统在同一物理机上运行。QEMU 是一个 emulator 和 hypervisor能够模拟多种硬件架构并与 KVM 结合使用以实现高效的虚拟化。libvirt 是一个底层管理工具集和 API提供与 KVM 和 QEMU 的交互使得虚拟机的创建、配置、监视等操作更为便捷。virt-manager 是一个工具基于 libvirt 提供的功能提供了图形化管理的便捷性。Proxmox VE 是一个集成平台它使用 libvirt 来管理 KVM 和 LXC但提供了更完整的功能和用户界面。VMware ESXi 是一个独立的专有平台提供全面的虚拟化支持但相较于前面提到的工具更为封闭。 libvirt 是一个开源的 API工具和守护进程集用于管理虚拟化平台。 它提供了一种统一的方法来与各种虚拟化技术如 KVM, QEMU, Xen, LXC 等进行交互。
统一接口 libvirt 提供了一个一致的 API使得开发人员可以使用相同的方式管理不同的虚拟化技术。这消除了与多个虚拟化平台直接交互的复杂性。支持多个虚拟化技术 - 支持 KVM、Xen、VMware、LXC、OpenVZ、QEMU 等多种后端允许用户在同一平台上运行多种虚拟机。丰富的功能 虚拟机管理创建、删除、启动、停止、暂停和恢复虚拟机。 网络管理创建和管理虚拟网络DNS、DHCP 服务等。 存储管理管理虚拟磁盘、快照和存储池。 资源监控收集虚拟机及宿主机的性能数据。安全性 提供了与 SELinux 和 AppArmor 等安全模块的集成增强了对虚拟环境的安全管理。广泛的语言绑定 libvirt 提供了多种编程语言的绑定包括 C, Python, Java, Go 等方便开发者在自己熟悉的环境中使用。图形界面工具 提供了如 virt-manager 的图形界面工具简化了虚拟机的管理操作。
使用场景 数据中心虚拟化广泛应用于数据中心的虚拟化管理可以高效地管理和调度多个虚拟机。 开发与测试环境开发人员可以快速创建和销毁虚拟机进行测试而不影响主操作系统。 私有云解决方案作为许多云平台的基础组件libvirt 可以帮助构建和管理私有云基础架构。
# 虚拟化简单环境
yum:
- qemu-kvm
- libvirt
- virt-install
- virt-manager
- libguestfs-tools
- bridge-utils
参考资料12
3、使用libvirt搭建虚拟化平台
libvirt的使用
Libvirt主要由三个部分组成API库一个守护进程libvirtd和一个默认命令行管理工具 virsh。Tips在Python、Perl、Java、Ruby、PHP、OCaml等高级编程语言中已经有libvirt的程序库可以直接使用。守护进程 守护进程daemon是生存期长的一种进程。它们常常在系统引导装入时启动仅在系统关闭时才终止。因为它们没有控制终端所以说它们是在后台运行的。1, 2 守护进程程序的名称通常以字母d结尾以指明这个进程实际是守护进程并与普通的电脑程序区分开来。例如syslogd就是指管理系统日志的守护进程sshd是接收传入SSH连接的守护进程。 什么时候需要写一个 Daemon 日常工作中我们经常需要写一个脚本来处理一些事情例如消息推送与商户系统进行对账数据迁移商户后台系统健康度监测其他的一些处理任务etc 其实说是 Daemon但这里更多的案例是定时任务使用 crontab 定时拉起 Daemon 进行任务处理。libvirtd的使用 1, 2 libvirt sdk
virsh net-start default
systemctl start libvirtd systemctl enable libvirtd
libvirt-go
package mainimport (github.com/libvirt/libvirt-go-xmlgithub.com/libvirt/libvirt-golog
)func main() {// 连接到 libvirt 守护进程conn, err : libvirt.NewConnect(qemu:///system)if err ! nil {log.Fatalf(Failed to connect to hypervisor: %v, err)}defer conn.Close()// 列出所有虚拟机doms, err : conn.ListAllDomains(0)if err ! nil {log.Fatalf(Failed to list domains: %v, err)}for _, dom : range doms {name, _ : dom.GetName()log.Printf(Domain: %s, name)}
}libvirt-java
import org.libvirt.*;public class LibvirtExample {public static void main(String[] args) {try {// 连接到 libvirt 守护进程Connection conn new Connect(qemu:///system, false);// 列出所有虚拟机String[] domainIds conn.listDomains();for (String id : domainIds) {System.out.println(Domain: id);}conn.close();} catch (LibvirtException e) {e.printStackTrace();}}
}libvirt C API
#include libvirt/libvirt.h
#include iostreamint main() {// 连接到 libvirt 守护进程virConnectPtr conn virConnectOpen(qemu:///system, nullptr);if (conn nullptr) {std::cerr Failed to connect to hypervisor. std::endl;return 1;}// 获取所有虚拟机名称int numDomains 0;virDomainPtr* domains;domains virConnectListAllDomains(conn, numDomains);for (int i 0; i numDomains; i) {char* name virDomainGetName(domains[i]);std::cout Domain: name std::endl;virDomainFree(domains[i]);}virConnectClose(conn);return 0;
}参考资料1 2, 3