小阿轩yx- KVM 高级功能部署

news2024/9/21 17:59:50

小阿轩yx- KVM 高级功能部署

案例分析

案例概述

  • 企业内部为了使服务器资源达到最大化利用会进行 KVM 虚拟化
  • 每台服务器部署多台 KVM 虚拟机。KVM 虚拟机数量不断增多个别服务器会出现资源过载现象,就需要对部分 KVM 虚拟机迁移
  • 针对可停机的 KVM 虚拟机可使用静态迁移方式迁移KVM虚拟机
  • 针对在线提供服务、不可停机的KVM虚拟机可使用基于共享动态迁移或基于模块动态迁移完成工作
  • 除迁移外,还可以在KVM宿主机上开启KSM内核同页合并,达到节省内存、降低负载目的

案例前置知识点

KVM 虚拟机迁移
  • 将某一个虚拟机上的环境和软件完全复制到另一台物理机上继续运行

好处

  • 可以优化系统负载
  • 重新规划 KVM 虚拟机布局并简化 KVM 虚拟机的管理维护工作

主要应用场景

  • 当一台 KVM 宿主机负载较高时,可将源 KVM 宿主机上的部分虚拟机迁移到堵在较低的 KVM 宿主机中,保证服务质量
  • 通过 KVM 虚拟机迁移将多台负载较低的 KVM 宿主机上的 KVM 虚拟机集中迁移到某一台 KVM 宿主机上,达到节约资源的目的
  • 升级 KVM 宿主机硬件设备时,可以将 KVM 宿主机上运行的 KVM 虚拟机迁移到其它 KVM 宿主机上,以解决对硬件的依赖,实现业务不中断情况下对物理硬件设备的升级
  • 跨地域迁移,实现 KVM 虚拟机的远程迁移

迁移方式分为

  • 静态迁移(static magratiopn)
  • 动态迁移(live migration)

区别

  • 静态迁移会有一段时间虚拟机中的服务是不可用的
  • 动态迁移没有明显的服务暂停时间

静态迁移

  • 需要先关闭要迁移的 KVM 虚拟机,并拷贝它的磁盘文件和配置文件搭配目标 KVM 宿主机,然后恢复启动,实现静态迁移

动态迁移

  • 保证 KVM 虚拟机上运行的应用正常提供服务的同时,让 KVM 虚拟机在不同的 KVM 宿主机之间进行迁移

动态迁移两种方式

  • 基于共享存储
  • 基于数据块

基于共享存储动态迁移

  • 在 KVM 虚拟机迁移开始后,被迁移的 KVM 虚拟机依然保持在源 KVM 宿主机上运行。同时,KVM 虚拟机内存页被传输到目标 KVM 宿主机之上

基于数据块的动态迁移

  • 对使用本地存储的 KVM 虚拟机进行在线迁移

KSM 内核同页合并

  • KSM(Kernel SamePage Merging)
  • 允许内核在两个或多个进程之间共享完全相同的内存页

QEMU/KVM

  • 一个 KVM 虚拟机就是一个 QEMU 进程
  • 使用 KSM 也可以实现多个 KVM 虚拟机之间相同内存合并
  • 在 KVM 虚拟化环境中,KSM 能够提高内存的利用率

KSM

  • 最初是为在 KVM 虚拟化中使用开发的
  • 它对非虚拟化系统依然非常有用
  • 可以提高 KVM 宿主机中内存的使用效率,一般建议开启 KSM 功能

使用 KSM 时为了防止内存过载,最好保证系统的交换分区(swap space)足够大

案例环境

  • 使用三台服务器模拟 KVM 虚拟机迁移

案例环境表 

主机

操作系统

IP地址

主要软件

kvm01

CentOS7.9 x86_64

192.168.10.201

Qemu-kvm、libvirt

kvm02

CentOS7.9 x86_64

192.168.10.202

Qemu-kvm、libvirt、qemu-kvm-ev

kvmnfs

CentOS7.9 x86_64

192.168.10.101

nfs-utils

案例需求

  • 通过静态迁移实现 KVM 虚拟机的迁移
  • 通过基于共享存储的动态迁移方式实现 KVM 虚拟机的迁移
  • 通过基于数据块的动态迁移方式实现 KVM 虚拟机的迁移
  • 实现  KSM 内存优化

案例实现思路

  • 通过拷贝磁盘文件和配置文件的方式实现静态迁移
  • 通过配置 NFS 共享服务,实现基于共享存储的动态迁移
  • 通过基于 数据块的方式实现动态迁移
  • 针对同类型 KVM 虚拟机和应用使用 KSM 来优化内存

案例实施

  • 恢复上一章201的kvm01快照

进入目录检查是否有 iso 镜像

[root@kvm01 ~]# cd /opt
[root@kvm01 opt]# ls
CentOS-7-x86_64-DVD-2009.iso    rh

查看文件

[root@kvm01 opt]# ll -h
总用量 4.4G
-rw-r--r--. 1    root    root 4.4G    5月    23    2022    CentOS-7-x86_64-DVD-2009.iso
drwxr-xr-x. 2    root    root    6    10月   31    2018    rh

创建目录

[root@kvm01 opt]# mkdir -p /data_kvm/store

生成虚拟机

[root@kvm01 opt]# virt-install -n test01 -r 1024 --vcpus=1 --disk path=/data_kvm/store/test01.qcow2,size=10 -w bridge:br0 --virt-type=kvm --accelerate --autostart -c /opt/CentOS-7-x86_64-DVD-2009.iso --vnc --vncport=5901 --vnclisten=0.0.0.0

这一步如果报错,就用 VNC 安装虚拟机

直接默认完成

这一步重启之后VNC就连接不上了

查看状态

[root@kvm01 opt]# virsh list --all
Id            名称            状态
----------------------------------
-            test01           关闭

启动服务

[root@kvm01 opt]# virsh start test01
域    test01 已开始

再次连接

静态迁移

查看虚拟机状态

[root@kvm01 opt]# virsh list --all
Id    名称         状态
----------------------------------
2     test01       running

关闭虚拟机

[root@kvm01 opt]# virsh shutdown test01
域 test01 被关闭

查看虚拟机状态

[root@kvm01 opt]# virsh list --all
Id    名称         状态
----------------------------------
-     test01       关闭

定位虚拟机 test01 磁盘文件

[root@kvm01 opt]# virsh domblklist test01
目标    源
-----------------------------------------
hda    /data_kvm/store/test01.qcow2
hdb    -

导出虚拟机 test01 的 xml 配置文件

[root@kvm01 opt]# cd
[root@kvm01 ~]# virsh dumpxml test01 > test01.xml

查看

[root@kvm01 ~]# ls
ali                initial-setup.cfg    公共    视频    文档    音乐
anaconda-ks.cfg    test01.xml           模版    图片    下载    桌面

打开 KVM02 终端

在 kvm02 创建目录

[root@kvm2 ~]# mkdir -p /data_kvm/store

拷贝配置文件和磁盘文件到目标宿主机 kvm02 上

[root@kvm01 ~]# scp test01.xml 192.168.10.202:/etc/libvirt/qemu/
//这一步输入 yes
Are you sure you want to continue connecting (yes/no)? yes
//输入密码
root@192.168.10.202's password:
test01.xml                        100%  3412    949.9KB/s 00:00
[root@kvm01 ~]# scp /data_kvm/store/test01.qcow2 192.168.10.202:/data_kvm/store/
root@192.168.10.202's password:
test01.qcow2                      100%    10GB 111.6MB/s    01:31

kvm02 上配置和启动目标虚拟主机

进入目录并查看配置文件

[root@kvm02 ~]# cd /data_kvm/store/
[root@kvm02 store]# ls
test01.qcow2

重新定义虚拟机 test01

[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml
定义域    test01 (从 /etc/libvirt/gemu/test@1.xml)

在 kvm02 查看状态

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

启动服务

[root@kvm02 ~]# virsh start test01
域    test01 已开始

再查看状态

[root@kvm02 ~]# virsh list --all
Id      名称          状态    
--------------------------------
1      test01         running

启动 kvm01

[root@kvm01 ~]# virsh start test01
域    test01 已开始

查看状态

[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
3      test01         running

新开一台101机器

关闭防火墙、内核机制

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

安装软件包

[root@localhost ~]# yum -y install nfs-utils

创建目录

[root@localhost ~]# mkdir /data 

提高权限

[root@localhost ~]# chown -R 777 /data/

编辑配置文件

[root@localhost ~]# vim /etc/exports
/data 192.168.10.0/24(rw,sync,no_root_squash)

启动服务

[root@localhost ~]# systemctl start nfs 
[root@localhost ~]# systemctl start rpcbind

这里同步201和202会话

创建挂载点

[root@kvm01 ~]# mkdir /data_kvm/kgc
[root@kvm02 ~]# mkdir /data_kvm/kgc

挂载

[root@kvm01 ~]# mount 192.168.10.101:/data /data_kvm/kgc 

查看

[root@kvm01 ~]# mount

设置自动挂载

[root@kvm01 ~]# vim /etc/fstab
//添加配置
192.168.10.101:/data /data_kvm/kgc nfs defaults 0 0

进入目录

[root@kvm01 ~]# cd /opt

将实验用到的系统镜像上传到KVM主机的root家目录中。

这里直接使用CentOS官方提供的qcow2格式的系统镜像(CentOS-7-x86_64-GenericCloud-2009.qcow2)

取消会话同步

拷贝qcow2磁盘文件

[root@kvm01 opt]# cp CentOS-7-x86_64-GenericCloud-2009.qcow2 /data_kvm/kgc/test02.qcow2

为系统镜像设置密码

[root@kvm01 ~]# virt-customize -a /data_kvm/kgc/test02.qcow2 --root-password password:aptech
[  0.0] Examining the guest ...
[ 18.6] Setting a random seed
[ 18.7] Setting passwords
[ 20.7] Finishing off

生成虚拟机

[root@kvm01 ~]# virt-install --name=test02 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/data_kvm/kgc/test02.qcow2',size=10 -w bridge:br0 --virt-type=kvm --boot hd

查看状态

[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
3      test01         running
5      test02         running

进入虚拟机查看调出管理界面

[root@kvm01 ~]# virt-manager

直接就是登录界面 

动态迁移

查看 kvm02 虚拟机状态

[root@kvm02 ~]# virsh list --all
Id      名称          状态    
--------------------------------
1      test01         running

kvm01 关闭虚拟机

[root@kvm01 ~]# virsh shutdown test02 
域    test02 被关闭

编辑配置文件

[root@kvm01 ~]# virsh edit test02
//添加配置
<driver name='qemu' type='qcow2' cache='none'/>

启动 test02

[root@kvm01 ~]# virsh start test02
域    test02 已开始

查看状态

[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
3      test01         running
6      test02         running

迁移文件

[root@kvm01 ~]# virsh migrate --live --verbose test02 qemu+ssh://192.168.10.202/system tcp://192.168.10.202
root@192.168.10.202's password:
迁移:[100%]

迁移之后 kvm01 上虚拟机 test02 被关闭,目标宿主机 kvm02 上虚拟机 test02 处于启动状态

202进入目录

[root@kvm02 ~]# cd /etc/libvirt/qemu/

生成配置文件并指定路径

[root@kvm02 ~]# virsh dumpxml test02 > /etc/libvirt/qemu/test02.xml

定义虚拟机 test02 配置文件

[root@kvm02 qemu]# virsh define /etc/libvirt/qemu/test02.xml
定义域    test02 (从 /etc/libvirt/qemu/test02.xml)

201和202会话同步

设置好阿里巴巴的 yum  源

[root@kvm01 ~]# rm -rf /etc/yum.repos.d/*
[root@kvm01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo
[root@kvm01 ~]# https://mirrors.aliyun.com/repo/Centos-7.repo
[root@kvm01 ~]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@kvm01 ~]# yum clean all

安装软件包

[root@kvm01 ~]# yum -y install centos-release-qemu-ev 

查看仓库

[root@kvm01 ~]# yum repolist
源标识                        源名称                 状态
Cent0s-Base                   CentOS-Base            0
centos-gemu-ev/7/x86_64       CentOS-7 - QEMU EV     0
epel                          epel                   0
epelrepolist: 0

下一步解决上一步状态都是0的问题

进入目录

[root@kvm01 ~]# cd /etc/yum.repos.d/

修改仓库文件

[root@kvm01 yum.repos.d]# vim CentOS-QEMU-EV.repo

//修改前
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=virt-kvm-common
#baseurl=http://mirrors.aliyun.com/$contentdir/$releasever/virt/$basearch/kym-common

//修改后
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=virt-kvm-common
baseurl=http://mirrors.aliyun.com/$contentdir/$releasever/virt/$basearch/kym-common

清空 yum 缓存

[root@kvm01 yum.repos.d]# yun clean all

再次查看仓库

[root@kvm01 ~]# yum repolist
源标识                        源名称                 状态
Cent0s-Base                   CentOS-Base            16,396
centos-gemu-ev/7/x86_64       CentOS-7 - QEMU EV     63
epel                          epel                   13,798
epelrepolist: 30,257

安装软件包

[root@kvm01 yum.repos.d]# yum -y install qemu-kvm-ev

重启机器使安装包生效

[root@kvm01 yum.repos.d]# reboot

查看状态

[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
1      test01         running
-      test02         关闭
[root@kvm02 ~]# virsh list --all
Id      名称          状态    
--------------------------------
-      test01         关闭
-      test02         关闭

取消会话同步

关闭机器

[root@kvm01 ~]# virsh shutdown test01
域 test01 被关闭

进行克隆 

[root@kvm01 ~]# virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2
WARNING 设置图形设备端口为自动端口,以避免相互冲突。
正在分配'test03.qcow2                  |    10 GB 00:04
成功克隆'test03'。

查看状态

[root@kvm02 ~]# virsh list --all
Id      名称          状态    
--------------------------------
-      test01         关闭
-      test02         关闭
-      test03         关闭

启动

[root@kvm01 ~]# virsh start test03
域 test03 已开始

查看状态

[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
2      test03         running
-      test01         关闭
-      test02         关闭

202 上创建空磁盘文件

[root@kvm02 ~]# qemu-img create -f qcow2 /data_kvm/store/test03.qcow2 20G
Formatting '/data kvm/store/test03.gcow2',fmt=gcow2 size=21474836480 cluster size=65536 lazy refcounts=off refcount bits=16

 201 上迁移 test01

[root@kvm01 ~]# virsh migrate test03 qemu+ssh://192.168.10.202/system --live --persistent --undefinesource --copy-storage-all --verbose
root@192.168.10.202's password:
迁移:[100%]

查看状态

[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
-      test01         关闭
-      test02         关闭

202 上查看状态

[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
1      test03         running
-      test01         关闭
-      test02         关闭

配置 KSM 优化内存

在201上克隆多份 test 虚拟机

[root@kvm01 ~]# virt-clone -o test04 -n test04 -f /data_kvm/store/test02.qcow4
[root@kvm01 ~]# virt-clone -o test05 -n test05 -f /data_kvm/store/test03.qcow5
[root@kvm01 ~]# virt-clone -o test06 -n test06 -f /data_kvm/store/test04.qcow6
[root@kvm01 ~]# virt-clone -o test07 -n test07 -f /data_kvm/store/test02.qcow7
[root@kvm01 ~]# virt-clone -o test08 -n test08 -f /data_kvm/store/test03.qcow8
[root@kvm01 ~]# virt-clone -o test09 -n test09 -f /data_kvm/store/test04.qcow9

克隆虚拟机,源虚拟机需要关闭状态

开启所有的虚拟机

[root@kvm01 ~]# virsh start test01
[root@kvm01 ~]# virsh start test02
[root@kvm01 ~]# virsh start test03
[root@kvm01 ~]# virsh start test04
[root@kvm01 ~]# virsh start test05
[root@kvm01 ~]# virsh start test06
[root@kvm01 ~]# virsh start test07
[root@kvm01 ~]# virsh start test08
[root@kvm01 ~]# virsh start test09

查看状态

​[root@kvm01 ~]# virsh list --all
Id      名称          状态    
--------------------------------
3      test01         running
4      test02         running
5      test04         running
6      test05         running
7      test06         running
8      test07         running
9      test08         running
10     test09         running

查看内存使用情况

[root@kvm01 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        3861288     2464360      135440       15208     1261488     1157748
Swap:       4194300           0     4194300

进入配置文件

[root@kvm01 ~]# vim /boot/config-3.10.0-1160.el7.x86_64
//查找配置
CONFIG_KSM=y

设定参数 1

[root@kvm01 ~]# echo 1 > /sys/kernel/mm/ksm/run
  • 1:启动 KSM 优化功能

启动并设置永久启动 KSM 优化功能

[root@kvm01 ~]# systemctl start ksm
[root@kvm01 ~]# systemctl start ksmtuned
[root@kvm01 ~]# systemctl enable ksm
[root@kvm01 ~]# systemctl enable ksmtuned

重启系统

[root@kvm01 ~]# reboot

再次查看内存使用情况

[root@kvm02 ~]# free
              total        used        free      shared  buff/cache   available
Mem:        3861288     2449008      103556       15212     1308724     1173004
Swap:       4194300           0     4194300

小阿轩yx- KVM 高级功能部署

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为你的世界,开一扇任意门 (中篇)

传送门 《为你的世界&#xff0c;开一扇任意门&#xff08;上篇&#xff09;》 一、蓬门今始为君开 在上篇&#xff0c;为各位朋友展示了&#xff0c;在【我的电脑】中添加自己的任意门后的效果。 本篇直接上干货&#xff0c;手把手教大家实操&#xff08;dll插件和自动化注册…

PostgreSQL如何入门学习?

在各种数据岗招聘中&#xff0c;SQL几乎成为了必备技能。有公司的地方就会有数据&#xff0c;有数据的地方就会有数据库&#xff0c;有数据库的地方就会有SQL。 SQL在数据分析中到底有多重要&#xff1f;这么说吧&#xff0c;除了Excel外&#xff0c;SQL是数据工作最常接触的到…

Java--接口和内部类

目录 接口接口的使用接口的特性多继承问题对象类型进行比较深拷贝和浅拷贝浅拷贝深拷贝 接口和抽象类区别 Object类内部类实例内部类静态内部类局部内部类匿名内部类 接口 接口是一种引用数据类型&#xff0c;语法和抽象类类似&#xff0c;只不过需要把abstract换成interface 接…

JavaScript (七)——JavaScript 对象和函数

目录 JavaScript 对象 真实生活中的对象&#xff0c;属性和方法 JavaScript 对象 对象定义 对象属性 访问对象属性 对象方法 JavaScript 函数 JavaScript 函数语法 调用带参数的函数 带有返回值的函数 局部 JavaScript 变量 全局 JavaScript 变量 JavaScript 变量…

“遥遥领先”的观察者模式

前提 观察者模式是我们在开发时经常会用到的模式&#xff0c;最近在维护公司项目时看见了前辈的代码用到了观察者模式。就想来和大家讲解观察者模式 观察者模式 生搬硬套概念肯定会让我们新手很难理解&#xff0c;刚好最近华为手机出新机了&#xff0c;一机难抢&#xff0c;…

内存问题检测

内存检测方式 gcc/g 内存检测方式如下&#xff0c;添加一些编译标签&#xff1a; -fsanitizeleak 检测内存泄漏。例如添加标签&#xff1a;-fsanitizeleak -g -O0-fsanitizeaddress 检测内存越界。例如添加标签&#xff1a;-fsanitizeaddress -g -O2&#xff0c;优化级别开…

ThreadLocal详解及ThreadLocal源码分析

提示&#xff1a;ThreadLocal详解、ThreadLocal与synchronized的区别、ThreadLocal的优势、ThreadLocal的内部结构、ThreadLocalMap源码分析、ThreadLocal导致内存泄漏的原因、要避免内存泄漏可以用哪些方式、ThreadLocal怎么解决Hash冲突问题、避免共享的设计模式、ThreadLoca…

Android DexOpt七种触发流程解析【原创硬核】

Android 13 DexOpt七种触发流程解析 众所周知&#xff0c;DexOpt是安卓应用性能优化非常重要的手段&#xff0c;相当于将应用对虚拟机的多层调用直接转化成了arm机器码。Dex优化过和没优化过&#xff0c;效果千差万别。本文深入解析android系统DexOpt机制的触发流程。 1 DexOpt…

如何学习自动化测试工具!

要学习和掌握自动化测试工具的使用方法&#xff0c;可以按照以下步骤进行&#xff1a; 一、明确学习目标 首先&#xff0c;需要明确你想要学习哪种自动化测试工具。自动化测试工具种类繁多&#xff0c;包括但不限于Selenium、Appium、JMeter、Postman、Robot Framework等&…

安全编程的代码示例

一、python代码示例 一个安全编程的示例是对输入进行严格的验证和过滤。比如&#xff0c;当用户在网页上输入用户名和密码时&#xff0c;应该对这些输入进行验证&#xff0c;防止恶意用户输入恶意代码或进行 SQL 注入等攻击。下面是一个简单的示例代码&#xff1a; import…

OpenFeign微服务调用组件

一、跨服务、跨进程调用方式 1)Httpclient 使用Httpclient我们首先需要引入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </depend…

Meta/东京电子/FPT软件等共同贡献,Aitomatic发布首个半导体行业开源大模型,「锁死」企业技术自主权

2024 年初&#xff0c;研究机构 Market.us 发布报告预测&#xff0c;全球半导体市场规模将大幅增长&#xff0c;预计 2024 年可达到 6,731 亿美元&#xff0c;到 2032 年预计将增长至 1.3 万亿美元。 毫无疑问&#xff0c;这个万亿级市场与充满想象空间的 AI 密不可分。技术层…

【根号分治】 通知

通知 分析&#xff1a; 这道题根号分治看起来就没有前面几题那么明显了 emm当然也可能是我境界还没到 我们考虑如果暴力修改&#xff0c;复杂度是 O ( n m ) O(nm) O(nm)&#xff0c;其实m为这个点的度数 考虑根号分治的思想&#xff0c;我们令 m M m\sqrt M mM ​ 并命度数大…

申瓯通信设备有限公司在线录音管理系统(复现过程)

漏洞简介 申瓯通信设备有限公司在线录音管理系统 index.php接口处存在任意文件读取漏洞&#xff0c;恶意攻击者可能利用该漏洞读取服务器上的敏感文件&#xff0c;例如客户记录、财务数据或源代码&#xff0c;导致数据泄露 一.复现过程 fofa搜索语句:title"在线录音管…

idea显示properties文件中文乱码的解决方法

1.如下 File-》Settings-》File Encodings,修改如下图中绿框标注的内容 2.点击Apply-->OK 3.修改完成后显示

ROS八股

目录 一、ros1和ros2的区别是什么&#xff1f; 二、rostopic 和 rosserver的区别是什么&#xff1f; 三、讲一下ros的navigation框架 一、ros1和ros2的区别是什么&#xff1f; ROS 1和ROS 2是两个主要版本的机器人操作系统&#xff0c;它们在多个方面存在显著差异&#xff…

【Stable Diffusion】(基础篇七)—— lora

lora 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 除了大模型和VAE之外&…

MySQL:集合运算符

集合运算符 MySQL中的 集合运算符&#xff08;Set operators&#xff09;主要用于结合两个或多个SELECT语句的结果集&#xff0c;这些结果集应该具有相同的列数和数据类型&#xff0c;以便能够进行比较或合并。 需要注意的是&#xff0c;MySQL本身并没有直接称为“Set operat…

Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架

假设一个flask目录结构如下&#xff1a; my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…