03--KVM虚拟化

前言:这里开始涉及到云计算内容,虚拟化使云计算发展,云计算推动虚拟化进步,两者相辅相成,这一章总结一下kvm虚拟化的解决方案。

1、基础概念

1.1、云计算

以前要完成信息处理, 是需要在一个客观存在的计算机上完成的, 它看得见摸得到。后来随着计算机硬件、网络技术、存储技术的飞速发展, 计算机硬件性能过剩, 因为足够高的性能在大部分时间是被浪费掉的, 并没有参与客观运算; 那如果将资源集中起来, 计算任务去共享、复用集中起来的资源, 将是对资源的极大节省和效率的极大提升; 这就是云计算产生的背景, 它就是将庞大的计算资源集中在某个地方或是某些地方, 而不再是放在身边的计算机了, 用户的每一次计算, 都发生在远端的云计算机房内。

云计算的服务类型:

  • SaaS(软件即服务):通过云端提供完整的应用程序,用户通过网页浏览器等方式访问,如微信客户端。
  • PaaS(平台即服务):云服务提供商提供给客户开发、运维应用程序的运行环境, 用户负责维护自己的应用程序, 但并不掌控操作系统、硬件以及运作的网络基础架构。如aliyun的RDS-MySQL、RDS-Redis等。
  • IaaS(基础设施即服务):提供基础的计算资源,如虚拟机、存储空间等,用户可以自由配置和管理,如aliyun的ECS、腾讯的CMS。

1.2、虚拟化

虚拟化是一种资源管理技术, 它将计算机的各种实体资源予以抽象和转化, 并提供分割、重新组合, 以达到最大化利用物理资源的目的; 广义上来说, 我们一直以来对物理硬盘所做的逻辑分区、以及后来的LVM, 都可以纳入虚拟化的范畴; 在没有虚拟化之前, 一个物理主机上面只能运行一个操作系统及其之上的一系列运行环境和应用程序, 有了虚拟化技术, 一个物理主机可以被抽象、分割成多个虚拟的逻辑意义上的主机, 向上支撑多个操作系统及其之上的运行环境和应用程序, 则其资源就可以被最大化的利用

半虚拟化:
  纯软件的虚拟化可以做到第一个目标, 但性能不是很好, 而且软件设计的复杂度大大增加。
  那么如果放弃第一个目标呢?让客户机意识到自己是运行在虚拟化环境里, 并做相应修改以配合VMM, 这就是半虚拟化(Para-Virtualization)。一方面, 可以提升性能和简化VMM软件复杂度;另一方面, 也不需要太依赖硬件虚拟化的支持, 从而使得其软件设计(至少是VMM这一侧)可以跨平台且是优雅的。“本质上, 准虚拟化弱化了对虚拟机特殊指令的被动截获要求, 将其转化成客户机操作系统的主动通知。但是, 准虚拟化需要修改客户机操作系统的源代码来实现主动通知。”典型的半虚拟化技术就是virtio, 使用virtio需要在宿主机/VMM和客户机里都相应地装上驱动。
全虚拟化:
  与半虚拟化相反的, 全虚拟化(Full Virtualization)坚持第一个理想化目标:客户机的操作系统完全不需要改动。敏感指令在操作系统和硬件之间被VMM捕捉处理, 客户操作系统无须修改, 所有软件都能在虚拟机中运行。因此, 全虚拟化需要模拟出完整的、和物理平台一模一样的平台给客户机, 这在达到了第一个目标的同时也增加了虚拟化层(VMM)的复杂度。
  性能上, 2005年硬件虚拟化兴起之前, 软件实现的全虚拟化完败于VMM和客户机操作系统协同运作的半虚拟化, 这种情况一直延续到2006年。之后以Intel VT-x、VT-d为代表的硬件虚拟化技术的兴起, 让由硬件虚拟化辅助的全虚拟化全面超过了半虚拟化。但是, 以virtio为代表的半虚拟化技术也一直在演进发展, 性能上只是略逊于全虚拟化, 加之其较少的平台依赖性, 依然受到广泛的欢迎。

1.3、kvm

KVM全称为Kernel-based Virtual Machine,是一种基于内核的虚拟机解决方案,利用硬件虚拟化技术实现全虚拟化。

每个KVM客户机对应于宿主机上的一个Linux进程,其中每个虚拟CPU(vCPU)是该进程的一个线程,并有一个专门处理IO的线程,它们组成一个线程组。因此,宿主机像调度普通进程一样调度这些客户机,可以通过Linux的进程调度机制实现不同客户机的权限限制和优先级设置。

客户机看到的硬件设备是由QEMU模拟的(不包括透传的VT-d设备)。当客户机操作模拟设备时,QEMU会截获并将其转换为对实际物理设备(即使这些设备可能不存在或者只是虚拟化的实体)的驱动操作。

2、KVM虚拟机创建

由于KVM已经是kernel源代码的一部分, 所以不需要另外安装, 主要是安装QEMU 虚拟化工具,基础环境配置如下

将安装所需要的库克隆到安装主机
$ git clone https://gitee.com/mirschao/kvmvirtual.git
$ bash kvmvirtual/installer/deploy.sh

KVM中支持三种网络模式, 分别为NAT模式、bridge桥接模式、host-only仅主机模式; NAT模式通常用来在个人虚拟化桌面中应用广泛, 桥接模式在服务器端虚拟化使用广泛, host-only一般在超级大的服务厂商内部网络使用

2.1、NAT模式

查看主机中是否有虚拟机

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------

[root@localhost ~]# 

创建虚拟磁盘

虚拟磁盘格式有raw(类似ssd,一次性占用设定大小,速度较快数据库服务应用较多)和qcow2(类似机械硬盘,根据需要逐渐扩大,支持虚拟机克隆,虚拟机磁盘快照。扩容)

[root@localhost ~]# qemu-img create -f raw /kvm/vdisks/test-nat-network.raw 20G
Formatting '/kvm/vdisks/test-nat-network.raw', fmt=raw size=21474836480

创建虚拟机

提前将iso文件上传到文件夹/kvm/isos下

[root@localhost ~]# virt-install --name=test-nat-network \
> --vcpus=2 --memory=2048 --disk=/kvm/vdisks/test-nat-network.raw \
> --cdrom=/kvm/isos/CentOS-7.6-x86_64-DVD-1810.iso --os-variant=rhel7 \
> --noautoconsole --autostart \
> --graphics vnc,listen=0.0.0.0,port=5901

开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。
[root@localhost ~]# 




###以下为注释


    virt-install:
        这是用于创建和安装虚拟机的命令行工具。

    --name=test-nat-network:
        指定虚拟机的名称为 test-nat-network。

    --vcpus=2:
        指定虚拟机的虚拟CPU数量为 2 个。

    --memory=2048:
        指定虚拟机的内存大小为 2048 MB(即 2 GB)。

    --disk=/kvm/vdisks/test-nat-network.raw:
        指定虚拟机的磁盘配置,/kvm/vdisks/test-nat-network.raw 表示虚拟机的磁盘镜像文件路径和名称。

    --cdrom=/kvm/isos/CentOS-7.6-x86_64-DVD-1810.iso:
        指定虚拟机的光盘镜像(ISO文件),用于安装操作系统。在这里使用的是 CentOS 7.6 的 ISO 文件路径。

    --os-variant=rhel7:
        指定操作系统类型

    --noautoconsole:
        不自动连接到虚拟机的控制台。这意味着虚拟机创建后,不会自动打开控制台窗口。

    --autostart:
        设置虚拟机在宿主机启动时自动启动。

    --graphics vnc,listen=0.0.0.0,port=5901:
        配置虚拟机的图形显示方式为 VNC,并指定以下参数:
            listen=0.0.0.0: 允许从任意地址连接 VNC。
            port=5901: VNC 监听的端口号为 5901。这意味着你可以通过 VNC 客户端连接到宿主机的 5901 端口来访问虚拟机的图形界面。

此时使用vnc连接宿主机5901端口

正常安装系统,根据实际情况需求(是否订阅redhat)把kdump关掉或者开启,这个设置很占内存。然后进入网络设置,开启网卡,查看自动获取的ip与宿主机的nat网卡virbr0是否符合

 后续开始正常安装系统

2.2、桥接模式

首先需要在宿主机创建一个桥接网卡

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
NAME="br0"
BOOTPROTO="static"
ONBOOT="yes"
TYPE="Bridge"
IPADDR="192.168.188.188"
GATEWAY="192.168.188.2"
NETMASK="255.255.255.0"
DNS1="114.114.114.114"
DEFROUTE="yes"

将宿主机原先网卡ens33也桥接到br0上,br0透过ens33上网

[root@localhost ~]# cp /etc/sysconfig/network-scripts/{ifcfg-ens33,ifcfg-ens33.bak}
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE="ens33"
NAME="ens33"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br0"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"

重启网络

[root@localhost ~]# systemctl restart network

创建虚拟机

[root@localhost ~]#  qemu-img create -f raw /kvm/vdisks/template.raw 20G
Formatting '/kvm/vdisks/template.raw', fmt=raw size=21474836480 
[root@localhost ~]# virt-install --name=template \
> --vcpus=2 --memory=2048 --disk=/kvm/vdisks/template.raw \
> --cdrom=/kvm/isos/CentOS-7.6-x86_64-DVD-1810.iso --os-variant=rhel7 \
> --noautoconsole --autostart \
> --network bridge=br0 \
> --graphics vnc,listen=0.0.0.0,port=5900

开始安装......
域安装仍在进行。您可以重新连接
到控制台以便完成安装进程。

这里配置一下静态ip(方便后续实验)

 后续操作同上

2.3、KVM虚拟机快速创建

#    查看虚拟机状态
[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     test-nat-network               running
 2     template                       running

#查看虚拟磁盘文件
[root@localhost ~]# ll /kvm/vdisks/
总用量 2784244
-rw-r--r-- 1 qemu qemu 21474836480 7月  23 14:11 template.qcow2
-rw-r--r-- 1 qemu qemu 21474836480 7月  23 14:11 test-nat-network.raw

#查看虚拟机硬件配置文件
[root@localhost ~]# ll /etc/libvirt/qemu
总用量 16
drwxr-xr-x 2 root root   54 7月  23 00:07 autostart
drwx------ 3 root root   42 7月  22 22:11 networks
-rw------- 1 root root 4228 7月  23 00:07 template.xml
-rw------- 1 root root 4258 7月  22 22:57 test-nat-network.xml

根据下面步骤将演示nat虚拟机删除,删除方式如下

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     test-nat-network               running
 2     template                       running

[root@localhost ~]# virsh shutdown test-nat-network
域 test-nat-network 被关闭
[root@localhost ~]# virsh undefine test-nat-network
域 test-nat-network 已经被取消定义
[root@localhost ~]# rm -rf /kvm/vdisks/test-nat-network.raw 

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 2     template                       running

[root@localhost ~]# ll /kvm/vdisks/
总用量 1394064
-rw-r--r-- 1 qemu qemu 21474836480 7月  23 14:32 template.raw
[root@localhost ~]# ll /etc/libvirt/qemu
总用量 8
drwxr-xr-x 2 root root   26 7月  23 14:29 autostart
drwx------ 3 root root   42 7月  22 22:11 networks
-rw------- 1 root root 4228 7月  23 00:07 template.xml

一台主机对应虚拟硬件配置和虚拟磁盘两个文件,想要快速创建一台虚拟机就是拷贝这两个文件到对应主机位置实现,但是由于系统内唯一标识符存在无法直接使用常规手段拷贝,需要借助qemu实现,具体操作如下

[root@localhost ~]# qemu-img create -f qcow2 -b /kvm/vdisks/template.raw /kvm/vdisks/test-quickly.qcow2
Formatting '/kvm/vdisks/test-quickly.qcow2', fmt=qcow2 size=21474836480 backing_file='/kvm/vdisks/template.raw' encryption=off cluster_size=65536 lazy_refcounts=off

磁盘创建成功后如何修改虚拟磁盘文件,以ip举例把虚拟磁盘挂载到中间目录上,然后进入中间目录修改(这里修改前面配置的静态ip作为示例,uuid具有唯一性且会自动生成,直接删除即可),操作如下

[root@localhost ~]# guestmount -a /kvm/vdisks/test-quickly.qcow2 -m /dev/centos/root /kvm/modify/
[root@localhost ~]# cd /kvm/modify/
[root@localhost modify]# ll
总用量 12
lrwxrwxrwx.  1 root root    7 7月  24 12:40 bin -> usr/bin
drwxr-xr-x.  2 root root    6 7月  24 12:39 boot
drwxr-xr-x.  2 root root    6 7月  24 12:39 dev
drwxr-xr-x. 75 root root 8192 7月  24 12:42 etc
drwxr-xr-x.  2 root root    6 4月  11 2018 home
lrwxrwxrwx.  1 root root    7 7月  24 12:40 lib -> usr/lib
lrwxrwxrwx.  1 root root    9 7月  24 12:40 lib64 -> usr/lib64
drwxr-xr-x.  2 root root    6 4月  11 2018 media
drwxr-xr-x.  2 root root    6 4月  11 2018 mnt
drwxr-xr-x.  2 root root    6 4月  11 2018 opt
drwxr-xr-x.  2 root root    6 7月  24 12:39 proc
dr-xr-x---.  2 root root  114 7月  24 12:43 root
drwxr-xr-x.  2 root root    6 7月  24 12:39 run
lrwxrwxrwx.  1 root root    8 7月  24 12:40 sbin -> usr/sbin
drwxr-xr-x.  2 root root    6 4月  11 2018 srv
drwxr-xr-x.  2 root root    6 7月  24 12:39 sys
drwxrwxrwt.  7 root root  132 7月  24 12:43 tmp
drwxr-xr-x. 13 root root  155 7月  24 12:40 usr
drwxr-xr-x. 19 root root  251 7月  24 12:41 var
[root@localhost modify]# vim ./etc/sysconfig/network-scripts/ifcfg-eth0 
[root@localhost modify]# cat ./etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="192.168.188.138"
PREFIX="24"
GATEWAY="192.168.188.2"
DNS1="8.8.8.8"
IPV6_PRIVACY="no"
[root@localhost modify]# cd
[root@localhost ~]# guestunmount /kvm/modify/
[root@localhost ~]# ll /kvm/modify/
总用量 0

修改对应的配置文件方便kvm识别并为之对应

root@localhost ~]# cp /etc/libvirt/qemu/{template.xml,test-quickly.xml}
[root@localhost ~]# vim /etc/libvirt/qemu/test-quickly.xml
改主机名:
    <name>test-quickly</name>
删除uuid
改磁盘:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm/vdisks/test-quickly.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
改vnc端口(避免端口冲突):
    <graphics type='vnc' port='6901' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
删除网卡mac地址(删除后如下):
    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

开始定义虚拟机

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     template                       关闭

[root@localhost ~]# virsh define /etc/libvirt/qemu/test-quickly.xml 
定义域 test-quickly(从 /etc/libvirt/qemu/test-quickly.xml)

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     template                       关闭
 -     test-quickly                   关闭

[root@localhost ~]# virsh start test-quickly
域 test-quickly 已开始

[root@localhost ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 3     test-quickly                   running
 -     template                       关闭

[root@localhost ~]# 

使用vnc访问查看虚拟机状态(查看ip是否被修改)

快速创建完成

2.3.1、快速创建脚本和模板 

上述这个过程中很多内容可以通过修改模板文件后使用脚本代替我们完成,我们只需要提供一些基础参数(ip,主机名,虚拟机名)使用脚本调用对应参数实现脚本位于最开始clone下的项目中,操作如下

[root@localhost ~]# cp kvmvirtual/virtual_create/createvm.sh /usr/local/bin/createvm
[root@localhost ~]# chmod a+x /usr/local/bin/createvm 
[root@localhost ~]# createvm --help
用法: createvm [hapn]... 
 Create a virtual machine and create a fixed 
 IP address, vnc port, virtual machine name 
 	 -h, --help 获取帮助信息
 	 -a, --address 设置IP地址
 	 -p, --port 设置vnc端口
 	 -n, --name 设置虚拟机名称
 退出状态:
 	 0 正常
 	 1404 一般问题 (例如:没有对应的选项)
 	 x403 严重问题 (例如:设置参数不正确)

制作模板文件

[root@localhost ~]# vim /etc/libvirt/qemu/template.xml
修改虚拟机名和删除uuid
    <domain type='kvm'>
      <name>NAME</name>
      <memory unit='KiB'>2097152</memory>

修改磁盘配置
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm/vdisks/NAME.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
删除网卡mac
修改vnc端口
    <graphics type='vnc' port='VNCPORT' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>

使用脚本制作虚拟机

[root@localhost ~]# createvm -a 192.168.188.139 -p 6902 -n test-createvm-commands-01

 使用vnc登录查看

实际操作中通常会通过将jumpserver的认证脚本,zabbix-agent自启动配置在模板中,快速创建后第一次开机即可自动进行认证。

3、KVM虚拟机生命周期管理

[root@localhost ~]# virsh list
#查看运行中的虚拟机

[root@localhost ~]# virsh list --all
#查看所有虚拟机

[root@localhost ~]# virsh start test-quickly
#启动虚拟机test-quickly

[root@localhost ~]# virsh reboot test-quickly
#重启虚拟机test-quickly

[root@localhost ~]# virsh reboot test-quickly
#重启虚拟机test-quickly

[root@localhost ~]# virsh destroy test-quickly
#虚拟机test-quickly断电

[root@localhost ~]# virsh shutdown test-quickly
#虚拟机test-quickl关机

[root@localhost ~]# virsh console test-quickly
#连接到虚拟机test-quickly

使用 virsh console连接时候可能会遇到如下错误导致无法退出

 这时使用ctrl+](ctrl和右中括号)退出当前连接

如果console连接卡住不动, 则通过vnc进入到对应的虚拟机中在以下文件中添加内容

# cat /etc/securetty | tail -n 1
ttyS0
# cat /etc/grub2.cfg | grep ttyS0
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet console=ttyS0

#此处如果有两个linux16开头的行则需要都添加console=ttyS0

4、虚拟机资源管理

 虚拟机cpu,内存,磁盘调整

#> cpu及memory的调整(须关机调整)
$ virsh edit VIRTUAL_MACHINES_NAME
<domain type='kvm'>
  <name>VIRTUAL_MACHINES_NAME</name>
  <uuid>752b7fc7-3446-40d3-9868-d46acf9a8b78</uuid>
  <memory unit='KiB'>16777216</memory>
  <currentMemory unit='KiB'>16777216</currentMemory>
  <vcpu placement='static'>4</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  ......
  ......
  ......
#> disk磁盘增加
$ qemu-img create -f [raw/qcow2] /kvm/vdisks/VMACHINE_NAME_DATA_NUMBER.[raw/qcow2] size
$ virsh attach-disk VMACHINE_NAME /kvm/vdisks/VMACHINE_NAME_DATA_NUMBER.[raw/qcow2] vdx
    #    挂载位置
$ virsh edit VMACHINE_NAME
......
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/ROOT/kvm/images/k8s-master-01.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw/qcow2'/>
      <source file='/kvm/vdisks/VMACHINE_NAME.raw/qcow2'/>
      <target dev='vdx' bus='virtio'/>
    </disk>
......
#> disk磁盘移除
$ virsh detach-disk VMACHINE_NAME vdx

生产中对虚拟机进行配置以及相关重大变更的时候, 通常需要对虚拟机进行快照的创建; 以及在业务扩容的过程中, 将已存在的且符合生产要求的虚拟机进行克隆, 可以最快速的增加服务负载;

#> 快照的创建 -> 恢复 -> 删除
$ virsh snapshot-create-as VMACHINE_NAME VMACHINE_NAME-snapshot-$(date +%Y%m%d%H%M%S)
$ vrish snapshot-revert VMACHINE_NAME VMACHINE_NAME-snapshot-xxxxxxxxxxxxxx
$ virsh snapshot-delete VMACHINE_NAME VMACHINE_NAME-snapshot-xxxxxxxxxxxxxx
#> 克隆(需要对OLD_VMACHINE_NAME机器关机)
$ virt-clone -o OLD_VMACHINE_NAME -n NEW_VMACHINE_NAME -f /kvm/vdisks/NEW_VMACHINE_NAME.qcow2

通常情况下, 当宿主机需要生产维护or宕机灾难时, 需要我们快速的对其上的虚拟机进行迁移, 考虑到这种情况, 就需要在KVM环境实施之前将虚拟磁盘存储目录变更为NFS/GFS的集群文件系统, 让多台KVM宿主机均可访问同一个地方的虚拟磁盘, 这也方便了我们进行迁移操作; 当然宿主机与宿主机之间也要保证网络等基础环境资源的一致性, 相互之间也一定要做好免密认证;

$ virsh migrate --live hiops_test_migrate qemu+ssh://root@192.168.121.12/system --verbose --unsafe

5、图形化界面操作

以上环境均为无图形化操作手册,用于理解配置文件位置及操作原理,实际工作中,大部分操作均可使用webvirtualcloud和virt-manager两种虚拟机管理工具进行操作,操作方式与vmware十分相似,网上也有很多类似教程,这里展示一下webvirtualcloud的手动部署( 如果工作环境可以使用外国网络环境可以直接使用github上提供的一键安装)

$ cat /etc/redhat-release
CentOS Stream release 8

    #    至少是centos8

$ sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
$ systemctl disable --now firewalld
$ yum -y install epel-release
$ yum -y install python3-virtualenv python3-devel libvirt-devel glibc gcc \
    nginx supervisor python3-lxml git python3-libguestfs iproute-tc \
    cyrus-sasl-md5 python3-libguestfs
$ cd /srv/
$ git clone https://github.com/retspen/webvirtcloud && cd webvirtcloud
Cloning into 'webvirtcloud'...
remote: Enumerating objects: 8955, done.
remote: Counting objects: 100% (927/927), done.
remote: Compressing objects: 100% (457/457), done.
remote: Total 8955 (delta 474), reused 864 (delta 451), pack-reused 8028
Receiving objects: 100% (8955/8955), 8.25 MiB | 649.00 KiB/s, done.
Resolving deltas: 100% (5965/5965), done.


$ pip3 install -i https://mirrors.ustc.edu.cn/pypi/web/simple pip -U
$ pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple
$ pip install -U setuptools virtualenv
$ cp webvirtcloud/settings.py.template webvirtcloud/settings.py
$ virtualenv -p $(which python3) /srv/envs/webvirtcloud

    #     这条命令的目的是在 /srv/envs/ 目录下创建一个使用 Python 3 解释器的虚拟环境,用于隔离和管理 webvirtcloud 应用程序所需的 Python 环境和依赖。

$ source /srv/envs/webvirtcloud/bin/activate
(webvirtcloud) $ python /srv/webvirtcloud/conf/runit/secret_generator.py
X^*tIo&S|GhwygIp3}X)qs{wkcAy=vay~.%4^kU#,iKZs*\`&V
$ vim /srv/webvirtcloud/webvirtcloud/settings.py
SECRET_KEY = "X^*tIo&S|GhwygIp3}X)qs{wkcAy=vay~.%4^kU#,iKZs*\`&V"
$ cd /srv/webvirtcloud/
$ pip install -r conf/requirements.txt
$ python manage.py makemigrations
$ python manage.py migrate
$ vim /etc/supervisord.d/webvirtcloud.ini
[program:webvirtcloud]
command=/srv/envs/webvirtcloud/bin/gunicorn webvirtcloud.wsgi:application -c /srv/webvirtcloud/gunicorn.conf.py
directory=/srv/webvirtcloud
user=root
autostart=true
autorestart=true
redirect_stderr=true
[program:novncd]
command=/srv/envs/webvirtcloud/bin/python /srv/webvirtcloud/console/novncd
directory=/srv/webvirtcloud
user=root
autostart=true
autorestart=true
redirect_stderr=true
$ systemctl enable --now supervisord
$ supervisorctl reload
$ supervisorctl update
$ supervisorctl restart all
$ supervisorctl status
novncd                           RUNNING   pid 15774, uptime 0:00:06
webvirtcloud                     RUNNING   pid 15775, uptime 0:00:06
$ cp conf/nginx/webvirtcloud.conf /etc/nginx/conf.d/

    #    这里需要把nginx自带的虚拟主机注释掉

$ systemctl enable --now nginx

遇到usb不支持的情况,解决办法如下

$ vim /srv/webvirtcloud/vrtManager/create.py
     if "usb" in dom_caps["disk_bus"]:
         xml += """<input type='mouse' bus='{}'/>""".format("virtio" if virtio else "usb")
         xml += """<input type='keyboard' bus='{}'/>""".format("virtio" if virtio else "usb")
         xml += """<input type='tablet' bus='{}'/>""".format("virtio" if virtio else "usb")
     else:
         xml += """<input type='mouse'/>"""
         xml += """<input type='keyboard'/>"""
         xml += """<input type='tablet'/>"""
    #    修改为以下配置
      if "usb" in dom_caps["disk_bus"]:
          pass
      else:
          pass

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EasyGBS国标GB28181平台P2P远程访问故障排查指南:客户端角度的排查思路

在现代视频监控系统中&#xff0c;P2P&#xff08;点对点&#xff09;技术因其便捷性和高效性而被广泛应用。然而&#xff0c;当用户在使用P2P远程访问时遇到设备不在线或无法访问的问题时&#xff0c;有效的排查方法显得尤为重要。本文将从客户端的角度出发&#xff0c;详细探…

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述

定义 开放词汇目标检测&#xff08;Open-Vocabulary Object Detection, OVOD&#xff09;是一种目标检测任务&#xff0c;旨在检测和识别那些未在训练集中明确标注的物体类别。传统的目标检测模型通常只能识别有限数量的预定义类别&#xff0c;而OVOD模型则具有识别“开放词汇…

《信管通低代码信息管理系统开发平台》Windows环境安装说明

1 简介 《信管通低代码信息管理系统应用平台》提供多环境软件产品开发服务&#xff0c;包括单机、局域网和互联网。我们专注于适用国产硬件和操作系统应用软件开发应用。为事业单位和企业提供行业软件定制开发&#xff0c;满足其独特需求。无论是简单的应用还是复杂的系统&…

畅捷通-条件竞争

反编译dll 逻辑上很清晰了。取得上传数据然后直接写入Templates目录里去&#xff0c;且写入路径直接拼接文件名&#xff0c;说明写入路径可控。然后马上又调用Delete方法删除文件。看起来貌似很正常的样子&#xff0c;但实际上这里已经出现了严重的安全问题。首先是未限制上传…

重温设计模式--工厂模式(简单、工厂、抽象)

文章目录 工厂模式定义工厂模式通常可以细分为以下几种类型1、简单工厂模式&#xff08;Simple Factory Pattern&#xff09;2、工厂方法模式&#xff08;Factory Method Pattern&#xff09;3、抽象工厂模式&#xff08;Abstract Factory Pattern) UML 图1、简单工厂模式UML2、…

华为手机鸿蒙4.2连接不上adb

1、下载HiSuite华为手机助手 https://consumer.huawei.com/cn/support/hisuite/ 2、安装后点连接 3、就可以adb连接了

重温设计模式--代理模式

文章目录 定义UML图代理模式主要有以下几种常见类型&#xff1a;代理模式涉及的主要角色有&#xff1a;C 代码示例 定义 代理模式&#xff08;Proxy Pattern&#xff09;属于结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…

JAVA开发入门学习七- 数组

数组的概念 概念 数组&#xff1a; 是多个相同类型数据按照一定排列的集合&#xff0c;并使用一个名字命名&#xff0c;并通过编号的方式对这些数据进行统一管理 数组中的概念 数组名&#xff1a; 数组的名称&#xff0c;命名 下标&#xff1a; 从0开始 元素&#xff1a;…

ECharts热力图-笛卡尔坐标系上的热力图,附视频讲解与代码下载

引言&#xff1a; 热力图&#xff08;Heatmap&#xff09;是一种数据可视化技术&#xff0c;它通过颜色的深浅变化来表示数据在不同区域的分布密集程度。在二维平面上&#xff0c;热力图将数据值映射为颜色&#xff0c;通常颜色越深表示数据值越大&#xff0c;颜色越浅表示数…

【解决问题】Java2DRenderer生成图片时中文乱码 Linux安装字体

一&#xff0c;问题 在使用Java2DRenderer框架将html生成图片时&#xff0c;html中的中文文本在图片上显示框框&#xff0c;即出现了中文乱码。在确认使用正确的字符编码utf-8之后&#xff0c;并且确认了修改成unicode也同样乱码的情况下&#xff0c;找到了真正的原因&#xf…

HTMLCSSJavaScriptDOM 之间的关系?

一、HTML 中文名&#xff1a;超文本标记语言 英文名&#xff1a;HyperText Markup Language HTML是一种用来结构化Web网页及其内容的标记语言。 HTML 由一系列的元素组成&#xff0c;这些元素可以用来包围不同部分的内容&#xff0c;使其以某种方式呈现或者工作。 图Ⅰ 每…

Linux系统编程深度解析:C语言实战指南

文章一览 前言一、gcc编译系统1.1 文件名后缀1.2 C语言编译过程1.3 gcc命令行选项 二、gdb程序调试工具2.1 启动gdb和查看内部命令2.2 显示源程序和数据2.2.1 显示和搜索源程序2.2.2 查看运行时数据 2.3 改变和显示目录或路径2.4 控制程序的执行2.4.1 设置断点2.4.2 显示断点2.…

使用QML实现播放器进度条效果

使用QML实现播放进度效果 QML Slider介绍 直接上DEMO如下&#xff1a; Slider {width: 300;height: 20;orientation: Qt.Vertical; //决定slider是横还是竖 默认是HorizontalstepSize: 0.1;value: 0.2;tickmarksEnabled: true; //显示刻度}效果图如下 那么我先改变滑块跟滚轮…

云数智融合体系建设实践——以工行软件开发中心为例

随着“云计算第三次浪潮”的涌动&#xff0c;业界正见证着一场围绕“算力”的结构性变革。云计算、大数据、人工智能三大核心技术的深度融合&#xff0c;正推动着算力基础设施的快速发展&#xff0c;实现算力的高效调度与利用&#xff0c;也标志着业界对云计算体系布局的全新理…

评估大语言模型在药物基因组学问答任务中的表现:PGxQA

​这篇文献主要介绍了一个名为PGxQA的资源&#xff0c;用于评估大语言模型&#xff08;LLM&#xff09;在药物基因组学问答任务中的表现。 研究背景 药物基因组学&#xff08;Pharmacogenomics, PGx&#xff09;是精准医学中最有前景的领域之一&#xff0c;通过基因指导的治疗…

com.google.common.collect.ImmutableList$SerializedForm

今天AndroidStudio安装了个2021版本的&#xff0c;gradle用了7.3.3&#xff0c;创建项目后控制台总是有这样一个错误&#xff1a; Unable to load class com.google.common.collect.ImmutableList$SerializedForm. This is an unexpected error. Please file a bug containing…

[机器学习]sklearn入门指南(2)

上一篇文章中&#xff0c;我们介绍了如何用sklearn训练和预测模型&#xff0c;以及缺失值处理&#xff0c;详见[机器学习]sklearn入门指南&#xff08;1&#xff09; 分类变量 分类变量&#xff08;Categorical Variable&#xff09;&#xff0c;也称为定性变量&#xff08;Q…

CentOS下,离线安装vscode的步骤;

前置条件&#xff1a; 1.CentOS7; 步骤&#xff1a; 1.下载vscode指定版本&#xff0c;例如&#xff1b; 例如 code-1.83.1-1696982959.el7.x86_64.rpm 2.使用下面命令&#xff1a; sudo rpm -ivh code-1.83.1-1696982959.el7.x86_64.rpm 其他&#xff1a; 卸载vscode的命…

AI一键制作圣诞帽头像丨附详细教程

我用AI换上圣诞帽头像啦~&#x1f385; 不管是搞笑表情、宠物头像还是你的自拍&#xff01;&#xff01;都能一键添加圣诞帽元素&#xff0c;毫无违和感&#xff01;&#x1f389; 详细教程在P3、P4&#xff0c;手残党也能轻松搞定&#xff01; 宝子们需要打“need”&#xff0…

基于java博网即时通讯软件的设计与实现【源码+文档+部署讲解】

目 录 1. 绪 论 1.1. 开发背景 1.2. 开发意义 2. 系统设计相关技术 2.1 Java语言 2.2 MySQL数据库 2.3 Socket 3. 系统需求分析 3.1 可行性分析 3.2 需求分析 3.3 系统流程图 3.4 非功能性需求 4. 系统设计 4.1 系统功能结构 4.2 数据库设计 5. 系统实现 5.…