KVM虚拟化

KVM虚拟化

1. 虚拟化介绍

虚拟化是一种计算技术,通过在物理基础设施上创建虚拟的资源层,将一个物理资源(如服务器、存储设备或网络)划分为多个虚拟资源实例,使每个实例都具有独立的操作系统和应用程序环境。虚拟化可以应用于计算、存储、网络和应用等不同层面。

在虚拟化环境中,虚拟机(VM)是最常见的实例,它是一个运行在虚拟化层之上的独立操作系统和应用程序的容器。虚拟机可以在同一台物理服务器上同时运行多个,并且彼此之间相互隔离,就像独立的物理服务器一样。虚拟化技术可以通过虚拟机监控器(Hypervisor)来实现,它是一种软件或硬件层,负责管理和分配物理资源给虚拟机。

虚拟化的主要优势包括

  • 资源利用率提高:通过共享物理资源,虚拟化可以提高服务器、存储和网络设备的利用率,减少资源浪费。
  • 灵活性和可扩展性:虚拟化环境可以根据需求动态分配和调整资源,实现弹性扩展,提高系统的灵活性和可扩展性。
  • 硬件抽象化:虚拟化将操作系统和应用程序与底层物理硬件隔离,提供了硬件的抽象化层,使应用程序能够独立于底层硬件进行部署和运行,简化了应用程序的开发和维护过程,从而提高应用程序的可移植性和兼容性。
  • 快速部署和恢复:通过虚拟化,可以快速创建和部署虚拟机或容器,减少了应用程序的上线时间。同时,由于虚拟化环境可以进行快速备份和恢复,可以提高数据的可靠性和容灾能力。
  • 管理和维护简化:虚拟化提供了集中式的管理工具,可以对虚拟机或容器进行集中管理,简化了系统管理和维护的工作量。管理员可以通过管理工具对虚拟机或容器进行监控、配置和故障排除。
  • 成本节约:虚拟化可以减少物理服务器的数量,降低硬件设备的购买和维护成本。同时,通过提高资源利用率和简化管理,还可以节约能源消耗和人力资源成本。

根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:

  • 全虚拟化
  • 半虚拟化

全虚拟化:
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型

半虚拟化:
物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型

2. kvm介绍

KVM(Kernel-based Virtual Machine)是一种开源的虚拟化解决方案,它是基于Linux内核的虚拟化模块。

它的主要功能:

  • 虚拟化技术:KVM利用Linux内核的虚拟化扩展(Intel VT或AMD-V)来实现硬件虚拟化,允许在单个物理主机上同时运行多个虚拟机。
  • 性能:KVM通过直接访问物理硬件来实现高性能的虚拟化,因为虚拟机可以直接在主机硬件上运行,而无需通过额外的虚拟化层。
  • 资源管理:KVM提供了强大的资源管理功能,可以分配和监控虚拟机的CPU、内存、存储和网络资源,以满足不同虚拟机的需求。
  • 安全性:KVM使用硬件辅助的虚拟化技术,可以提供更好的隔离性和安全性,确保虚拟机之间的相互隔离,防止恶意软件的传播。
  • 兼容性:KVM兼容多种操作系统,包括Linux、Windows和其他常见的操作系统,可以在同一主机上同时运行不同类型的虚拟机。
  • 管理接口:KVM提供了多种管理接口,包括命令行工具(如virsh)、图形化管理工具(如virt-manager)和Web界面管理工具(如oVirt和Kimchi),方便用户管理和配置虚拟环境。

3. kvm部署

主机名ip系统版本kvm版本
kiwi123192.168.234.123CentOS-86.0.0

部署之前要确保CPU的虚拟化功能已经开启

3.1 部署kvm

如果kvm主机与kvmweb管理主机是两台不同的主机。则,下面操作在kvm主机上做

//关闭防火墙以及selinux
[root@kiwi123 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@kiwi123 ~]# setenforce 0
[root@kiwi123 ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@kiwi123 ~]# 


//验证cpu是否支持KVM,如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的
[root@kiwi123 ~]# egrep -o 'vmx|svm' /proc/cpuinfo
vmx
vmx
vmx
vmx
[root@kiwi123 ~]# 


//安装kvm
[root@kiwi123 ~]# yum install -y qemu-kvm qemu-img virt-manager libvirt libvirt-python3 libvirt-client virt-install virt-viewer bridge-utils libguestfs-tools


//将kvm的服务器网卡设置为桥接模式
[root@kiwi123 ~]# cd /etc/sysconfig/network-scripts/
[root@kiwi123 network-scripts]# ls
ifcfg-ens160
[root@kiwi123 network-scripts]# cp ifcfg-ens160 ifcfg-br0
[root@kiwi123 network-scripts]# vim ifcfg-br0 
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.234.123
NETMASK=255.255.255.0
GATEWAY=192.168.234.2
DNS1=8.8.8.8
[root@kiwi123 network-scripts]# vim ifcfg-ens160 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
BRIDGE=br0
DEVICE=ens160
ONBOOT=yes


//重启网络服务
[root@kiwi123 ~]# systemctl restart NetworkManager

//可以看到已经有br0了
[root@kiwi123 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe44:e420/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 0e:24:e6:ba:d5:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
[root@kiwi123 ~]# 


// 重启网卡
[root@kiwi123 ~]# yum install -y network-scripts
[root@kiwi123 ~]# ifdown ens160;ifup ens160、


//[root@kiwi123 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe44:e420/64 scope link 
       valid_lft forever preferred_lft forever次查看
[root@kiwi123 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
    link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
    inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe44:e420/64 scope link 
       valid_lft forever preferred_lft forever
       
## 可以看见已经成功桥接


//启动服务
[root@kiwi123 ~]# systemctl enable --now libvirtd
[root@kiwi123 ~]# 


//验证安装结果,如果有模块表示安装成功
[root@kiwi123 ~]# lsmod|grep kvm
kvm_intel             344064  0
kvm                   962560  1 kvm_intel
irqbypass              16384  1 kvm
[root@kiwi123 ~]# virsh --version
6.0.0
[root@kiwi123 ~]# virt-install --version
2.2.1
[root@kiwi123 ~]# 


//做软连接
[root@kiwi123 ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
[root@kiwi123 ~]# which qemu-kvm
/usr/bin/qemu-kvm
[root@kiwi123 ~]# 


//查看网桥信息
[root@kiwi123 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c2944e420       no              ens160
virbr0          8000.525400cf230f       yes             virbr0-nic
3.1 安装kvm web管理界面

kvm 的 web 管理界面是由 webvirtmgr 程序提供的,可以在github搜索webvirtmgr

如果kvm主机与kvmweb管理主机是两台不同的主机。则,下面操作在kvm web管理主机上做

//安装依赖环境,python2
[root@kiwi123 ~]# yum install -y git python2-pip supervisor nginx python2-devel
[root@kiwi123 ~]# yum install -y http://mirror.ghettoforge.org/distributions/gf/el/8/plus/x86_64/python2-libxml2-2.9.7-12.1.gf.el8.x86_64.rpm
[root@kiwi123 ~]# yum install -y http://mirror.centos.org/centos/7/os/x86_64/Packages/libvirt-python-4.5.0-1.el7.x86_64.rpm
[root@kiwi123 ~]# yum install -y https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/python-websockify-0.6.0-5.el7.noarch.rpm



//获取web界面管理程序
[root@kiwi123 ~]# git clone https://github.com/retspen/webvirtmgr.git
[root@kiwi123 ~]# ls
anaconda-ks.cfg  webvirtmgr
[root@kiwi123 ~]# 


//安装webvirtmgr
[root@kiwi123 webvirtmgr]# pip2 install -r requirements.txt 

//检查sqlite3是否安装
[root@kiwi123 ~]# python2
Python 2.7.18 (default, Aug 25 2021, 15:50:49) 
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3       ## 如果有则这里没有报错信息
>>> exit ()
[root@kiwi123 ~]# 


//初始化帐号信息
[root@kiwi123 webvirtmgr]# python2 manage.py syncdb
WARNING:root:No local_settings file found.
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table servers_compute
Creating table instance_instance
Creating table create_flavor

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes   //询问是否创建管理员账号
Username (leave blank to use 'root'): admin   //指定超级管理员账号用户名,默认留空为root
Email address: kiwi@123.com
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)
[root@kiwi123 webvirtmgr]# 


//复制web到指定目录
[root@kiwi123 ~]# mkdir /var/www
[root@kiwi123 ~]# cp -a webvirtmgr/ /var/www/
[root@kiwi123 ~]# chown -R nginx.nginx /var/www/webvirtmgr/


//生成密钥做免密登录
[root@kiwi123 ~]# ssh-keygen -t rsa
## 由于这里webvirtmgr和kvm服务部署在同一台机器,所以这里本地信任。如果kvm部署在其他机器,换成别的机器ip
[root@kiwi123 ~]# ssh-copy-id 192.168.234.123


//端口转发
## 注意这里有个ssh连接上去了,这里是ssh到kvm主机上做端口转发,端口转发不用在web上做
[root@kiwi123 ~]# ssh 192.168.234.123 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60
Last login: Wed Oct 11 04:17:06 2023 from 192.168.234.123
[root@kiwi123 ~]# ss -antl
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    Process    
LISTEN    0         128                0.0.0.0:111              0.0.0.0:*                  
LISTEN    0         32           192.168.122.1:53               0.0.0.0:*                  
LISTEN    0         128                0.0.0.0:22               0.0.0.0:*                  
LISTEN    0         128              127.0.0.1:6080             0.0.0.0:*                  
LISTEN    0         128              127.0.0.1:8000             0.0.0.0:*                  
LISTEN    0         128                   [::]:111                 [::]:*                  
LISTEN    0         128                   [::]:22                  [::]:*                  
LISTEN    0         128                  [::1]:6080                [::]:*                  
LISTEN    0         128                  [::1]:8000                [::]:*                  
[root@kiwi123 ~]# 


//配置nginx
## 先把原配置文件做一个备份
[root@kiwi123 ~]# cp /etc/nginx/nginx.conf /opt/nginx.confbackup
[root@kiwi123 ~]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  localhost;

        include /etc/nginx/default.d/*.conf;

        location / {
            root html;
            index index.html index.htm;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

[root@kiwi123 ~]# vim /etc/nginx/conf.d/webvirtmgr.conf
[root@kiwi123 ~]# cat /etc/nginx/conf.d/webvirtmgr.conf
server {
    listen 80 default_server;

    server_name $hostname;
    #access_log /var/log/nginx/webvirtmgr_access_log;

    location /static/ {
        root /var/www/webvirtmgr/webvirtmgr;
        expires max;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Proto $remote_addr;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M;
    }
}

[root@kiwi123 ~]# vim /var/www/webvirtmgr/conf/gunicorn.conf.py
bind = '0.0.0.0:8000'
backlog = 2048


//重启nginx
[root@kiwi123 ~]# systemctl restart nginx
[root@kiwi123 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@kiwi123 ~]# ss -antl
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    Process    
LISTEN    0         128                0.0.0.0:111              0.0.0.0:*                  
LISTEN    0         511                0.0.0.0:80               0.0.0.0:*                  
LISTEN    0         32           192.168.122.1:53               0.0.0.0:*                  
LISTEN    0         128                0.0.0.0:22               0.0.0.0:*                  
LISTEN    0         128              127.0.0.1:6080             0.0.0.0:*                  
LISTEN    0         128              127.0.0.1:8000             0.0.0.0:*                  
LISTEN    0         128                   [::]:111                 [::]:*                  
LISTEN    0         128                   [::]:22                  [::]:*                  
LISTEN    0         128                  [::1]:6080                [::]:*                  
LISTEN    0         128                  [::1]:8000                [::]:* 


//设置supervisor
[root@kiwi123 ~]# vim /etc/supervisord.conf
##在文件末尾追加以下内容
[program:webvirtmgr]
command=/usr/bin/python2 /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx

[program:webvirtmgr-console]
command=/usr/bin/python2 /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx


//启动supervisor并设置开机自启
[root@kiwi123 ~]# systemctl enable --now supervisord
Created symlink /etc/systemd/system/multi-user.target.wants/supervisord.service → /usr/lib/systemd/system/supervisord.service.
[root@kiwi123 ~]# systemctl restart supervisord
[root@kiwi123 ~]# 


//配置nginx用户。设置免密登录
[root@kiwi123 ~]# su - nginx -s /bin/bash
[nginx@kiwi123 ~]$ ssh-keygen -t rsa
[nginx@kiwi123 ~]$ touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
[nginx@kiwi123 ~]$ chmod 0600 ~/.ssh/config
[nginx@kiwi123 ~]$ ssh-copy-id root@192.168.234.123

[nginx@kiwi123 ~]$ ssh root@192.168.234.123
Warning: Permanently added '192.168.234.123' (ECDSA) to the list of known hosts.
Last login: Wed Oct 11 04:18:24 2023 from 192.168.234.123

[root@kiwi123 ~]# vim /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
## 在文件追加以下内容
[Remote libvirt SSH access]
Identity=unix-user:root
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes
[root@kiwi123 ~]# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla

//重启服务
[root@kiwi123 ~]# systemctl restart nginx
[root@kiwi123 ~]# systemctl restart libvirtd



3.2 去web页面进行管理

访问192.168.234.123即可

//如果出现以下报错,并且web页面显示为502,重启系统可以解决
[root@kiwi123 ~]# channel 1016: open failed: connect failed: Device or resource busy
channel 1017: open failed: connect failed: Device or resource busy
channel 1017: open failed: connect failed: Device or resource busy

····································


image-20231011164321621

3.2.1 KVM连接管理

添加

image-20231011164416443

image-20231011164416443

点击这里

image-20231011165317867

3.2.2 KVM存储管理

image-20231011165446650

image-20231011165556623

image-20231011165920957

通过远程连接上传ISO镜像文件到存储目录/var/lib/libvirt/images

//在kvm主机上上传
[root@kiwi123 ~]# cd /var/lib/libvirt/images/
[root@kiwi123 images]# ls
rhel-9.2-x86_64-dvd.iso
[root@kiwi123 images]# 

## 成功上传

在web界面查看镜像

image-20231011171533229

创建系统安装镜像

image-20231011171607767

image-20231011171639140

添加成功

image-20231011171655317

3.2.3 KVM网络管理

添加桥接网络

image-20231011172047472

image-20231011172451484

image-20231011172536729

3.2.4 实例管理

实例(虚拟机)创建

image-20231011172805582

image-20231011172843123

image-20231011172942135

image-20231011173128869

image-20231011173209918

设置在web上访问虚拟机的密码

image-20231011173321602

启动虚拟机

image-20231011173357268

image-20231011173420142

image-20231011173502581

开始安装系统,后面省略安装步骤

安装成功

image-20231011183204859

用shell连接看能不能用

## 这台虚拟的ip地址为192.168.234.77/24

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:f5:29:d7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.234.77/24 brd 192.168.234.255 scope global noprefixroute ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::4701:96d0:b5a5:f173/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ping -c4 www.baidu.com
PING www.a.shifen.com (14.119.104.254) 56(84) bytes of data.
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=1 ttl=128 time=29.1 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=2 ttl=128 time=47.7 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=3 ttl=128 time=41.7 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=4 ttl=128 time=34.5 ms

--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 29.115/38.236/47.676/7.041 ms
[root@localhost ~]# 


## 可以用

部署完成

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值