当前位置: 首页 > Linux

OpenCloudOS轻量级虚拟化引擎LiKeX介绍

时间:2023-04-06 20:21:55 Linux

虚拟化技术是云计算的基础。目前大量公有云和私有云环境选择KVM作为hypervisor。作为Type2系统级硬件辅助虚拟化技术的典型解决方案,KVM相比Xen有以下优势:KVM作为Linux内核模块实现,硬件生态兼容性和扩展性更好;KVM不实现调度等功能,而是依赖于Linux内核的实现,比如Linux调度器,充分利用Linux内核的成熟模块,实现相对精简的实现。但是随着FaaS、Serverless等新场景的出现,现有的KVM实现变得复杂起来。新场景往往以容器为中心,虚拟化技术在新场景中的主要作用是弥补传统容器技术隔离性的不足。因此,KVM技术需要进一步轻量化。Rust已被业界广泛认可为内存安全语言。但是Rust语言不仅追求安全,在并发和性能方面也有不俗的表现。因此,Rust不仅被AWS、微软、谷歌等众多大公司用于应用软件的开发,也被用于构建操作系统。比如氧化还原操作系统。Rust正逐渐成为未来底层软件开发的首选语言。目前,Rust已经被Linux内核开源社区接受为一种开发语言,主要用于Linux内核驱动模块的开发。1.为什么选择LiKeX?LiKeX是对KVM的Rust重构,但它不仅仅是简单的重构。LiKeX中的“Li”代表轻量级,“K”代表KVM,“e”代表扩展,“X”是下一代云原生OS项目的统一后缀。LiKeX项目开发的目标是为FaaS场景提供轻量级的Hypervisor解决方案。在架构设计上,考虑到FaaS应用的单实例生命周期短、单实例资源占用低、实例密度高等特点,LiKeX在很多设计上都与KVM有很大不同。部分比较项如下:项KVM指标含义实现语言CRustlapic/ioapic/pic模拟结合多种实现方式lapic内核模拟,ioapic/pic用户态模拟PIT模拟内核或用户态支持不实现KVM设备文件/vm/vcpu各layer是一个独立的文件句柄共享一个文件句柄指令来模拟内核态实现用户态使用eptmisconfig实现mmio处理,通过mmu页表跟踪mmio区域。KVM的设备模拟组件VMM可以很容易地移植到LiKeX中。2.LiKeX现状目前,LiKeX项目已经开源到OpenCloudOS社区,并在社区内持续发展。同时,LiKeX项目也实现了阶段性目标。它可以加载一个用户态程序运行在Guest模式,并且支持多个memslots。测试程序(简化版)://访客运行程序constunsignedcharcode[]={0xba,0xf8,0x03,/*mov$0x3f8,%dx*/0x00,0xd8,/*add%bl,%al*/0x04,'0',/*add$'0',%al*/0xee,/*out%al,(%dx)*/0xb0,'\n',/*mov$'\n',%al*/0xee,/*out%al,(%dx)*/0xf4,/*hlt*/};//访客内存区structkvm_userspace_memory_regionregion={.slot=0,.flags=0,.guest_phys_addr=0,.memory_size=0x1000,};structkvm_regsregs={.rip=0,.rax=2,.rbx=2,.rflags=0x2,};voidmain(void){fd=open("/dev/rust_kvm",O_RDWR);//打开rust_kvm设备ret=ioctl(fd,KVM_CREATE_VM,0);//创建虚拟机mem=(unsignedlong)mmap(NULL,0x1000,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_SHARED|MAP_ANONYMOUS,-1,0);内存集((字符*)米em,0,4096);memcpy((char*)mem,code,sizeof(code));//将Guest态code复制到当前进程region的某个地址空间.userspace_addr=(uint64_t)mem;ret=ioctl(fd,KVM_SET_USER_MEMORY_REGION,®ion);//将Guest地址空间传递给内核部分给rust_kvmret=ioctl(fd,KVM_CREATE_VCPU,0);//创建VCPUrun=(structkvm_run*)mmap(NULL,0x1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);memset((char*)&sregs,0,sizeof(sregs));ioctl(fd,KVM_GET_SREGS,&sregs);sregs.cs.base=0;sregs.cs.selector=0;ioctl(fd,KVM_SET_SREGS,&sregs);ioctl(fd,KVM_SET_REGS,®s);ioctl(fd,KVM_GET_REGS,®s);while(loop0<8){ioctl(fd,KVM_RUN,NULL);//进入Guest态运行switch(run->exit_reason){//退出Guest态,根据退出原因调用用户态对应的处理函数/*handleexit*/caseKVM_EXIT_HLT:return;案例KVM_EXIT_IO:if(run->io.direction==KVM_EXIT_IO_OUT&&run->io.size==1&&run->io.port==0x3f8&&run->io.count==1)printf("exitio:%c\n",(*(((char*)run)+run->io.data_offset)));休息;caseKVM_EXIT_FAIL_ENTRY:printf("输入失败\n");memset((char*)®s,0,sizeof(regs));ioctl(fd,KVM_GET_REGS,®s);返回;caseKVM_EXIT_INTERNAL_ERROR:printf("内部错误\n");返回;默认值:printf("默认值:0x%x\n",运行->exit_reason);返回;}循环0++;}}内核部分运行结果:?rust_kvm:RustKVMOpenrust_kvm:Rustkvm:vmcs=ffff888110f02000,revision=4rust_kvm:writtennewcr4valuerust_kvm:Rustkvm:IOCTL_KVM_CREATE_VMrust_kvm:Rustkvm:IOCTL_KVM_SET_USER_MEMORY_REGIONrust_kvm:add_memory_regionslot=0,uaddr=7f531f3e5000,gpa=0,npages=1rust_kvm:Rustkvm:IOCTL_KVM_CREATE_VCPUrust_kvm:RkvmMmuhpa(va)=ffff88811d6ed000rust_kvm:RkvmMmuhpa(phy)=11d6ed000rust_kvm:ad_disabled=false,ecex_only=truerust_kvm:setuppin=17,cpu=a581e5f2,cpu2=82,exit=3fefff,entry=d1ffrust_kvm:pin_based=17rust_kvm:cpu_based=a581e5f2rust_kvm:cpu_2nd_based=82rust_kvm:vcpu_vmcs_initrust_kvm:init_mmu_rootrust_kvm:hpa=11d6ed000,eptp=11d6ed01erust_kvm:Rustkvm:IOCTL_KVM_CREATE_VCPUfinishrust_kvm:RustKVMmmaprust_kvm:Rustkvm:IOCTL_KVM_GET_SREGSrust_kvm:Rustkvm:IOCTL_KVM_VCPU_RUNrust_kvm:vcpu_run状态guestrip=0,读取guestrip=0rust_kvm:vmentry:launched=falrusust_kvm:EnterhandleEPTviolationrust_kvm:pagefault:pfn=1999950rust_kvm:rkvm_tdp_maplevel=4,gfn=0,spte=14a55c907rust_kvm:rkvm_tdp_maplevel=30,spte=1567bf907rust_kvm:rkvm_tdp_maplevel=2,gfn=0,spte=11bcc5907rust_kvm:rkvm_tdp_maplevel=1,gfn=0,spte=6000001e844eb07rust_kvm:ret=Ok(1),vcpu_exit_handler:vcpu_exit_handler:vcpu_exit_handler:vrust_k启动后guest_rip=7rust_kvm:handle_ioport=3f8rust_kvm:ret=Ok(0),在vcpu_exit_handlerrust_kvm:vmentry:launched=truerust_kvm:vmexit:guest_rip=9rust_kvm:handlehltrust_kvm:ret=LiOk(0),在vhc之后OS的一部分,它的位置在整个系统中是这样的:从架构上来说,分为两部分,Guest和Host。LiKeX作为Host部分的重要组成部分,为设备模拟组件VMM和容器编排引擎提供了更轻量级的支持,更安全的Rust基础,保证兼容原有协议,并根据用户需求扩展新协议,实现自主可控的下一代云原生操作系统III。总结从整个OpenCloudOS云原生操作系统来看,LiKeX为系统虚拟化的基础提供了一个轻量级、安全的Hypervisor,可以更好的支持上层FaaS等新场景。总之,LiKeX项目希望从架构和功能两个方面,用Rust语言重新开发适合FaaS等新场景的轻量级、安全的Hypervisor,从而达到提高容器部署密度、启停速度、和隔离安全。目前,LiKeX项目已经在GitHub上开源。欢迎对该项目感兴趣的开发者加入我们,共同构建LiKeX代码。项目地址:https://github.com/OpenCloudOS/LiKeX欢迎扫描下方二维码,加入社区用户群,了解OpenCloudOS最新动态,获取技术支持,分享交流经验。