虚拟化技术

虚拟化分类

从资源提供角度分类

  • 平台虚拟化
如果把X86平台的CPU,内存和外设作为资源,那所对应的虚拟化技术就是平台虚拟化。
在同一个X86平台上面,可以虚拟多个X86平台,每个平台可以运行自己独立的完整的
操作系统。
例如:QEMU,KVM,XEN Server, EXSI, Hyper-V, VmWare等所管理的虚拟机。
  • 操作系统虚拟化
如果把操作系统及其提供的系统调用作为资源,那虚拟化就表现为操作系统虚拟化,
例如Linux容器虚拟化技术就是在同一个操作系统之上,虚拟出多个同样的操作系统,
每个应用程序认为自己运行在一个独立的OS
例如:LXC或Docker所管理的容器

从虚拟化实现方式分类

  • 什么是虚拟化管理程序Hypervisor(VMM)
一种运行在物理机和虚拟机操作系统之间的中间软件层,可以允许多个操作系统和应用共享硬件,
即虚拟机监视器,也可称之为VMM
hypervisor是一种‘元’操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。
hypervisor不但协调着这些硬件资源的访问,而且在各个虚拟机之间是加防护。当服务器启动
并执行hypervisor时,他会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量
的内存,cpu,网络和磁盘
  • hypervisor的作用

hypervisor是所有虚拟化技术的核心。非中断的支持多工作负载迁移的能力时hypervisor的基本能力。

hypervisor的架构分类

hyperviosr type I型:半虚拟化(Para-virtulization)

对操作系统(VM)的内核进行修改,将运行在Ring 0上的指令转为调用hypervisor,例如:XEN

虚拟机直接运行在物理硬件之上,不需要底层操作系统,hypervisor充当了操作系统,需要修改客户机(虚拟机)操作系统。

在这里插入图片描述

hyperviosr type II型:硬件辅助全虚拟化(Hardware-Assisted Full Virtualzation)

对CPU指令集进行改造。例如Inter VT-x / AMD-V
客户操作系统可以直接使用Ring 0而无需修改。例如:KVM

虚拟机运行在传统操作系统(host os)之上,同样构建的是硬件全仿真实例,被称为“托管(宿主)型”。托管型/主机型hypervisor运行在基础操作系统之上,构建出一套虚拟硬件平台(CPU/Memory/Storage/Adapter)。使用者根据需要安装新的操作系统和软件,底层和上层的操作系统可以完全无关化,例如windows运行linux操作系统。主机虚拟化中的VM的应用程序调用硬件资源需要经过:VM内核->hypervisor->主机内核。因此相对来说三种虚拟化技术中性能最差的。

在这里插入图片描述

hyperviosr type III型:操作系统虚拟化

成为轻量级虚拟化,允许操作系统内核拥有彼此隔离和分割的多用户空间实例(instance),这些实例称之为容器。其实基于linux内核中的namespace,cgroup实现。例如:LXC,Docker

虚拟机运行在传统操作系统之上,创建一个独立的虚拟化实例(容器),指向底层托管操作系统,被称为操作系统虚拟化。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,资源耗费最少。但是缺点时底层和上层必须使用同一操作系统,如底层运行的是windows,则VPS/VE就必须运行windows。

在这里插入图片描述
注意:容器技术的所有调用都是直接向物理机发起的,所以他的性能很优越。这就是著名的容器技术原理

Hypervisor管理工具对比

名称厂商主CPU目标CPU主系统目标系统
QEMUFabrice BellardInter,AMD,ARMX86,X86-64,ARMWindows,Linux,MAC OS X(UNIX)Linux
KVMRed HatInter,AMD(type II)X86,X86-64LinuxLinux,Windows
Xen剑桥大学Intel,AMDInter,AMD(type I和type II)X86,X86-64Windows,Linux,SolarisLinux,Windows
Hyper-V微软Inter,AMD(type II)X86,X86-64WindowsLinux,Windows
VMware ESXi ServerVMwareInter,AMD(type II)X86,X86-64裸机安装Linux,Windows
Oracle VMOracleInter,AMD(type II)X86,X86-64裸机安装Linux,Windows

QEMU

软件模拟虚拟化、可以模拟多种软件,包括X86架构处理器、AMD64架构处理器、ARM、SPARC与PowerPC架构、AIX架构等。效率低,一半用于研究测试场景。

注:QEMU是模拟处理器的自由软件,它是一个完整的可以单独运行的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备,通过一个特殊的重编译器对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。QEMU有两种工作模式:系统模式,可以模拟出整个电脑系统,另一种是用户模式,可以运行不同于当前硬件平台的其他平台上的程序(如X86平台上运行跑ARM平台上的程序)。 1 .0版本之后就只能使用qemu-kvm(只支持linux)进行加速,1.3版本后QEMU和QEMU-KVM和二为一了。

KVM

KVM kernel-based virtual machine 。是X86架构下硬件辅助的全虚拟化的首选解决方案,KVM需要经过修改的QEMU软件(qemu-kvm)来实现虚拟机的管理。KVM就是内核的一个模块,用户空间通过QEMU模拟硬件提供给虚拟机使用,一台虚拟机就是一个普通的linux进程,虚拟机中的VCPU就是该进程中的线程

在这里插入图片描述
注:不同的基于KVM的虚拟化平台,可能会采用不同的虚拟化组建,目前主流的采用QEMU-KVM组件,但在不同的产品里版本与所不同,功能也有差异

  • kvm通过调用Linux本身内核功能,实现对CPU的底层虚拟化和内存的虚拟化,是Linux内核成为虚拟化层,需要X86架构支持虚拟化功能的硬件支持(如Inter-VT,AMD-V),是一种全虚拟化架构
  • KVM在2007年2月被导入Linux2.6.20内核中
  • 从存在的形势来看,它包括两个内核模块kvm.ko和kvm_intel.ko或kvm_amd.ko,本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备/dev/kvm(有KVM本身创建)作为管理接口,主要负责Vcpu的创建,虚拟内存的分配,VCPU寄存器的读写以及vCPU的运行。
  • KVM是Linux内核的模块,它需要CPU的支持,采用硬件全虚拟化技术inter-vt,AMD-V,内存的相关如inter的EPT和AMD的RVI技术,Guest OS的CPU指令下不用再经过QEMU转译,直接运行,大大提高了速度,KVM通过/dev/kvm暴露接口,用户太程序可以通过ioictl函数来访问这个接口。

QEMU-KVM

用户空间的虚拟机管理工具。QEMU提供IO设备虚拟化及管理,KVM提供CPU和内存模拟

前面的介绍我我们知道,KVM只负责CPU和内存的虚拟化,加载了他之后,用户可以通过工具(KVM提供接口)创建虚拟机。但是仅有KVM还不够,用户无法直接控制内核去做事情(KVM只提供接口,怎么创建虚拟机,分配VCPU不在其进行),还必须有个用户空间的工具,KVM的开发者选择了较成熟的QEMU来作为这个工具,并对其进行修改,形成了QEMU-KVM。

再QEMU-KVM只能够,KVM运行在内核空间,QEMU运行在用户空间,实际模拟创建,管理各种硬件,QEMU将KVM整合了进来,通过 /ioctl调用/dev/kvm,从而将cpu指令部分交由内核模块去做,QEMU模拟IO设备(磁盘、网卡、显卡等),KVM+QEMU就是完整意义的服务器虚拟化。但是由于qemu模拟设备效率不高的原因,现在常常采用半虚拟化的virtio的方式来模拟IO设备

libvirt

基于QEMU-KVM开发出的一款标准化的QEMU-KVM的调用入口,也就是说他在QEMU-KVM之上

libvirt是一套免费、开源的的支持linux下主流虚拟化管理程序的C函数库,其旨在为包括KVM在内的各种虚拟化管理程序提供一套方便、可靠的编程接口。
当前主流linux平台上默认的虚拟化管理工具virt-manager,virsh等都是基于libvirt开发的

在这里插入图片描述
注:libvirt是一个各种虚拟化平台的虚拟机管理的API库,一些常用的虚拟机管理程序如virsh等和云计算框架平台(openstack、opennebula、eucalyptus)都在底层使用libvirt提供的应用程序接口。libvirt主要由三个部分组成:API库;守护进程libvirtd和默认的命令行管理工具virsh

libvirt,virt-manage,qemu-kvm三者之间的关系

virt-manage 通过libvirt去管理qemu-kvm虚拟机

知识图谱
在这里插入图片描述
工具知识图谱
在这里插入图片描述

环境部署和准备

kvm系统需求

1核心+2G内存+6g硬盘
lscpu 查看硬件是否支持虚拟化
lsmod |grep kvm 查看系统模块
egrep ‘svm|vmx’ /proc/cpuinfo 操作系统包含svm/vmx特性
**BIOS enable **

主机部署(centos示例)

yum grouplist // 查看分组环境
yum -y groupinstall '虚拟化*' //安装虚拟机花主机分组环境

安装过程所碰到的问题

  • 1、yum 安装libvirt出错
[root@os ~]# yum -y install libvirt
CentOS-8 - AppStream                            1.6 kB/s | 2.3 kB     00:01
CentOS-8 - Base                                 1.6 kB/s | 2.3 kB     00:01
Failed to synchronize cache for repo 'AppStream', ignoring this repo.
Failed to synchronize cache for repo 'BaseOS', ignoring this repo.
Last metadata expiration check: 1:38:26 ago on Tue 24 May 2022 03:45:31 AM EDT.
No match for argument: libvirt
Error: Unable to find a match

解决方案

  • 方案一:

出现错误的原因是yum源的原因,重新安装yum源

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
[root@os ~]# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
CentOS-8 - AppStream                            1.8 kB/s | 2.3 kB     00:01
CentOS-8 - Base                                 2.0 kB/s | 2.3 kB     00:01
Failed to synchronize cache for repo 'AppStream', ignoring this repo.
Failed to synchronize cache for repo 'BaseOS', ignoring this repo.
Last metadata expiration check: 1:40:32 ago on Tue 24 May 2022 03:45:31 AM EDT.
epel-release-latest-8.noarch.rpm                 10 kB/s |  23 kB     00:02
Dependencies resolved.
================================================================================
 Package             Arch          Version            Repository           Size
================================================================================
Installing:
 epel-release        noarch        8-15.el8           @commandline         23 k

Transaction Summary
================================================================================
Install  1 Package

Total size: 23 k
Installed size: 32 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : epel-release-8-15.el8.noarch                           1/1
  Running scriptlet: epel-release-8-15.el8.noarch                           1/1
  Verifying        : epel-release-8-15.el8.noarch                           1/1

Installed:
  epel-release-8-15.el8.noarch

Complete!
[root@os ~]# yum grouplist
CentOS-8 - AppStream                            1.8 kB/s | 2.3 kB     00:01
CentOS-8 - Base                                 429  B/s | 2.3 kB     00:05
Extra Packages for Enterprise Linux Modular 8 - 172 kB/s | 1.0 MB     00:06
Extra Packages for Enterprise Linux 8 - x86_64  1.1 MB/s |  11 MB     00:10
Failed to synchronize cache for repo 'AppStream', ignoring this repo.
Failed to synchronize cache for repo 'BaseOS', ignoring this repo.
Available Environment Groups:
   KDE Plasma Workspaces
Available Groups:
   Fedora Packager
   Xfce
[root@os ~]#


虚拟化主机验证

systemctl status libvirtd
lsmod |grep kvm

注:如果未安装libvirtd,lsmod是看不到kvm模块的;如果安装了还是未加载kvm,那么使用modprebe kvm 加载kvm

  • 问题二:配置yum源。注意我这里的示例环境是centos8

无论安装什么插件或者命令都会报下这个错误

[root@os yum.repos.d]# dnf install -y centos-release-stream
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
CentOS-8 - AppStream                                                          1.7 kB/s | 2.3 kB     00:01
CentOS-8 - Base - mirrors.aliyun.com                                          0.0  B/s |   0  B     00:32
CentOS-8 - Extras - mirrors.aliyun.com                                        0.0  B/s |   0  B     00:32
CentOS-8 - Updates - mirrors.aliyun.com                                       0.0  B/s |   0  B     00:32
Failed to synchronize cache for repo 'AppStream', ignoring this repo.
Failed to synchronize cache for repo 'base', ignoring this repo.
Failed to synchronize cache for repo 'extras', ignoring this repo.
Failed to synchronize cache for repo 'updates', ignoring this repo.
Last metadata expiration check: 0:08:42 ago on Tue 24 May 2022 10:02:36 PM EDT.
No match for argument: centos-release-stream
Error: Unable to find a match

  • 解决方式

1、修改yum源的repo文件中的baseurl,即源仓库。
2、修改完之后yum makecache 重新读取到缓存

centos的yum配置文案在/etc/yum.repos.d下

修改CentOS-AppStream.repo文件

# CentOS-AppStream.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[AppStream]
name=CentOS-$releasever - AppStream
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos/8-stream/AppStream/$basearch/os/  
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

特别注意:centos8 baseurl中的 $releasever 要替换成8-stream;注释掉mirrorlist这行,要不然还会报一样的错;别的repo文件也一样

修改CentOS-Base.repo文件

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[BaseOS]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos/8-stream/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial


修改CentOS-Extras.repo文件

# CentOS-Extras.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/extras/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos/8-stream/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial


修改CentOS-PowerTools.repo文件


# CentOS-PowerTools.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[PowerTools]
name=CentOS-$releasever - PowerTools
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/PowerTools/$basearch/os/
baseurl=https://mirrors.aliyun.com/centos/8-stream/PowerTools/$basearch/os/
gpgcheck=1
enabled=0

注意:

我这里的执行过程是更换yum源也是就修改那几个repo文件;然后执行问题二的步骤。然后输入命令如果没有会提示你安装的

示例:virsh

[root@os yum.repos.d]# virsh
bash: virsh: command not found...
Install package 'libvirt-client' to provide command 'virsh'? [N/y] y


 * Waiting in queue...
 * Loading list of packages....
The following packages have to be installed:
 libvirt-client-8.0.0-6.module_el8.7.0+1140+ff0772f9.x86_64     Client side utilities of the libvirt library
Proceed with changes? [N/y] y


 * Waiting in queue...
 * Waiting for authentication...
 * Waiting in queue...
 * Loading list of packages....
 * Downloading packages...
 * Requesting data...
 * Testing changes...
 * Installing packages...
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh #

[root@os yum.repos.d]# virsh
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # quit



  • 问题二:Cannot update read-only repo

dnf install -y centos-release-stream 执行完之后 dnf update

[root@os yum.repos.d]# dnf install -y centos-release-stream
Last metadata expiration check: 0:00:39 ago on Tue 24 May 2022 10:21:14 PM EDT.


Dependencies resolved.
==============================================================================================================
 Package                             Arch                 Version                  Repository            Size
==============================================================================================================
Installing:
 centos-stream-release               noarch               8.6-1.el8                BaseOS                22 k
     replacing  centos-release.x86_64 8.0-0.1905.0.9.el8
Installing dependencies:
 centos-gpg-keys                     noarch               1:8-6.el8                BaseOS                14 k
 centos-stream-repos                 noarch               8-6.el8                  BaseOS                20 k

Transaction Summary
==============================================================================================================
Install  3 Packages

Total download size: 57 k
Downloading Packages:
(1/3): centos-gpg-keys-8-6.el8.noarch.rpm                                      12 kB/s |  14 kB     00:01
(2/3): centos-stream-release-8.6-1.el8.noarch.rpm                              18 kB/s |  22 kB     00:01
(3/3): centos-stream-repos-8-6.el8.noarch.rpm                                  16 kB/s |  20 kB     00:01
--------------------------------------------------------------------------------------------------------------
Total                                                                          45 kB/s |  57 kB     00:01
warning: /var/cache/dnf/BaseOS-42fb0eff3ddd0a06/packages/centos-gpg-keys-8-6.el8.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - Base                                                               1.6 MB/s | 1.6 kB     00:00
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                      1/1
  Running scriptlet: centos-gpg-keys-1:8-6.el8.noarch                                                     1/1
  Installing       : centos-gpg-keys-1:8-6.el8.noarch                                                     1/4
  Installing       : centos-stream-release-8.6-1.el8.noarch                                               2/4
  Installing       : centos-stream-repos-8-6.el8.noarch                                                   3/4
  Obsoleting       : centos-release-8.0-0.1905.0.9.el8.x86_64                                             4/4
warning: /etc/yum.repos.d/CentOS-PowerTools.repo saved as /etc/yum.repos.d/CentOS-PowerTools.repo.rpmsave
warning: /etc/yum.repos.d/CentOS-Extras.repo saved as /etc/yum.repos.d/CentOS-Extras.repo.rpmsave
warning: /etc/yum.repos.d/CentOS-Base.repo saved as /etc/yum.repos.d/CentOS-Base.repo.rpmsave
warning: /etc/yum.repos.d/CentOS-AppStream.repo saved as /etc/yum.repos.d/CentOS-AppStream.repo.rpmsave

  Running scriptlet: centos-release-8.0-0.1905.0.9.el8.x86_64                                             4/4
  Verifying        : centos-gpg-keys-1:8-6.el8.noarch                                                     1/4
  Verifying        : centos-stream-release-8.6-1.el8.noarch                                               2/4
  Verifying        : centos-release-8.0-0.1905.0.9.el8.x86_64                                             3/4
  Verifying        : centos-stream-repos-8-6.el8.noarch                                                   4/4

Installed:
  centos-stream-release-8.6-1.el8.noarch centos-gpg-keys-1:8-6.el8.noarch centos-stream-repos-8-6.el8.noarch

Complete!


[root@os yum.repos.d]# dnf update
CentOS Stream 8 - AppStream                                                   194 kB/s |  22 MB     01:56
CentOS Stream 8 - BaseOS                                                      872 kB/s |  22 MB     00:25
CentOS Stream 8 - Extras common packages                                      889  B/s | 4.3 kB     00:04
CentOS Stream 8 - Extras                                                      5.0 kB/s |  18 kB     00:03
Dependencies resolved.
==============================================================================================================
 Package                                     Arch   Version                                   Repository
                                                                                                         Size
==============================================================================================================
Installing:
 kernel                                      x86_64 4.18.0-383.el8                            baseos    8.1 M
 kernel-core                                 x86_64 4.18.0-383.el8                            baseos     39 M
 kernel-modules                              x86_64 4.18.0-383.el8                            baseos     32 M
Upgrading:
 PackageKit                                  x86_64 1.1.12-6.el8                              appstream 599 k
 PackageKit-command-not-found                x86_64 1.1.12-6.el8                              appstream  27 k
 PackageKit-glib                             x86_64 1.1.12-6.el8                              appstream 140 k
 PackageKit-gstreamer-plugin                 x86_64 1.1.12-6.el8                              appstream  17 k
 PackageKit-gtk3-module                      x86_64 1.1.12-6.el8                              appstream  18 k
 abattis-cantarell-fonts                     noarch 0.0.25-6.el8                              appstream 156 k
...

dnf update会更新和安装很多软件。

虚拟机网络连接状态

  • firewall 防火墙
firewall-cmd --list-all 查看防火墙状态
firewall-cmd --zone=public --add-masquerade=yes 原地址转换开启
firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --zone=public reload

但是建议使用iptables管理防火墙,这样可以看到更多的细节

使用iptables前先关闭firewalld以及设置firewalld开机禁用

  • iptables管理防火墙
yum -y install iptables-services //安装iptables
systemctl enable iptables;systemctl start iptables //启用iptables

iptables -F;iptables -t nat -F;iptables -t mangle -F;iptables -t raw -F;iptables -t secure -F //情况iptables的表

iptables save //保存

注:在执行完上述之后强烈建议使用systemctl restart libvirtd将防火墙策略重新设置到iptables表中

  • 网络查看

ip address show //查看网卡。ip a s 命令简写

知识图谱
在这里插入图片描述

如果您觉得文章对您有所帮助,可以请囊中羞涩的博主吃个鸡腿饭,万分感谢。愿每一个来到这里的人生活幸福美满。

微信赞赏
在这里插入图片描述

支付宝赞赏
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值