部署 KVM 虚拟化平台
虚拟化技术的演变过程分为软件模拟、虚拟化层翻译、容器虚拟化三个阶段
1 软件模拟的技术方式
软件模拟是通过软件完全模拟CPU、网卡、芯片组、磁盘等计算机硬件,因为是软件模拟,所以理论上可以模拟任何硬件,甚至不存在的硬件。但是由于是软件模拟硬件,效率低,典型产品有 Bochs、QEMU。
2 虚拟化层翻译
X86平台指令集划分为4个特权模式:ring0、Ring1、Ring2、Ring3 操作系统工作在 Ring0 级别,应用程序使用Ring3,驱动程序使用 Ring1和 Ring2。
①完全虚拟化
X86在虚拟化方面的一个难点就是如何将虚拟机越级的指令使用进行隔离。这种方式称为全虚拟化,典型应用 VMware。
多数的虚拟化采用虚拟机管理程序Hypervisor
Hypervisor是一个软件层或者子系统(也称为VMM–Virtual Machine Monitor)
允许多种 OS 在相同的物理 OS 中运行;控制硬件并向 GuestOS 提供访问底层硬件的途径向 GuestOS 提供虚拟化的硬件
- 类型一:裸金属型(直接安装在硬件设备)
裸金属型虚拟化是一种在物理硬件上直接安装虚拟化软件的方式。在这种模式下,虚拟化软件(也称为hypervisor或虚拟机监控器)直接运行在物理硬件上,而不需要操作系统的支持。这意味着虚拟机可以直接访问底层硬件资源,如处理器、内存和存储设备,从而提供接近原生性能的虚拟化体验。
裸金属型虚拟化适用于需要最高性能和隔离性的场景,如高性能计算、大规模数据库和云计算等。由于没有操作系统的干扰,裸金属型虚拟化可以提供更高的性能和更好的资源利用率。 - 类型二:宿主型(安装的有OS的设备上)
宿主型虚拟化是一种在已安装操作系统的设备上运行虚拟化软件的方式。在这种模式下,虚拟化软件作为应用程序运行在宿主操作系统之上,称为宿主操作系统。虚拟机则作为这个宿主操作系统的进程运行,并通过宿主操作系统提供的接口来访问硬件资源。
宿主型虚拟化相对于裸金属型虚拟化来说更加灵活,因为它可以在常见的操作系统上运行,如Windows、Linux等。它也可以利用宿主操作系统的设备驱动程序来提供虚拟化的硬件支持,从而简化了虚拟机的管理和配置。 - 裸金属型虚拟化适用于需要高性能和隔离性的场景,而宿主型虚拟化更加灵活且易于管理。选择哪种虚拟化方式取决于具体的应用需求和硬件环境。
“OS"指的是操作系统(Operating System),它是一种软件,负责管理计算机的硬件和软件资源,并提供各种服务和功能给应用程序使用。常见的操作系统包括Windows、macOS和Linux等。
而"GuestOS"指的是在虚拟化环境中运行的虚拟机的操作系统。虚拟机是一种软件实体,它在物理计算机上模拟出一个完整的计算机系统,包括处理器、内存、硬盘等。GuestOS是在虚拟机中安装和运行的操作系统,可以是任意支持虚拟化技术的操作系统,例如Windows、Linux等。
在虚拟化技术中,物理计算机上的"Host OS”(宿主操作系统)负责管理物理硬件,并提供虚拟化的功能。它允许多个不同的GuestOS同时运行在同一台物理计算机上,每个GuestOS都被隔离在自己的虚拟机中,互相之间相互独立并且不能直接访问宿主操作系统或其他GuestOS。
通过虚拟化技术,Host OS向GuestOS提供了对底层硬件的访问,并将其虚拟化,使得GuestOS可以以为自己独占使用了底层硬件资源,从而实现了运行多个操作系统的能力。这种虚拟化的硬件通常称为"虚拟化的硬件"(virtualized hardware)。
②半虚拟化
对虚拟机的操作系统内核进行改造,使虚拟机自己对特殊指令进行更改,然后和虚拟化层一起配合工作,改造的虚拟机虽然使用上有限制,配置比较麻烦,但是这种方式效率非常高,也称为半虚拟化
对CPU指令进行改造.
x86 CPU环
核心指令直接调用运行Ring 0
应用程序运行调用Ring 3
Intel推出了硬件的方案,对CPU指令进行改造,即VT-x.增加了两种操作模式
③硬件辅助虚拟化
Intel-VT和AMD-V创建了一个新的Ring -1单独给Hypervisor使用
GuestOS可以直接使用Ring 0而无需修改
主流例如:KVM VM.ESXi Xen-3.0
3 容器虚拟化
容器虚拟化的原理时基于CGroups、Namespace等技术将进程隔离,每个进程就像一台单独的虚拟机一样,有自己被隔离出来的资源,也有自己的根目录,独立的进程编号,被隔离的内存空间。典型应用DOCKER
常见的虚拟化产品
-
RedHat KVM
虚拟化方式:完全虚拟化
架构:寄居架构(linux内核);祼金属架构RHEV-H -
VmWare ESX
虚拟化方式:完全虚拟化
架构:裸金属架构 -
Citrix XenServer
虚拟化方式:半虚拟化(linux安装linux);全虚拟化(linux安装windows),硬件辅助虚拟化 -
Microsoft Hyper-V
虚拟化方式:半虚拟化
架构:裸金属架构Hyper-V Server;寄居架构 Windows 2008 -
DOCKER
KVM 概述
KVM(Kernel-based Virtual Machine)是一种基于Linux内核的虚拟化技术,能够将Linux作为虚拟机监视器(VMM),实现对硬件资源的虚拟化。
广义的 KVM 实际上包含两部分,一部分是基于 Linux 内核支持的 KVM 内核模块,另一部分就是经过简化和修改的 Qemu。
QEMU是一种通用的开源计算机仿真器和虚拟器。QEMU共有两种操作模式
- 全系统仿真:能够在任意支持的架构上为任何机器运行一个完整的操作系统
- 用户模式仿真:能够在任意支持的架构上为另一个Linux/BSD运行程序
具体来说,当作为机器仿真器使用时,QEMU可以通过动态代码翻译机制(dynamic translation)在不同的机器上仿真任意一台机器(例如ARM),并执行不同于主机架构的代码。同时由于动态代码翻译机制,它也能够实现不错的性能。
而当QEMU用作虚拟器时,QEMU的优点在于其实纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,但是也正因为QEMU是纯软件实现的,因此所有指令都需要QEMU转手,因此会严重的降低性能。而可行的办法是通过配合KVM或者Xen来进行加速,目前肯定是以KVM为主。
KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 QEMU 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。
KVM 工作原理
用户模式的 Qemu 利用接口 libkvm 通过 ioctl 系统调用进入内核模式。KVM Driver 为虚拟机创建虚拟 CPU 和虚拟内存,然后执行VMLAUNCH 指令进入客户模式,装载 Guest OS 并运行。Guest OS 运行过程中如果发生中断或者影子缺页等异常,将暂停 Guest OS的运行并保存当前上下文退出到内核模式来处理这些异常。内核模式处理这些异常时如果不需要 I/O 则处理完成后重新进入客户模式。如果需要 I/O 则进入到用户模式,由 Qemu 来处理 I/O,处理完成后进入内核模式,再进入客户模式,
案例实施:Linux 安装虚拟机(图形化)
YUM 安装 KVM
在 CentOS 的系统光盘镜像中,已经提供了安装 KVM 所需软件。通过部署基于光盘镜像的本地 YUM 源,直接使用 YUM 安装所需软件即可,安装 KVM 所需软件具体包含以下几个:
yum groupinstall -y "GNOME Desktop" //安装 GNOME 桌面环境
yum -y install qemu-kvm //KVM 模块
yum -y install qemu-kvm-tools //KVM 调试工具,可不安装
yum -y install virt-install //构建虚拟机的命令行工具
yum -y install qemu-img //qemu 组件,创建磁盘、启动虚拟机等
yum -y install bridge-utils //网络支持工具
yum -y install libvirt //虚拟机管理工具
yum -y install virt-manager //图形界面管理虚拟机
yum -y install virt-viewer //显示虚拟机的控制台
重启系统后,查看 CPU 是否支持虚拟化。
对于 Intel 的服务器可以通过以下命令查看,只要有输出就说明 CPU 支持虚拟化;
# cat /proc/cpuinfo | grep vmx
AMD 服务器可用 cat /proc/cpuinfo | grep smv
命令查看
开启 libvirtd 服务
安装完成后还需要开启 libvirtd 服务,以开启相关支持。
# systemctl start libvirtd
# systemctl enable libvirtd
配置桥接网络
NAT 方式是 kvm 安装后的默认方式。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。
建立 br0 网卡
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@localhost network-scripts]# vim ifcfg-br0
TYPE="Bridge"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
IPADDR=192.168.27.145
NETMASK=255.255.255.0
GATEWAY=192.168.27.2
DNS1=192.168.27.2
桥接物理网卡 ens33
[root@localhost network-scripts]# vim ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
DEVICE=ens33
BRIDGE=br0
重启网络
# systemctl restart network
测试能否连接外网
创建KVM存储池
启动 virt-manager
# virt-manager
创建存储池–存放虚拟硬盘
双击 QUMU,选择 “存储" 选项卡,如图新建存储池,设置存储目录为/home/KVMimg
创建存储池–存放镜像文件
以同样的方式创建一个镜像存储池,存放目录为/home/KVMISO
同时上传 ISO 镜像文件,以便后面安装虚拟机(可以使用 MX 或者 Xshell 等工具上传)
创建存储卷
点击刚才创建好的 bdqn 存储池,点击加号新建存储卷,设置最大容量和分配容量
创建虚拟机
返回到主界面,右键单击,选择”新建“
选择虚拟机存放的位置
在点击完成后就自动开始安装,后面的操作和安装 Linux 没有区别
案例:使用 KVM 命令集管理虚拟机
1、查看命令帮助
[root@localhost ~]# virsh -h
2、查看KVM的配置文件存放目录(centos01是虚拟机系统实例的配置文件)
[root@localhost ~]# ls /etc/libvirt/qemu
centos01.xml networks
3、查看虚拟机状态
[root@localhost ~]# virsh list --allId 名称 状态
----------------------------------------------------2 centos01 running
4、虚拟机关机与开机
首先需要确认acpid服务安装并运行
[root@localhost ~]# virsh shutdown centos01
域 centos01 被关闭
[root@localhost ~]# virsh start centos01
域 centos01 已开始
5、强制实例系统关闭电源
[root@localhost ~]# virsh destroy centos01
6、通过配置文件启动虚拟机系统实例
[root@localhost ~]# virsh create /etc/libvirt/qemu/centos01.xml
域 centos01 被创建(从 /etc/libvirt/qemu/centos01.xml)
[root@localhost ~]# virsh list --allId 名称 状态
----------------------------------------------------2 centos01 running
7、挂起虚拟机
[root@localhost ~]# virsh suspend centos01
域 centos01 被挂起
[root@localhost ~]# virsh list --allId 名称 状态
----------------------------------------------------2 centos01 暂停
8、恢复虚拟机
[root@localhost ~]# virsh resume centos01
域 centos01 被重新恢复
[root@localhost ~]# virsh list --allId 名称 状态
----------------------------------------------------2 centos01 running
9、配置虚拟机实例伴随宿主机自动启动
[root@localhost ~]# virsh autostart centos01
域 centos01标记为自动开始上述命令创建/etc/libvirt/qemu/autostart/目录,目录内容为开机自动启动的系统[root@localhost ~]# ls /etc/libvirt/qemu/autostart/
centos01.xml[root@localhost ~]# virsh autostart centos01 --disable
域 centos01取消标记为自动开始
10、导出虚拟机配置
[root@localhost ~]# virsh dumpxml centos01 > /etc/libvirt/qemu/centos02.xml
11、虚拟机的删除与添加
删除虚拟机:
[root@localhost ~]# virsh shutdown centos01
域 centos01 被关闭
[root@localhost ~]# virsh undefine centos01
域 centos01 已经被取消定义
查看删除结果,centos01的配置文件被删除,但是磁盘文件不会删除
[root@localhost ~]# ls /etc/libvirt/qemu
autostart centos02.xml networks
通过virsh list --all查看不到centos01的信息,说明虚拟机被删除
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
通过备份的配置文件重新定义虚拟机
[root@localhost ~]# mv /etc/libvirt/qemu/centos02.xml
/etc/libvirt/qemu/centos01.xml
[root@localhost ~]# virsh define /etc/libvirt/qemu/centos01.xml
定义域 centos01(从 /etc/libvirt/qemu/centos01.xml)
查看虚拟机信息
[root@localhost ~]# virsh list --allId 名称 状态
----------------------------------------------------- centos01 关闭
12、修改虚拟机配置信息(用来修改系统内存大小、磁盘文件等信息)
直接通过vim命令修改
[root@localhost ~]# vim /etc/libvirt/qemu/centos01.xml通过virsh命令修改
[root@localhost ~]# virsh edit centos01
13、虚拟机的其他管理(在宿主机上)
# virsh start centos01 # 虚拟机开启(启动):
# virsh reboot centos01 # 虚拟机重新启动
# virsh shutdown centos01 # 虚拟机关机
# virsh destroy centos01 # 强制关机(强制断电)
# virsh suspend centos01 # 暂停(挂起)KVM 虚拟机
# virsh resume centos01 # 恢复被挂起的 KVM 虚拟机
# virsh undefine centos01 # 该方法只删除配置文件,磁盘文件未删除
# virsh autostart centos01 # 随物理机启动而启动(开机启动)
# virsh autostart --disable centos01 # 取消标记为自动开始(取消开机启动)
KVM 命令安装虚拟机
创建客户机所需要的磁盘
[root@localhost ~]# mkdir /home/KVMimg
[root@localhost ~]# qemu-img create -f raw /home/KVMimg/centos02.raw 10G
Formatting '/home/KVMimg/centos02.raw', fmt=raw size=10737418240
qemu-img 主要用来创建虚拟客户机所需的磁盘
create表示创建
-f raw 表示创建一个格式为 raw 的磁盘
/home/KVMimg/centos02.raw 10G 表示创建的磁盘名称及磁盘文件
10G表示该磁盘可用大小
安装虚拟客户机
[root@localhost ~]# virt-install --virt-type=kvm --name=centos02 --vcpus=1 --memory=1024 --location=/home/KVMISO/CentOS-7-x86_64-DVD-1810.iso --disk path=/home/KVMimg/centos7-1.qcow2,size=10,format=qcow2 --network bridge=br0 --graphics none --extra-args='console=ttyS0' --force
--virt-type=kvm 虚拟机类型
--name=centos02 虚拟客户机名称
--vcpus=1 给虚拟客户机分配的虚拟CPU数量
--memory=1024 内存大小
-location=/home/KVMimg/CentOS-7-x86_64-DVD-1810.iso 指定客户机安装镜像文件
路径
--disk path=/home/KVMimg/centos02.raw,size=10,format=raw 客户端磁盘的位置及
格式
--network bridge=br0 客户端网卡配置(机器默认会有virbr0,这里的br0为上一章节
中配置过的)
--graphics none 不用图像配置界面
--extra-args='console=ttyS0' 表示使用console ttys0进行管理
--force
注意:.iso镜像文件一定放到/home 或者根目录重新创建目录,不然会因为权限报错,无法创建虚拟机。
KVM文件管理
通过文件管理可以直接查看、修改、复制虚拟机的内部文件。例如,当系统因为配置问题无法启动时,可以直接修改虚拟机的文件。虚拟机磁盘文件有raw与qcow2两种格式,KVM虚拟机默认使用raw格式,raw格式性能最好、速度最快,其缺点是不支持一些新的功能,如镜像、zlib磁盘压缩、AES加密等。针对两种格式的文件有不同的工具可用选择。这里介绍本地YUM安装 libguestfs-tools 后产生的命令行工具(这个工具可以直接读取qcow2格式的磁盘文件,因此需要将raw格式的磁盘文件转换成qcow2的格式).
虚拟机的克隆
# virsh shutdown centos02
# virt-clone -o centos02 -n centos03 -f /home/KVMimg/centos03.qcow2-o 要克隆的原虚拟机名字
-n 克隆后新虚拟机的名字
-f 新虚拟机磁盘镜像文件的存储位置
虚拟机快照
# virsh list --all //列出所有虚拟机
# virsh shutdown centos01 //关闭centos01虚拟机
# virsh snapshot-create-as centos01 centos01-s1 //为虚拟机centos01创建快照centos01-s1
# virsh snapshot-list centos01 //列出虚拟机test1的所有快照
# virsh snapshot-info centos01 centos01-s1 //查看快照的详细信息
# virsh snapshot-delete centos01 centos01-s1 //删除虚拟机centos01的快照centos01-s1// 恢复快照
# virsh shutdown centos01
# virsh snapshot-revert centos01 centos01-s1
# virsh start centos01
web管理端
安装基础依赖
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx
yum install apt install -y python3-pip
yum install -y gcc make autoconf automake git python3-pip python3-requests python3-mock gettext pkgconf xsltproc python3-dev pep8 pyflakes python3-yaml
yum install -y systemd logrotate python3-psutil python3-ldap python3-lxml python3-websockify python3-jsonschema openssl nginx python3-cherrypy3 python3-cheetah python3-pampy python-m2crypto gettext python3-openssl
启动服务
systemctl start nginx
systemctl enable nginx
systemctl start wokd
systemctl enable wokd
浏览器访问 https://192.168.27.145:8001/login.html
相关文章:

部署 KVM 虚拟化平台
虚拟化技术的演变过程分为软件模拟、虚拟化层翻译、容器虚拟化三个阶段 1 软件模拟的技术方式 软件模拟是通过软件完全模拟CPU、网卡、芯片组、磁盘等计算机硬件,因为是软件模拟,所以理论上可以模拟任何硬件,甚至不存在的硬件。但是由于是软…...

Juniper PPPOE双线路冗余RPM配置
------------------ 浮动静态路由 set routing-options static route 0.0.0.0/0 next-hop pp0.0 qualified-next-hop pp0.1 preference 10 ----------------- RPM测试的内容,包括从哪个接口发起测试,测试ping等等 #指定探针类型用ICMP请求 #探测的目标地址 #探测间隔 #探测阈…...

原生JS实现视频截图
视频截图效果预览 利用Canvas进行截图 要用原生js实现视频截图,可以利用canvas的绘图功能 ctx.drawImage,只需要获取到视频标签,就可以通过drawImage把视频当前帧图像绘制在canvas画布上。 const video document.querySelector(video) con…...
前端Rust二进制/wasm全平台构建流程简述
前言 开门见山,现代前端 Rust 构建基本分三大类,即 构建 .wasm 、构建 .node 二进制 、构建 swc 插件。 入门详见 《 前端Rust开发WebAssembly与Swc插件快速入门 》 。 对于单独开发某一类的流程,在上述参考文章中已有介绍,但对于…...

加解密算法相关技术详解
文章目录 简介工作机制加解密对称密钥算法非对称密钥算法 数字信封数字签名数字证书技术对比 推荐阅读 简介 随着网络技术的飞速发展,网络安全问题日益重要,加解密技术是网络安全技术中的核心技术,是最常用的安全保密手段。 加密࿱…...

Clickhouse学习笔记(13)—— Materialize MySQL引擎
该引擎用于监听 binlog 事件,类似于canal、Maxwell等组件 ClickHouse 20.8.2.3 版本新增加了 MaterializeMySQL 的 database 引擎,该 database 能映射到 MySQL中的某个database ,并自动在ClickHouse中创建对应ReplacingMergeTree。 ClickHous…...

《QT从基础到进阶·二十四》按钮组QButtonGroup,单选框QRadioButton和多选框QCheckBox
1、按钮组QButtonGroup 如果有多个单选按钮,可以统一放进一个按钮组。 图中有三个单选按钮放进了一个QGroupBox,并且设置了水平布局,现在要将这三个单选按钮放进一个按钮组,之前的想法是先把三个按钮加入按钮组,再把按钮组放进QG…...
Ansible--playbook剧本
目录 一、playbook: playbook的组成: palybook的编写注意事项 二、playbook的编写格式(示例) 2.1 编写yaml文件 2.2 定义、引用变量 2.3 指定远程主机sudo切换用户 2.4 when条件判断 2.5 迭代 2.6 Templates 模块 2.7 tags 模…...

MacOS下VMware Fusion配置静态IP
前言 在虚拟机安装系统后,默认是通过DHCP动态分配的IP,这会导致每次重启虚拟机ip都可能会改变,使用起来会有很多不便。 配置静态IP 查看主机网关地址 cat /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf 查看主机DNS,m…...

三、机器学习基础知识:Python常用机器学习库(中文文本分析相关库)
文章目录 1、Jieba库1.1 主要函数1.2 词性标注1.3 关键词提取 2、WordCloud库2.1 常见参数2.2 词云绘制 文本分析是指对文本的表示及其特征的提取,它把从文本中提取出来的特征词进行量化来表示文本信息,经常被应用到文本挖掘以及信息检索的过程当中。 1、…...

Nginx 使用笔记大全(唯一入口)
Linux服务器因为Nginx日志access.log文件过大项目无法访问 项目处于运行状态下无法访问,第一步查看磁盘状态 1、查看磁盘状态 df -h 2、查找100M以上的文件 find / -size 100M |xargs ls -lh 3、删除文件 rm -rf /usr/local/nginx/logs/access.log 4、配置nginx.…...
数据结构-二叉排序树(建立、查找、修改)
二叉排序树概念 二叉排序树是动态查找表的一种,也是常用的表示方法。 其中,它具有如下性质: 1.若它的左子树非空,则其左子树的所有节点的关键值都小于根节点的关键值。 2.若它的右子树非空,则其右子树的所有节点的…...
Linux 性能优化之使用 Tuned 配置优化方案
写在前面 考试整理相关笔记博文内容涉及 Linux tuned 调优工具的简单认知调优配置文件的简单说明,自定义调优方案介绍理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意ÿ…...

Day02_《MySQL索引与性能优化》
文章目录 一、SQL执行顺序二、索引简介1、关于索引2、索引的类型Btree 索引Btree 索引 三、Explain简介四、Explain 详解1、id2、select_type3、table4、type5、possible_keys6、key7、key_len8、ref9、rows10、Extra11、小案例 五、索引优化1、单表索引优化2、两表索引优化3、…...

(只需三步)Vmvare tools安装教程,实现与windows互通复制粘贴与文件拖拽
首先确保Ubuntu是联网的,如果连不上网可以参考我的这个联网教程,也很简单 (只需三步)虚拟机上vm的ubuntu不能联上网怎么办-CSDN博客 第一步:卸载之前的tools,确保没有残留 sudo apt-get autoremove open-vm-tools 第…...

Android自定义控件:一款多特效的智能loadingView
先上效果图(如果感兴趣请看后面讲解): 1、登录效果展示 2、关注效果展示 1、【画圆角矩形】 画图首先是onDraw方法(我会把圆代码写上,一步一步剖析): 首先在view中定义个属性:priv…...

C语言之初阶指针
一、指针: 其实按照我的理解,当我们写c语言程序的时候,创建的变量,数组等都要在内存上开辟空间。而每一个内存都有一个唯一的编号,这个编号也被称为地址编号,就相当于,编号地址指针。 二、指针…...

MongoDB基础知识~
引入MongoDB: 在面对高并发,高效率存储和访问,高扩展性和高可用性等的需求下,我们之前所学习过的关系型数据库(MySql,sql server…)显得有点力不从心,而这些需求在我们的生活中也是随处可见的,例如在社交中…...
41. 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3示例 2: 输入:nums [3…...

数据结构—数组栈的实现
前言:各位小伙伴们我们前面已经学习了带头双向循环链表,数据结构中还有一些特殊的线性表,如栈和队列,那么我们今天就来实现数组栈。 目录: 一、 栈的概念 二、 栈的实现 三、 代码测试 栈的概念: 栈的概念…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...