1.字节跳动在Mac mini M1的源用QEMU/KVM虚拟化上的探索与实现
2.QEMU与KVM笔记23-SeaBIOS剖析
3.KVM虚拟机——QEMU代码结构分析
4.QEMU-KVM完整架构
5.虚拟化技术 — QEMU-KVM 基于内核的虚拟机
6.Qemu-kvm虚拟机搭建
字节跳动在Mac mini M1的QEMU/KVM虚拟化上的探索与实现
字节跳动SYS Tech公众号分享了一篇文章,探讨了在Mac mini M1上采用QEMU/KVM虚拟化技术的码解探索和实践。随着Apple转向ARM架构,源用对ARM平台的码解MacOS虚拟化支持尚处于起步阶段,字节跳动STE和App Infra团队领先一步进行了深入研究。源用
他们的码解西安到广西源码方案基于Linux(Asahilinux),一个针对M1机型做了大量逆向工程分析的源用版本,它逐渐被纳入Linux主流。码解虚拟化过程中,源用团队采用了开源的码解QEMU作为核心,它构建了通用的源用虚拟化框架,并针对ARM平台扩展了对Mac mini M1的码解支持。KVM则提供了硬件加速,源用使得虚拟机内部指令能在虚拟机CPU上下文中执行,码解提高了性能。源用
实现M1机型模拟的关键在于模拟M1 VCPU,包括其特有寄存器、电源管理模块(PMGR)、多核通信机制,以及内存布局。内存布局需要确保CPU地址域和设备地址域的正确划分,避免内存冲突。M1的设备模拟则涉及virtio设备,如virtio-blk和virtio-net,并通过模拟中断控制器AIC来管理中断。
虚拟化下的MacOS启动过程简化了LLB和iBoot阶段,直接在QEMU中进行早期设备初始化和预加载。启动流程分为四个阶段:QEMU阶段,早期初始化,Kernel阶段,以及用户态服务和进程启动。尽管已取得进展,但还有待优化,如更完善的运行时环境、兼容不同版本的gtk2.0源码MacOS和性能提升等。
整体架构图显示,虚拟化环境中包含M1物理机、Asahilinux内核、KVM硬件加速模块和模拟M1的用户态QEMU,以及运行在QEMU上的MacOS Guest OS。未来,团队将继续优化以提供更全面的功能、性能和兼容性。
QEMU与KVM笔记-SeaBIOS剖析
在深入探讨SeaBIOS剖析的过程中,我们将关注其在QEMU环境中的作用。SeaBIOS是为QEMU设计的一种BIOS替代方案,旨在提供更高级的虚拟化功能和更好的性能。
SeaBIOS的初始化及加载是其关键部分,这个过程涉及对主板固件的配置。具体来说,初始化步骤包括硬件配置文件的加载,而加载过程则涉及到从存储设备上获取SeaBIOS的引导映像。
硬件配置在SeaBIOS中由hw\i\pc_piix.c文件提供支持。该文件包含了对不同主板架构的特定机器选项定义,例如pc_ifx_8_2_machine_options和pc_ifx_machine_options函数。这些函数用于配置特定平台的硬件特性,确保SeaBIOS能够正确识别和初始化硬件。
在初始化阶段,SeaBIOS首先进行固件的初始化,这涉及到对各种硬件设备的驱动程序进行加载和配置,确保系统在启动时能够正常识别和使用这些设备。随后,SeaBIOS会加载必要的引导程序,准备启动操作系统。
加载过程包括从引导设备(如硬盘或U盘)获取SeaBIOS引导映像,通常是一个名为seaBIOS.bin的文件。这个映像包含了SeaBIOS的核心代码和引导加载程序(GRUB、LILO等),使得系统能够在SeaBIOS的建仓补仓指标源码控制下启动。
值得注意的是,在CPU复位后,SeaBIOS将接管控制权,负责启动过程中的大部分活动,包括加载操作系统内核和初始化硬件环境。这一过程确保了系统的稳定启动和高性能运行。
总之,SeaBIOS的初始化和加载过程对于QEMU环境中的虚拟机启动至关重要。通过正确配置硬件、加载引导映像并执行必要的初始化操作,SeaBIOS能够提供高效、稳定的虚拟化环境,为各种操作系统和应用提供支持。
KVM虚拟机——QEMU代码结构分析
本文概述了QEMU的代码结构,特别是解析了QEMU如何将客户机代码转化为TCG代码和主机代码执行的过程,以及QEMU与KVM的关联。QEMU作为模拟器,通过微型代码生成器(TCG)将目标代码转化为主机代码,分为目标代码到TCG中间代码,再到主机代码两步骤。
QEMU的主要执行起点在vl.c,初始化虚拟硬件环境并进入不同模块如/cpus.c, /exec-all.c, /exec.c, /cpu-exec.c进行后续操作。硬件模拟部分,/hw/目录下的设备模块负责模拟各种硬件。QEMU支持多种CPU架构,如x, PPC, ARM等,通过./configure进行配置并编译相应架构的代码。
TCG的核心在于动态翻译,0.9.1版本之前采用DynGen,生成的代码通过缓存提高效率。QEMU使用TB链优化代码执行,涉及代码缓存、静态代码和TB链的交互。在代码执行过程中,股票源码导出QEMU的核心函数如main_loop, qemu_main_loop_start, 和cpu_exec等承担了关键作用,通过TB链和TCG执行主机代码。
QEMU与KVM的联系体现在用户空间的QEMU通过IOCTL与内核空间的KVM模块通信,如创建KVM、KVM_RUN中断处理以及KVM_IRQ_LINE中断注入。KVM与QEMU交互频繁,如初始化硬件设备、CPU循环和中断处理等。
QEMU-KVM完整架构
QEMU-KVM的完整架构图揭示了虚拟化技术的深入细节,包括QEMU的运行机制、KVM的组件以及虚拟机资源的虚拟化过程。
架构图分为三个部分:左上角是VMX root模式的应用层,代表宿主机模式;下方是VMX root模式的内核层,即引入VT-x指令集后的CPU状态。右上半部分是虚拟机运行环境,运行在VMX non-root模式,模拟的CPU在用户程序和虚拟OS内核时切换到此模式。运行模式与特权等级独立,虚拟机在root和non-root模式下都使用ring0至ring3的特权级别。
图的左上角描述了QEMU的核心职责,它创建虚拟硬件、CPU线程和虚拟内存,根据设备配置虚拟设备,并在运行时处理来自虚拟机的各种事件,如设备IO和管理界面交互。
右上半部分显示虚拟机的运作,操作系统在虚拟环境中透明运行,每个vCPU在QEMU进程中的线程由宿主机调度执行。虚拟内存管理和设备驱动都在各自的层次中进行,KVM负责虚拟地址到宿主机物理地址的映射,并处理虚拟机的IO请求。
最后,图的下半部分展示了内核中的KVM驱动,它作为杂项设备驱动,word源码自动生成通过"/dev/kvm"提供接口,允许用户态程序如QEMU配置虚拟机,同时处理虚拟机的退出事件。
虚拟化技术 — QEMU-KVM 基于内核的虚拟机
探索虚拟化之巅:QEMU-KVM的基石与高效运行 QEMU-KVM,作为Linux内核集成的高效虚拟化解决方案,其核心是TYPE1 Hypervisor,利用硬件辅助虚拟化技术,与Linux内核紧密协作,以卓越的性能和资源管理能力脱颖而出。理解KVM,首先要知道它如何在硬件支持下,作为内核模块,提供对虚拟环境的控制与优化,确保兼容性和效率。 年,KVM正式加入Linux大家庭,支持多核架构(SMP)和NUMA,其功能扩展至Live Migration和Kernel Same-page Merging(KSM),显著提升了虚拟机的动态迁移和内存管理效率。启动时,KVM内核模块kvm.ko以Root Mode初始化,通过User Application QEMU,如魔术般模拟虚拟硬件,为虚拟机提供服务。 QEMU,由天才开发者Fabrice Bellard于年推出,作为TYPE2 Hypervisor,它凭借动态二进制翻译技术,兼容多种CPU架构和设备模拟,尽管性能相较于KVM稍显逊色,但QEMU的灵活性使其与KVM结合,孕育了QEMU-KVM这一强大分支,两者共同推动虚拟化技术的革新。 KVM软件组件包括:内核模块kvm.ko、开源虚拟机管理器QEMU、在云服务商如AWS和阿里云中应用的QEMU-KVM,以及virtio驱动,它们共同构建起虚拟化技术的坚实基础。 尽管QEMU-KVM分支是QEMU的一部分,但在KVM环境中,我们更倾向于称QEMU作为KVM的执行引擎。KVM工作原理巧妙,kvm.ko在内核空间,通过/dev/kvm与用户空间进行实时交互,提供libkvm库。QEMU通过系统调用如open、close和ioctl来访问KVM接口,实现CPU、内存和I/O的虚拟化,而VM的管理和I/O模拟则由QEMU独立处理。 创建虚拟机的过程,如同艺术般的精密操作:首先打开/dev/kvm,通过ioctl命令创建VM,配置硬件抽象层(HVA)与物理地址(HPA),以及模拟PCI设备。接着映射QEMU镜像,构建vCPU,并启动Guest OS。在此过程中,主线程持续监听VM的退出事件,以响应虚拟环境中的中断和设备访问等。 当缺页中断或设备访问引发退出事件时,KVM接管CPU,Linux内核通过ioctl与QEMU交互,管理虚拟机及其vCPU。KVM支持三种运行模式:User、Kernel(根模式)和Guest(非根模式)。QEMU通过/dev/kvm实现内存虚拟化,创建全局页表(GPA)映射,确保Guest OS的隔离性。对于I/O虚拟化,QEMU负责模拟设备并捕获I/O请求,构建出QEMU-KVM的架构,由vCPU、虚拟内存、虚拟I/O和Guest OS构建,形成独特的用户进程结构。 QEMU-KVM的架构设计巧妙,vCPU在Host OS的调度下,由Guest OS和Host OS共同管理,形成两层调度:Guest OS负责高级调度,而Host OS(Linux Scheduler)负责低级调度,涉及vCPU线程、QEMU线程和物理CPU。KVM支持SMP和NUMA,允许用户自定义虚拟机的vCPU布局,确保在迁移时CPU模型的安全性。 通过-qemu-kvm命令,开发者可以定制VM的CPU配置,选择自定义模型和特性,但需注意,软件模拟可能影响性能。默认情况下,使用-host模型,磁盘设备选项丰富多样,包括文件路径、接口类型、索引和格式。启动选项如-boot则用于指定引导设备,根据架构支持不同的字符标识。QEMU的网卡模拟功能强大,支持多种NIC类型、MAC地址和VLAN,甚至可通过Tap接口连接物理网络,支持用户模式的网络栈设计。 虚拟化技术的卓越之旅,QEMU-KVM以卓越的性能和灵活性,引领着我们探索更高层次的计算世界。无论是基础配置还是高级特性,QEMU-KVM都以其卓越的工程设计,为云计算和虚拟化环境提供了强大的支撑。Qemu-kvm虚拟机搭建
KVM是基于Intel VT或AMD-V的X硬件的开源Linux原生全虚拟化解决方案。KVM中的虚拟机被实现为常规Linux进程,通过标准Linux调度程序进行调度。虚拟机的每个虚拟CPU被实现为一个常规Linux进程,利用Linux内核的已有功能。
KVM本身不执行任何硬件模拟,需要客户空间程序通过/dev/kvm接口设置虚拟服务器的地址空间,提供模拟的I/O,并将视频显示映射回宿主显示屏。目前这个应用程序是QEMU。
一、网络架构:桥接
在宿主机与虚拟机之间,网络关系有桥接、NAT、仅主机三种模式。使用桥接模式安装虚拟机。
图1.1展示了桥接的网络架构,需要在系统中配置一个网桥,相当于一台二层交换机。宿主机与虚拟机通信以及访问internet都通过网桥。在/etc/sysconfig/network-scripts/下创建ifcfg-br0文件。
进入ifcfg-br0并修改配置文件,再进入宿主机的以太网网卡,修改配置文件,将宿主机的以太网网卡桥接到网桥。修改完成之后重启网络配置。网络重启后运行brctl show。
图1.5显示ens已经桥接到了br0。
二、virt-manager图形化界面创建虚拟机
如果Linux系统带有桌面,可以使用virt-manager工具来创建虚拟机。使用yum install安装工具。
下载完成后打开virt-manager,弹出安装界面,证明成功。
三、virt-install命令行安装虚拟机
对于不带可视桌面的Linux服务器,可以使用命令行创建虚拟机。使用virt-install工具,通过yum install安装。
安装完成后需要安装vnc服务,通过vnc连接安装好的虚拟机。使用Virt-install命令创建虚拟机。
示例:创建完成后使用virsh list --all查看,我们创建的虚拟机ct7已运行。
远程连接查看:输入密码,链接成功证明安装成功。
注:如果配置完成之后无法通过vnc链接,则可能是网桥配置错误。
QEMU与KVM架构介绍
本文旨在深入探讨QEMU与KVM架构,它们在虚拟化领域的核心角色和工作原理。
虚拟化是通过抽象和分层,将底层复杂资源转化为上层易于使用的资源,简化资源管理。虚拟机是虚拟化的重要载体,提供执行环境,如进程作为简单的虚拟机,模拟器如QEMU处理不同硬件架构的兼容,高级语言虚拟机如JVM提供字节码执行环境,而系统虚拟机如KVM则实现全系统隔离。
QEMU作为模拟器,负责用户程序和系统虚拟化的模拟,而KVM作为内核模块,提供给用户空间接口创建虚拟机,初期通过与QEMU配合完成核心CPU和内存虚拟化。QEMU-KVM架构展示了两者如何协同工作,包括虚拟机的CPU、内存、外设等虚拟化过程。
具体来说,QEMU在初始化虚拟机时设置虚拟CPU寄存器,调用KVM接口启动,虚拟机在VM Exit和VM Entry模式下运行,KVM负责虚拟机状态的管理。内存虚拟化涉及内存分配、地址转换,EPT技术优化访问性能。外设虚拟化则通过模拟设备接口,使得虚拟机与硬件设备交互无缝。
中断虚拟化是通过模拟和管理中断请求,提高虚拟机效率,KVM提供了对不同中断控制器的支持,以优化性能。通过以上分析,QEMU与KVM共同构建了虚拟化技术的基础架构。