| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 一文让你秒懂计算虚拟机化 -> 正文阅读 |
|
[系统运维]一文让你秒懂计算虚拟机化 |
一、计算虚拟化相关概念及技术1.虚拟化概念????云计算1.0时代使用的主要技术为虚拟化。虚拟化最大的功能就是将操作系统和应用程序都运行在虚拟机上。 ???? 虚拟化的本质就是:将原先的物理设别进行逻辑化,转化成一个文件夹或文件,实现软硬件的解耦。使用虚拟化后,物理服务器转变成一个文件夹或文件,这里面一般回包含两部分,一部分用来记录虚拟机的配置信息,另一部分用来保存用户数据的磁盘文件。 ???? 简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。 2.虚拟化本质?????? 本质上,虚拟化就是由位于下层的软件模块,通过向上一层软件模块提供一个与它原先所期待的运行环境完全一致的接口的方法,抽象出一个虚拟的软件或硬件接口,使得上层软件可以直接运行在虚拟环境上。 虚拟化的特点:
虚拟化层为多个虚拟机划分服务器资源的能力;
通过分区所建立的多个虚拟机之间采用逻辑隔离措施,防止互相影响。
将整个虚拟机(硬件配置、BIOS配置、内存状态、磁盘状态、CPU状态)储存在独立于物理硬件的一小组文件中。 封装也是虚拟化所有本质特性中最为重要的特性
虚拟机在封装为独立文件后,虚拟机迁移只需要把虚拟机设备文件和配置文件或磁盘文件复制到另一台主机上运行即可,而不用关心底层的硬件类型是否兼容,这就是相对硬件的独立性。 3.计算虚拟化技术的分类
4.常用名词宿主主机 Host Machine:???? 运行虚拟机的物理主机 宿主机操作系统 Host OS:? 宿主主机所安装的操作系统 客户机 Gust Machine/VM:? 运行在宿主机之上的虚拟机 客户机操作系统 Guest OS: 虚拟机安装运行的操作系统 Hypervisor/VMM:??????????????? 虚拟化监视器——所有虚拟化技术的核心(位于Host OS和Guest OS之间) Hypervisor主要实现两个基本功能: ①识别、捕获和响应虚拟机所发出的CPU特权指令或保护指令 ②它负责处理虚拟机队列和调度,并将物理硬件的处理结果返回给相应的虚拟机。 Hypervisor将负责管理所有的资源和虚拟环境。VMM可以看作一个为虚拟化而生的完整操作系统,掌控有所有资源(CPU、内存和V/O设备)。VMM承担管理资源的重任,其还需向上提供虚拟机VM用于运行Guest OS,因此VMM还负责虚拟环境的创建和管理。 在虚拟化架构下,主机内分为三个层次,硬件Host Machine,其之上为虚拟化监视器Hypervisor,之上创建虚拟机Gust Machine,虚拟机之上是Guest OS。应用安装在Guest OS之上。在一个Host Machine之上可以建立并运行多个Gust Machine。 5.虚拟化的类型|型和||型 (分类依据:Hypervisor的不同) |型虚拟化——裸金属虚拟化???? Hypervisor直接调用硬件资源,不需要底层HostOS,或者说在Ⅰ型虚拟化中,可以将Hypervisor看做一个定制的Host OS,除了起到VMM的作用外,一般不能在其上安装其它的应用。 ??? 采用该结构的虚拟化产品主要有: VMWare ESX Server、Citrix XenServer和FusionCompute 等。 ||型虚拟化——宿主型虚拟化???? 此模型的物理资源由Host OS(例如Windows,Linux etc.)管理,实际的虚拟化功能由VMM提供,而VMM作为底层操作系统(Windows或Linux等)上的一个普通应用程序,然后通过其再创建相应的虚拟机,共享底层服务器资源。VMM通过调用Host OS的服务来获得资源,实现CPU、内存和I/O设备的虚拟化。VMM创建出虚拟机VM后,通常将VM作为Host OS的一个进程参与调度。 ???? 采用该虚拟化产品主要有:VMware Workstation、Virtual PC等。 6.CPU虚拟化????? CPU虚拟技术可以将一个CPU虚拟成多个vCPU,技术原理就是在操作系统和硬件之间加上一层VMM层,并将特权指令拦截,由VMM来完成这些重要的调度(在X86里面由于有些敏感指令不是特权指令,会造成虚拟化的漏洞,目前的解决方法有半虚拟化、全虚拟化和硬件辅助虚拟化三种方式)。 计算虚拟化根据虚拟机所组成的设备类型包含CPU虚拟化、内存虚拟化、IO虚拟化。 CPU分级保护域在这种保护模式中,CPU被分成4个环——Ring0、Ring1、Ring2和Ring3,Ring 是指 CPU 的运行级别,,Ring0的权限最高,Ring1次之,Ring2再次之,Ring3最低。 Ring0的权限可以直接操作硬件,一般只有操作系统和驱动会允许拥有此权限。 Ring3的权限最低,所有的程序都可以拥有此权限。 为了保护计算机,一些危险的指令只能由操作系统执行,防止一些恶意软件随意地调用硬件资源,比如某个程序需要开启摄像头就必须向Ring0 的驱动程序请求开启,否则会被拒绝此类操作。 ?? 在普通主机上的操作系统所发出的指令分为两种类型:特权指令和普通指令。 ?? 特权指令:是指用于操作和管理关键系统资源的指令,这些指令只有在最高特权级上才能够运行,即必须在Ring 0级别上才能运行的指令。 ?? 普通指令:与特权指令相对的是普通指令,这些指令在CPU普通权限级别上就能够运行,即在Ring 3级别上就可以运行的指令。 ?? 在虚拟化环境下,还有一种特殊指令被称为敏感指令。敏感指令是指修改虚拟机的运行模式或宿主机状态的指令,也就是说是将Guest OS中原本需要在Ring 0模式下才能运行的特权指令剥夺特权后,交给VMM所执行的指令。 大型CPU虚拟化采取的是“特权解除”和“陷入模拟”方法 ??? 基本原理:将Guest OS运行在非特权级(特权解除),而将VMM运行于最高特权级(完全控制系统资源)。这个时候就出现了一个问题:如果虚拟机Guest OS发出特权操作指令怎么执行呢?因为所有虚拟机的系统都被解除了特权,于是“陷入模拟”就发挥作用了,它解除了Guest OS的特权后,Guest OS的大部分指令仍可以在硬件上直接运行,只有当执行到特权指令时,才会陷入到VMM模拟执行(陷入–模拟)。由VMM代替虚拟机向真正的硬件CPU发出特权操作指令。 ??? 程序中断:CPU在程序运行中系统外部、系统内部或者现行程序本身若出现紧急事件,CPU立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。 ???? CPU虚拟化经典方法结合原始操作系统具有的定时器中断机制,就完美解决了CPU虚拟化的问题。 x86CPU和大型机CPU??? 大型机CPU(包括后来发展的小型机)是PowerPC架构,即精简指令集RISC计算机架构。RISC架构的CPU指令集中,虚拟机特有的敏感指令是完全包括在特权指令中的,在虚拟机操作系统解除特权后,特权指令和敏感指令都可被正常陷入-模拟并执行,因为特权指令包含敏感指令,所以RISC架构的CPU采用特权解除和陷入模拟是没有问题的。 ???? 但是x86架构的CPU指令集是不同于RISC架构的CISC架构 ????? 在上图中可以看到CISC架构的CPU指令集的特权指令和敏感指令并不完全重合,具体来说,基于x86的CISC指令集有19条敏感指令不属于特权指令的范畴,这部分敏感指令运行在CPU的Ring 1用户态上。这会带来什么问题呢?显然,当虚拟机发出这19条敏感指令时,由于指令不属于特权指令,因而这些敏感指令不能陷入-模拟被虚拟机监视器(VMM)捕获,因此x86无法使用“解除特权”“陷入-模拟”经典的虚拟化技术方式实现X86架构的虚拟化。这样的问题被称为虚拟化漏洞问题。 x86采用三种方法实现CPU虚拟化:全虚拟化、半虚拟化、硬件辅助虚拟化 全虚拟化 ????? 将所有虚拟机发出的操作系统请求转发到虚拟机监视器(VMM),虚拟机监视器对请求进行二进制翻译(BinaryTranslation),如果发现是特权指令或敏感指令,则陷入到VMM模拟执行,然后调度到CPU特权级别上执行;如果只是应用程序指令则直接在CPU非特权级别上执行。然而其他的一些非敏感指令,是完全可以在物理CPU上直接执行并返回结果给guest的,这种方法需要过滤所有虚拟机发出的请求指令。 优点:不修改虚拟机操作系统,虚拟机的可移植性和兼容性较强,支持广泛的操作系统; 缺点:运行时修改Guest OS二进制代码,性能损耗较大,VMM开发难度较大。 半虚拟化 ???? 修改虚拟机操作系统Guest OS,让虚拟机系统Guest OS能够意识到自己是被虚拟化的,虚拟机操作系统会通过“超级调用”(Hypercall)用Hypervisor层来替换虚拟化中的敏感指令,从而实现虚拟化,而其它应用程序等非敏感或特权请求直接在CPU非特权级别上执行。 优点:半虚拟化中的Guest OS可以同时能支持多个不同的操作系统,虚拟化提供了与原始系统相近的性能。 缺点:半虚拟化中的Host OS只有针对开源的系统才能支持被修改,如Linux,而对于未开源的诸如Windows 系统,则无法实现半虚拟化。此外,被修改过的虚拟机操作系统Guest OS可移植性较差。 硬件辅助虚拟化 虚拟化漏洞问题的解决,无论全虚拟还是半虚拟,都默认一个前提,即物理硬件是不具备虚拟化识别功能的,因此必须识别出这19条敏感指令,并通过虚拟化监视器VMM进行陷入——模拟。 目前主流的x86主机的CPU都支持硬件虚拟化技术,即Intel推出VT-x的CPU,AMD也推出了AMD-V的CPU。Intel Virtualization Technology (VT-x)和AMD的AMD-V,这两种技术都为CPU增加了新的执行模式root模式,可以让虚拟化监视器VMM运行在root模式下,而root模式位于CPU指令级别Ring 0的下面。特权和敏感指令自动在Hypervisor上执行,从而无需全虚拟或半虚拟化技术。 这种通过硬件辅助虚拟化解决虚拟化漏洞,简化VMM软件,消除了半虚拟化和二进制翻译的方法,被称为CPU的硬件辅助虚拟化技术。 ????? 2005年后,CPU厂商Intel 和 AMD 开始支持虚拟化了。 Intel 引入了 Intel-VT? (Virtualization Technology)技术。 这种 CPU,有 VMX root operation 和 VMX non-root operation两种模式,两种模式都支持Ring 0 ~ Ring 3 共 4 个运行级别。这样,VMM 可以运行在 VMX root operation模式下,客户 OS 运行在VMX non-root operation模式下。 ???? 目前主要有Intel的VT-x和AMD的AMD-V这两种技术。其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式 (ROOT模式和非ROOT模式)下,且Guest OS运行在Ring 0下。通常情况下,Guest OS的核心指令可以直接下达到计算机系统硬件执行,而不需要经过VMM。当Guest OS执行到特殊指令的时候,系统会切换到VMM,让VMM来处理特殊指令 ???? 以 Intel VT 技术为例,它增加了两种运行模式:VMX root 模式和?VMX nonroot 模式。通常来讲,主机操作系统和 VMM 运行在 VMX root 模式中,客户机操作系统及其应用运行在 VMX nonroot 模式中。因为两个模式都支持所有的 ring,因此,客户机可以运行在它所需要的 ring 中 (OS 运行在 ring 0 中,应用运行在 ring 3 中),VMM 也运行在其需要的 ring 中? (对 KVM 来说,QEMU 运行在 ring 3,KVM 运行在 ring 0)。CPU 在两种模式之间的切换称为 VMX 切换。从 root mode 进入 nonroot mode,称为 VM entry;从 nonroot mode 进入 root mode,称为 VM exit。可见,CPU 受控制地在两种模式之间切换,轮流执行 VMM 代码和 Guest OS 代码。 ? ??对 KVM 虚机来说,运行在 VMX Root Mode 下的 VMM 在需要执行 Guest OS 指令时执行?VMLAUNCH 指令将 CPU 转换到 VMX non-root mode,开始执行客户机代码,即 VM entry 过程;在 Guest OS 需要退出该 mode 时,CPU 自动切换到 VMX Root mode,即 VM exit 过程。可见,KVM 客户机代码是受 VMM 控制直接运行在物理 CPU 上的。QEMU 只是通过 KVM 控制虚机的代码被 CPU 执行,但是它们本身并不执行其代码。也就是说,CPU 并没有真正的被虚级化成虚拟的 CPU 给客户机使用。 虚拟机共享CPU?? 利用与原始操作系统类似的机制—通过定时器中断,在中断触发时陷入VMM,从而根据调度机制进行调度。 CPU与vCPU对应关系??? 以RH2288H V3服务器使用2.6GHz主频CPU为例,单台服务器有2个物理CPU,每颗CPU有8核,又因为超线程技术可以提供每个物理内核两个处理线程,因此每颗CPU有16线程,总vCPU数量为2*8*2=32个vCPU。总资源为32*2.6GHz=83.2GHz。 ???? 虚拟机vCPU数量不能超过单台CNA节点可用vCPU数量。多个虚拟机间可以复用同一个物理CPU,因此单CNA节点上运行的虚拟机vCPU数量总和可以超过实际vCPU数量。 7.内存虚拟化??? 内存虚拟化就是透过VMM层,将物理的内存统一管理,再分割成多个虚拟内存供虚拟机使用。KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。内存虚拟化技术的核心在于引入一层新的地址空间——客户机物理地址空间,客户机(Guest)以为自己运行在真实的物理地址空间中,实际上它是通过VMM访问真实的物理地址的,在VMM中保存客户机地址空间和物理机地址空间之间的映射表 Native操作系统对内存的认识与管理达成以下两点认识:
内存虚拟化遇到的一个问题,如何分配内存地址空间呢? 内存虚拟化需要解决两个的问题:
???? KVM中,虚机的物理内存即为qemu-kvm进程所占用的内存空间。KVM使用CPU 辅助的内存虚拟化方式。在Intel平台,其内存虚拟化的实现方式为EPT? (Extended Page Tables)技术。 ?? 内存虚拟化的内存地址转换涉及到三种内存地址,即虚拟机内存地址(Virtual MemoryAddress,即VA)、物理内存地址(Physical Memory Address,即 PA)和机器内存地址(Machine Memory Address,即 MA)。为了在物理主机上能够运行多个虚拟机,需要实现VA(虚拟内存)→PA(物理内存)→MA(机器内存)直接的地址转换。虚拟机Guest OS 控制虚拟地址到客户内存物理地址的映射(VA→PA), Hypervisor需要负责映射客户物理内存到实际机器内存(PA→MA)。 MA和PA的区别,比如一台服务器一共有16根16G的内存条,那么它的PA为256G,而MA为16根分布在不同内存槽位的内存条。 影子列表??? 通过影子页表,则可以实现客户机虚拟地址到宿主机物理地址的直接转换。 ??? Intel的CPU提供了EPT (Extended Page Tables,扩展页表)技术,直接在硬件上支持GVA->GPA->HPA的地址转换,从而降低内存虚拟化实现的复杂度,也进一步提升内存虚拟化性能。 透明大页???? 大页作用——记录虚拟内存到物理内存的映射关系,也即映射关系的缓存,用一段专门的内存来记录大页,不能释放,也不能给其他程序使用,内存紧张也不会释放。 默认情况下没有开启大页,因为大页需要一段连续的地址空间,而且这个内存是不会被释放的,要自己去设置大页,如果配置相当于牺牲内存的性能来提高CPU的性能。如果没有用到高级特性,就不要开启。有些功能需要依赖大页,高级功能。 ?? 物理主机上开器大页,会把所有虚拟机的虚拟内存和物理内存的映射关系记录到大页中 ?? x86 (包括x86-32和x86-64)架构的CPU默认使用4KB大小的内存页面,但是它们也支持较大的内存页,如x86-64系统就支持2MB大小的大页 (huge page)。 ?? Linux2.6及以上的内核都支持huge page。如果在系统中使用了huge page,则内存页的数量会减少,从而需要更少的页表 (page table),节约了页表所占用的内存数量,并且所需的地址转换也减少了,TLB缓存失效的次数就减少了,从而提高了内存访问的性能。另外,由于地址转换所需的信息一般保存在CPU的缓存中,huge page的使用让地址转换信息减少,从而减少了CPU缓存的使用,减轻了CPU缓存的压力,让CPU缓存能更多地用于应用程序的数据缓存,也能够在整体上提升系统的性能。 查看大页 8.I/O虚拟化由于计算虚拟化的出现,物理服务器上会创建出许许多多的虚拟机,并且每台虚拟机都需要访问物理主机的IO设备。但I/O设备的数量毕竟是有限的,为了满足多个虚拟机共同使用IO设备的需求,就需要虚拟化监视器VMM参与。VMM用于截获虚拟机对I/O设备的访问请求,再通过软件去模拟真实的V/O设备,进而响应VO请求。从而让多个虚拟机访问有限的V/O资源。实现//O虚拟化的方式主要有三种:全虚拟化、半虚拟化和硬件辅助虚拟化,其中硬件辅助虚拟化技术是目前I/O虚拟化的主流技术 I/O虚拟化需要解决两个问题
?? I/O虚拟化也是通过VMM层捕获前端传来的信息再转发到后端处理。使得多个guest可以复用有限的外设资源。 ?? 设备虚拟化(I/O虚拟化)的过程,就是模拟设备的这些寄存器和内存,截获Guest OS对IO端口和寄存器的访问,通过软件的方式来模拟设备行为。 在QEMU/KVM中,客户机可以使用的设备大致可分为三类:
(1)全虚拟化:实现原理是,通过VMM为虚拟机模拟出一个与真实设备类似的虚拟/O设备,当虚拟机对V/O设备发起I/O请求时,VMM截获虚拟机下发的VO访问请求,再由VMM将真实的访问请求发送到物理设备进行处理。 优点:虚拟机无论使用任何类型的操作系统,操作系统都不需要为V/O虚拟化做任何修改,就可以让多个虚拟机直接使用物理服务器的IO设备。 缺点:VMM需要实时截获每个虚拟机下发的V/O请求,截获请求后模拟到真实的I/O设备中。实时监控和模拟的操作都是通过CPU运行软件程序来实现的,因此会对服务器带来较严重的性能损耗。
(2)半虚拟化:半虚拟化方机式与全虚拟化方式的明显区别在于,它需要建立一个特权级别的虚拟机,即特权虚拟机。半虚拟化方式要求各个虚拟运行前端驱动程序,当需要访问V/O设备时,虚拟机通过前端驱动程序把I/O请求发送给特权虚拟机,由特权虚拟机的后端驱动收集每个虚拟机所发出的V/O请求,再由后端驱动对多个VO请求进行分时分通道处理。特权虚拟机运行真实的物理I/O设备驱动,将I/O请求发送给物理I/O设备,I/O设备处理完成后再将结果返回给虚拟机。通常用于硬盘和网卡。 ?? ??Domain 0就是特权虚拟机,Domain U则为用户虚拟机。所有用户虚拟机的设备信息保存在特权虚拟机Domain0的XenSToRe中,用户虚拟机中的XenBus(为Xen开发的半虚拟化驱动)通过与Domain0的XenSToRe通信,获取设备信息,加载设备对应的前端驱动程序。当用户虚拟机有VO请求时,前端设备驱动将数据通过接口全部转发到后端驱动。后端驱动则对V/О请求的数据进行分时分通道进行处理。最终通过Domain 0的物理I/O设备驱动,将I/O请求发送给物理I/O设备。 优点:主动让虚拟机把I/O请求发送给特权虚拟机,再由特权虚拟机访问真实的I/O设备。这就减少了VMM的性能损耗。 缺点:即需要修改虚拟机操作系统,改变操作系统对自身V/O请求的处理方式,将V/O请求全部发给特权虚拟机处理。这就要求虚拟机操作系统是属于可以被修改的类型(通常都是Linux类型)。
补充:
(3)硬件辅助虚拟化:硬件辅助虚拟化不同于前面两种方式,它是直接将I/O设备驱动直接安装在虚拟机操作系统中,不需要对操作系统做任何改动即可使用。lO-through: IO透传,直接分配给虚拟机物理设备,例如直接分配一个硬盘或网卡给虚拟机,需要硬件具备IO透传技术,在Xen下由Dom0分配,但是访问使用直接使用,不经过Dom0,需要硬件支持。 ?? KVM虚拟机支持将宿主机中的PCI、PCI-E设备附加到虚拟化的客户机中,从而让客户机以独占方式访问这个PCI(或PCI-E)设备。通过硬件支持的VT-d技术将设备分配给客户机后,在客户机看来,设备是物理上连接在其PCI(或PCI-E)总线上的,客户机对该设备的I/O交互操作和实际的物理设备操作完全一样,不需要(或者很少需要)Hypervisor的参与。 VT-X 用于标记VM是一台虚拟机,则VM大部分指令可以直接运行在CPU之上,只有19条敏感指令集需要经过VMM拦截并转换,丢给物理内核来处理(ring0) 内存可以直接运行在物理内存之上,不需要经过虚拟化软件来处理,内存分配也是由CPU来实现的,MMU 内存管理单元? 处理内存映射 ?? 设备直接分配让客户机完全占有PCI设备,这样在执行I/O操作时大量地减少甚至避免了VM-Exit陷入到Hypervisor中,极大地提高了I/O性能,可以达到几乎和Native系统中一样的性能。尽管virtio的性能也不错,但VT-d克服了其兼容性不够好和CPU使用率较高的问题。不过,VT-d也有自己的缺点,一台服务器主板上的空间比较有限,允许添加的PCI和PCI-E设备是有限的,如果一台宿主机上有较多数量的客户机,则很难向每台客户机都独立分配VT-d的设备。另外,大量使用VT-d独立分配设备给客户机,让硬件设备数量增加,这会增加硬件投资成本。 计算资源创建流程: 二、计算虚拟化功能特性1.兼容行业特殊操作系统
PV驱动:虚拟机虚拟化驱动,安装在GUEST os 里,调优。 对应VMware tools。 2.灵活管理架构技术特点与价值
3.支持GPU虚拟化,GPU直通4.在现调整CPU和内存支持主流Linux系统虚拟机在线调整CPU和内存;支持主流Windows系统虚拟机在线调整内存,在线调整CPU后重启生效。 5.主机内存超分配支持虚拟机总配置内存超过物理主机实际运行内存,通过虚拟机之间使用内存气泡、内存交换以及内存共享等技术实现物理内存超规格使用。 通过内存复用技术实现超分配功能。 内存复用的三种技术:内存共享、内存置换、内存气泡(内存复用优先使用物理内存) ?
? 6.NUMA亲和性调度系统会根据虚拟机配置、NUMA高级参数以及物理主机NUMA配置自动计算虚拟机NUMA拓扑结构并设置虚拟机NUMA与物理NUMA亲和性,使虚拟机内存访问性能达到最优。 7.虚拟机HA支持主机、虚拟平台、虚拟机内部多种故障场景的检测和虚拟机恢复 支持共享存储与本地存储虚拟机HA 8.虚拟机热迁移虚拟机热迁移是后续动态资源调度和分布式电源管理技术的基础 9.动态资源调度10.DPM分布式管理11.IMC
12.规则组? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 13:39:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |