当前位置: 首页 > news >正文

proxmox通过更多的方式创建虚拟机

概述

作为一名资深运维工程师,我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机:

  1. 通过 Proxmox 命令创建虚拟机
  2. 通过 Shell 脚本自动化创建虚拟机
  3. 使用 Proxmox API 创建虚拟机

每种方式都有其适用场景,选择合适的方式可以大大提高工作效率。

proxmox通过更多的方式创建虚拟机

通过 Proxmox 命令创建虚拟机

下载 Ubuntu Cloud 镜像

还是以ubuntu22.04版本为例

mkdir /var/lib/vz/template/qemu/
cd /var/lib/vz/template/qemu/
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img

创建虚拟机模板

创建一个新的虚拟机

使用<font style="color:rgb(64, 64, 64);">qm</font>命令创建一个新的虚拟机。假设我们创建一个ID为9000的虚拟机。

# 创建虚拟机
qm create 9000 --name "ubuntu-template" --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
导入下载的镜像

将下载的Ubuntu Cloud镜像导入到虚拟机中。

# 导入镜像
qm importdisk 9000 jammy-server-cloudimg-amd64.img local

将磁盘附加到虚拟机

将下载的Ubuntu Cloud镜像导入到虚拟机中。

qm set 9000 --scsihw virtio-scsi-pci --scsi0 local:9000/vm-9000-disk-0.raw

配置Cloud-Init

配置Cloud-Init以支持自动化的虚拟机配置。

qm set 9000 --ide2 local:cloudinit
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --serial0 socket --vga serial0

配置网络

设置网络接口以使用DHCP:

qm set 9000 --ipconfig0 ip=dhcp

将虚拟机转换为模板

将虚拟机转换为模板,以便后续克隆。

qm template 9000

通过模板创建虚拟机

克隆模板

使用模板克隆一个新的虚拟机。假设我们创建一个ID为100的虚拟机。

qm clone 9000 100 --name "ubuntu-100"

配置Cloud-Init

为新虚拟机配置Cloud-Init参数,如用户、密码、SSH密钥等。这里就设置用户密码为:ZhangPeng1234,命令如下:

qm set 100 --ciuser ubuntu --cipassword ZhangPeng1234

注:这里可以考虑一下ssh key的方式,请自行发散!

启动虚拟机

启动新创建的虚拟机:

qm start 100

验证虚拟机

登录proxmox web控制台,双击VM ID 100的虚拟机实例。进入控制台:

输入用户名密码进入shell:

输入ip a 获取VM 100实例的ip地址:

注:ip a仍然是192.168.0.5,因为之前的VM实例我删除了这是正常的。

紧接着可以通过shell自行登录验证虚拟机实例!这里有个我很喜欢的,创建的VM 100实例的hostname 总算是我克隆模版自定义的name ubuntu-100.比较服务我个人的审美预期!

通过 Shell 脚本自动化创建虚拟机

尝试使用deepseek 将上面的步骤封装成了一个shell脚本,实现从下载镜像到创建虚拟机模板和虚拟机的流程:

vi create_vm.sh

#!/bin/bash# 参数配置
TEMPLATE_ID=9001
VM_ID=101
VM_NAME="ubuntu-101"
USERNAME="ubuntu"
PASSWORD="securepassword"
IMAGE_URL="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
IMAGE_NAME="jammy-server-cloudimg-amd64.img"
STORAGE="local"
BRIDGE="vmbr0"# 下载 Ubuntu Cloud 镜像
echo "下载 Ubuntu Cloud 镜像..."
wget -q $IMAGE_URL -O $IMAGE_NAME# 创建虚拟机模板
echo "创建虚拟机模板..."
qm create $TEMPLATE_ID --name "ubuntu-template" --memory 2048 --cores 2 --net0 virtio,bridge=$BRIDGE# 导入镜像
echo "导入镜像..."
qm importdisk $TEMPLATE_ID $IMAGE_NAME $STORAGE# 将磁盘附加到虚拟机
echo "配置磁盘..."
qm set $TEMPLATE_ID --scsihw virtio-scsi-pci --scsi0 $STORAGE:$TEMPLATE_ID/vm-$TEMPLATE_ID-disk-0.raw# 配置 Cloud-Init
echo "配置 Cloud-Init..."
qm set $TEMPLATE_ID --ide2 $STORAGE:cloudinit
qm set $TEMPLATE_ID --boot c --bootdisk scsi0
qm set $TEMPLATE_ID --serial0 socket --vga serial0
qm set $TEMPLATE_ID --ciuser $USERNAME --cipassword $PASSWORD
# 配置 网络
echo "配置 网络..."
qm set $TEMPLATE_ID --ipconfig0 ip=dhcp# 将虚拟机转换为模板
echo "转换为模板..."
qm template $TEMPLATE_ID# 克隆模板创建新虚拟机
echo "克隆模板创建新虚拟机..."
qm clone $TEMPLATE_ID $VM_ID --name $VM_NAME# 启动虚拟机
echo "启动虚拟机..."
qm start $VM_IDecho "虚拟机创建完成!"

增加可执行权限并执行脚本:

chmod +x create_vm.sh
./create_vm.sh

换一个方式 使用qm命令进入VM 101 id的虚拟机:

qm terminal 101

继续完善一下脚本,提示词如下:

  1. 每次都更新下载镜像,我需要对本地img镜像与现实比对,如果一致则略过镜像下载部分
  2. 当模版存在的时候,提醒我是否更新模版,如果更新模版则进行覆盖,如果否则略过进行下一步。
  3. 虚拟机如果存在。如果更新,则删除旧的虚拟机,创建新的虚拟机进行更新,如果否,则略过。

最终脚本如下:

#!/bin/bash# 参数配置
TEMPLATE_ID=9001
VM_ID=101
VM_NAME="ubuntu-101"
USERNAME="ubuntu"
PASSWORD="securepassword"
IMAGE_URL="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
IMAGE_NAME="jammy-server-cloudimg-amd64.img"
STORAGE="local"
BRIDGE="vmbr0"# 函数:检查镜像是否存在
check_image() {if [[ -f $IMAGE_NAME ]]; thenecho "本地镜像已存在..."# 获取远程文件大小(以字节为单位)REMOTE_SIZE=$(curl -sI $IMAGE_URL | grep -i content-length | awk '{print $2}' | tr -d '\r')# 获取本地文件大小(以字节为单位)LOCAL_SIZE=$(stat -c%s "$IMAGE_NAME")if [[ -n "$REMOTE_SIZE" && "$LOCAL_SIZE" == "$REMOTE_SIZE" ]]; thenecho "镜像大小一致($LOCAL_SIZE 字节),使用现有镜像。"return 0elseecho "镜像大小不一致或无法获取远程大小"echo "本地大小: $LOCAL_SIZE"echo "远程大小: $REMOTE_SIZE"read -p "是否重新下载镜像?(y/n): " REDOWNLOADif [[ $REDOWNLOAD == "y" ]]; thenecho "重新下载镜像..."rm -f $IMAGE_NAMEreturn 1elseecho "使用现有镜像继续..."return 0fifielseecho "本地镜像不存在,开始下载..."return 1fi
}# 函数:检查模板是否存在并处理
check_template_existence() {if qm list | grep -q "$TEMPLATE_ID"; thenecho "模板 ID $TEMPLATE_ID 已存在。"read -p "是否更新模板?(y/n): " UPDATE_TEMPLATEif [[ $UPDATE_TEMPLATE == "y" ]]; thenecho "停止现有模板..."qm stop $TEMPLATE_ID &>/dev/nullsleep 2echo "删除旧模板..."qm destroy $TEMPLATE_IDreturn 0elseecho "保留现有模板。"return 1fifireturn 0
}# 函数:检查虚拟机是否存在并处理
check_vm_existence() {if qm list | grep -q "$VM_ID"; thenecho "虚拟机 ID $VM_ID 已存在。"read -p "是否更新该虚拟机?(y/n): " UPDATE_VMif [[ $UPDATE_VM == "y" ]]; thenecho "停止现有虚拟机..."qm stop $VM_ID &>/dev/nullsleep 5echo "删除现有虚拟机..."qm destroy $VM_IDreturn 0elseecho "保留现有虚拟机。"return 1fifireturn 0
}# 函数:创建模板
create_template() {echo "创建虚拟机模板..."qm create $TEMPLATE_ID --name "ubuntu-template" --memory 2048 --cores 2 --net0 virtio,bridge=$BRIDGEecho "导入镜像..."qm importdisk $TEMPLATE_ID $IMAGE_NAME $STORAGEecho "等待磁盘导入完成..."sleep 5# 获取最新导入的磁盘文件DISK_NAME=$(ls -t /var/lib/vz/images/$TEMPLATE_ID/vm-$TEMPLATE_ID-disk-*.raw | head -n1)if [[ -z "$DISK_NAME" ]]; thenecho "错误:找不到导入的磁盘文件"exit 1fiDISK_BASE=$(basename "$DISK_NAME")echo "使用磁盘: $DISK_BASE"echo "配置磁盘..."qm set $TEMPLATE_ID --scsihw virtio-scsi-pci --scsi0 "$STORAGE:$TEMPLATE_ID/$DISK_BASE"echo "配置 Cloud-Init..."qm set $TEMPLATE_ID --ide2 $STORAGE:cloudinitqm set $TEMPLATE_ID --boot c --bootdisk scsi0qm set $TEMPLATE_ID --serial0 socket --vga serial0qm set $TEMPLATE_ID --ciuser $USERNAME --cipassword $PASSWORDecho "配置网络..."qm set $TEMPLATE_ID --ipconfig0 ip=dhcp# 检查是否已经是模板if ! qm config $TEMPLATE_ID | grep -q "template: 1"; thenecho "转换为模板..."qm template $TEMPLATE_IDfi
}# 函数:克隆和启动虚拟机
create_vm() {echo "克隆模板创建新虚拟机..."qm clone $TEMPLATE_ID $VM_ID --name $VM_NAME --fullecho "等待克隆完成..."sleep 5if qm status $VM_ID &>/dev/null; thenecho "启动虚拟机..."qm start $VM_IDelseecho "错误:虚拟机创建失败"exit 1fi
}# 主程序开始
echo "开始执行虚拟机创建流程..."# 下载镜像(如果需要)
if ! check_image; thenecho "下载 Ubuntu Cloud 镜像..."wget $IMAGE_URL -O $IMAGE_NAME || {echo "错误:下载镜像失败"exit 1}
fi# 检查并创建/更新模板
if check_template_existence; thencreate_template
fi# 检查并创建/更新虚拟机
if check_vm_existence; thencreate_vm
fi# 显示最终状态
echo "操作完成!当前状态:"
qm list | grep -E "$TEMPLATE_ID|$VM_ID"

完美!

使用 Proxmox API 创建虚拟机

为了进一步自动化,我们可以使用 Proxmox API 来创建虚拟机。以下是一个使用 Python 脚本通过 Proxmox API 创建虚拟机的示例。其实这里我就使用claude3 将上面的脚步转换了一下:修改成使用proxmox api 实现上述功能的python脚本!

在proxmox主机上面完成如下操作,其他机器也可以,以使用apt包管理的系统为例:

apt install python3-pip
pip install proxmoxer

apt install python3-proxmoxer

使用proxmox api,脚本如下:

cat create_vm.py

#!/usr/bin/env python3import requests
import time
import os
import sys
from proxmoxer import ProxmoxAPI
from urllib3.exceptions import InsecureRequestWarning# 禁用不安全请求警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)# 配置信息
PROXMOX_HOST = "192.168.0.200"
PROXMOX_USER = "root@pam"
PROXMOX_PASSWORD = "Aa123456."
NODE_NAME = "proxmox1"# 获取脚本所在目录的绝对路径
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))# VM 配置
TEMPLATE_ID = 9001
VM_ID = 101
VM_NAME = "ubuntu-101"
USERNAME = "ubuntu"
PASSWORD = "securepassword"
IMAGE_URL = "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
IMAGE_NAME = "jammy-server-cloudimg-amd64.img"
IMAGE_PATH = os.path.join(SCRIPT_DIR, IMAGE_NAME)
STORAGE = "local"
BRIDGE = "vmbr0"# 超时设置(秒)
TEMPLATE_CREATE_TIMEOUT = 300  # 5分钟
VM_START_TIMEOUT = 180        # 3分钟class ProxmoxManager:def __init__(self):self.proxmox = ProxmoxAPI(PROXMOX_HOST,user=PROXMOX_USER,password=PROXMOX_PASSWORD,verify_ssl=False)self.node = self.proxmox.nodes(NODE_NAME)def wait_for_task_completion(self, task_upid, timeout=300):"""等待任务完成"""start_time = time.time()while time.time() - start_time < timeout:try:task_status = self.node.tasks(task_upid).status.get()if task_status['status'] == 'stopped':if task_status['exitstatus'] == 'OK':return Trueelse:print(f"任务失败: {task_status.get('exitstatus', '未知错误')}")return Falseexcept Exception as e:print(f"检查任务状态时出错: {str(e)}")return Falsetime.sleep(2)print("任务超时")return Falsedef wait_for_vm_state(self, vmid, desired_state='running', timeout=180):"""等待VM达到期望状态"""print(f"等待VM {vmid} 变为 {desired_state} 状态...")start_time = time.time()while time.time() - start_time < timeout:try:status = self.node.qemu(vmid).status.current.get()current_state = status['status']if current_state == desired_state:print(f"VM {vmid} 已经是 {desired_state} 状态")return Trueprint(f"当前状态: {current_state}, 等待中...")except Exception as e:print(f"检查VM状态时出错: {str(e)}")return Falsetime.sleep(5)print(f"等待VM状态超时,当前状态: {current_state}")return Falsedef check_image(self):"""检查镜像是否存在并下载"""if os.path.exists(IMAGE_PATH):print("本地镜像已存在...")response = requests.head(IMAGE_URL)remote_size = int(response.headers.get('content-length', 0))local_size = os.path.getsize(IMAGE_PATH)if remote_size == local_size:print(f"镜像大小一致({local_size} 字节),使用现有镜像。")return Trueelse:print(f"镜像大小不一致(本地:{local_size},远程:{remote_size})")choice = input("是否重新下载镜像?(y/n): ")if choice.lower() == 'y':self.download_image()return Trueelse:print("本地镜像不存在,开始下载...")self.download_image()return Truereturn Falsedef download_image(self):"""下载镜像"""print("下载镜像中...")response = requests.get(IMAGE_URL, stream=True)total_size = int(response.headers.get('content-length', 0))block_size = 1024 * 1024  # 1MBwith open(IMAGE_PATH, 'wb') as f:downloaded = 0for data in response.iter_content(block_size):f.write(data)downloaded += len(data)percentage = int((downloaded / total_size) * 100)sys.stdout.write(f"\r下载进度: {percentage}%")sys.stdout.flush()print("\n下载完成!")def check_vm_exists(self, vmid):"""检查VM是否存在"""try:self.node.qemu(vmid).status.current.get()return Trueexcept:return Falsedef stop_and_destroy_vm(self, vmid):"""停止并删除VM"""try:if self.check_vm_exists(vmid):print(f"停止 VM {vmid}...")try:stop_task = self.node.qemu(vmid).status.stop.post()if not self.wait_for_vm_state(vmid, 'stopped', timeout=60):print(f"停止VM {vmid} 超时")return Falseexcept:passprint(f"删除 VM {vmid}...")self.node.qemu(vmid).delete()time.sleep(2)return Trueexcept Exception as e:print(f"删除VM时出错: {str(e)}")return Falsereturn Truedef create_template(self):"""创建模板"""print("创建模板...")# 检查并删除已存在的模板if self.check_vm_exists(TEMPLATE_ID):choice = input(f"模板 {TEMPLATE_ID} 已存在,是否重新创建?(y/n): ")if choice.lower() == 'y':if not self.stop_and_destroy_vm(TEMPLATE_ID):print("删除现有模板失败")return Falseelse:return Truetry:# 创建新VM作为模板create_task = self.node.qemu.create(vmid=TEMPLATE_ID,name="ubuntu-template",memory=2048,cores=2,net0=f"virtio,bridge={BRIDGE}",scsihw="virtio-scsi-pci",scsi0=f"{STORAGE}:0,import-from={IMAGE_PATH},format=raw",ide2=f"{STORAGE}:cloudinit",boot="c",bootdisk="scsi0",serial0="socket",vga="serial0",ciuser=USERNAME,cipassword=PASSWORD,ipconfig0="ip=dhcp")print("等待模板创建完成...")if not self.wait_for_task_completion(create_task, TEMPLATE_CREATE_TIMEOUT):print("创建模板失败")return False# 转换为模板print("转换为模板...")self.node.qemu(TEMPLATE_ID).config.post(template=1)print("模板创建成功")return Trueexcept Exception as e:print(f"创建模板时出错: {str(e)}")return Falsedef create_vm(self):"""从模板创建VM"""print(f"创建虚拟机 {VM_ID}...")# 检查并删除已存在的VMif self.check_vm_exists(VM_ID):choice = input(f"VM {VM_ID} 已存在,是否重新创建?(y/n): ")if choice.lower() == 'y':if not self.stop_and_destroy_vm(VM_ID):print("删除现有VM失败")return Falseelse:return Truetry:# 克隆模板print("克隆模板...")clone_task = self.node.qemu(TEMPLATE_ID).clone.post(newid=VM_ID,name=VM_NAME,full=1)if not self.wait_for_task_completion(clone_task, TEMPLATE_CREATE_TIMEOUT):print("克隆模板失败")return False# 启动VMprint("启动虚拟机...")self.node.qemu(VM_ID).status.start.post()# 等待VM运行if not self.wait_for_vm_state(VM_ID, 'running', VM_START_TIMEOUT):print("启动VM失败")return Falseprint(f"VM {VM_ID} 创建并启动成功")return Trueexcept Exception as e:print(f"创建VM时出错: {str(e)}")return Falsedef show_status(self):"""显示VM状态"""print("\n当前VM状态:")for vmid in [TEMPLATE_ID, VM_ID]:try:status = self.node.qemu(vmid).status.current.get()print(f"VM {vmid}: {status['status']}")except:print(f"VM {vmid}: 不存在")def main():try:proxmox = ProxmoxManager()# 检查并下载镜像if not proxmox.check_image():print("镜像检查失败")return 1# 创建模板if not proxmox.create_template():print("创建模板失败")return 1# 创建VMif not proxmox.create_vm():print("创建VM失败")return 1# 显示状态proxmox.show_status()return 0except Exception as e:print(f"发生错误: {str(e)}")return 1if __name__ == "__main__":sys.exit(main())

执行脚本输出如下:

本脚本已经验证,可以正常使用!

总结

通过deepseek claude3等chat方式,我们实现了proxmox通过更多的方式创建VM的完整流程。

技术方案对比

  1. 命令行方式
    • 优点:操作直观,适合单次部署
    • 缺点:重复性操作效率低,易出错
    • 适用场景:临时测试、学习环境
  2. Shell脚本方式
    • 优点:自动化程度高,可重复执行
    • 缺点:依赖shell环境,跨平台性较差
    • 适用场景:批量部署,单一环境下的自动化运维
  3. API方式
    • 优点:灵活性强,可跨平台,易于集成
    • 缺点:开发难度相对较大,需要额外的依赖
    • 适用场景:需要与其他系统集成,或需要二次开发的场景

实践经验总结

1. 自动化考虑要点
  • 幂等性处理:脚本需要考虑重复执行的情况
  • 错误处理:完善的错误捕获和日志记录
  • 参数化配置:关键参数要可配置化,提高脚本复用性
  • 状态检查:执行关键操作前后的状态验证
2. 性能优化建议
  • 并行处理:批量创建时考虑并行执行
  • 资源控制:合理设置等待时间和超时机制
  • 镜像缓存:本地保存常用镜像,避免重复下载
3. 安全性考虑
  • 密码管理:避免明文密码,建议使用密钥认证
  • 权限控制:最小权限原则
  • 日志审计:关键操作需要记录日志

未来优化方向

  1. 基础设施即代码(IaC)
    • 集成 Terraform 支持
    • 添加 Ansible 自动化配置
    • 支持云原生部署方案
  2. 功能扩展
    • 支持更多操作系统类型
    • 添加批量部署功能
    • 集成监控和告警系统
  3. 可用性提升
    • 添加 Web 界面
    • 支持集群部署
    • 提供 RESTful API 服务

最佳实践建议

  1. 标准化流程
    • 建立统一的命名规范
    • 制定标准化的配置模板
    • 规范化的部署流程
  2. 运维效率
    • 善用模板功能
    • 建立基础镜像库
    • 自动化脚本版本控制
  3. 问题排查
    • 完善的日志记录
    • 监控指标收集
    • 故障恢复预案

本文详细介绍了在 Proxmox 环境下创建虚拟机的多种方法,从基础的命令行操作到高级的 API 集成,为不同场景提供了完整的解决方案。通过实践这些方法,我们不仅提高了运维效率,也建立了一套完整的自动化运维体系。在实际生产环境中,建议根据具体需求选择合适的方案,并持续优化和改进。未来我们将继续探索更多自动化运维的最佳实践,为团队提供更高效的技术解决方案。

参考资料

  1. Proxmox VE 官方文档:https://pve.proxmox.com/wiki/Main_Page
  2. Cloud-Init 文档:https://cloudinit.readthedocs.io/
  3. Proxmoxer Python API:https://pypi.org/project/proxmoxer/

通过本文的实践和总结,我们不仅掌握了多种创建虚拟机的方法,更重要的是建立了一套完整的自动化运维思路。希望这些内容能够帮助更多的运维工程师提升工作效率和专业能力。

相关文章:

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师&#xff0c;我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机&#xff1a; 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…...

阿里云 ubuntu22.04 中国区节点安装 Docker

下面是一份在 Ubuntu 22.04 (Jammy) 上&#xff0c;通过阿里云镜像源来安装并配置 Docker 的详细步骤示例&#xff0c;可在中国区阿里云节点使用&#xff1a; 一、卸载旧版本 (如已安装) 如果系统中已经安装了旧版 Docker (可能是 docker、docker-engine、docker.io、containe…...

Java 中 LinkedList 的底层源码

在 Java 的集合框架中&#xff0c;LinkedList是一个独特且常用的成员。它基于双向链表实现&#xff0c;与数组结构的集合类如ArrayList有着显著差异。深入探究LinkedList的底层源码&#xff0c;有助于我们更好地理解其工作原理和性能特点&#xff0c;以便在实际开发中做出更合适…...

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…...

【LeetCode】5. 贪心算法:买卖股票时机

太久没更了&#xff0c;抽空学习下。 看一道简单题。 class Solution:def maxProfit(self, prices: List[int]) -> int:cost -1profit 0for i in prices:if cost -1:cost icontinueprofit_ i - costif profit_ > profit:profit profit_if cost > i:cost iret…...

【玩转 Postman 接口测试与开发2_017】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(下)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证8 导入官方契约测试集合9 契约测试集合的详细配置9.1 env-apiKey 的创建与设置9.2 env-workspaceId 的设置9.3 Mock 服务器及 env-server 的配置9.4 API 测试实例的配置…...

学习threejs,pvr格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…...

【人工智能】通用人工智能 AGI

AGI 是 Artificial General Intelligence 的缩写&#xff0c;中文翻译为通用人工智能。与我们常见的**特定人工智能&#xff08;Narrow AI&#xff09;**不同&#xff0c;AGI 是一个更高深、更具野心的目标。 AGI&#xff08;人工通用智能&#xff09;的定义 通用人工智能&am…...

基于PostGIS的省域空间相邻检索实践

目录 前言 一、相关空间检索函数 1、ST_touches函数 2、ST_Intersects函数 3、ST_Relate函数 4、区别于对比 二、空间相邻检索实践 1、省域表相关介绍 2、相关省域相邻查询 3、全国各省份邻居排名 三、总结 前言 在当今数字化时代&#xff0c;地理空间数据的高效管理…...

Java 2024年面试总结(持续更新)

目录 最近趁着金三银四面了五六家公司吧&#xff0c;也整理了一些问题供大家参考一下&#xff08;适合经验三年左右的&#xff09;。 面试问题&#xff08;答案是我自己总结的&#xff0c;不一定正确&#xff09;&#xff1a; 总结&#xff1a; 最近趁着金三银四面了五六家公…...

JDK9新特性

文章目录 新特性&#xff1a;1.模块化系统使用模块化module-info.java&#xff1a;exports&#xff1a;opens&#xff1a;requires&#xff1a;provides&#xff1a;uses&#xff1a; 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量&#xff1a;/var…...

性能测试中的数据库连接池优化

目录 一、配置连接池参数 二、配置连接池数量 三、监控连接池 数据库连接池的意义是让连接复用&#xff0c;通过建立一个数据库连接池&#xff08;缓冲区&#xff09;以及一套连接的使用&#xff0c;分配&#xff0c;管理策略&#xff0c;使得该连接池中的连接可以得到高效&…...

1. 初识spark

背景&#xff1a; 作为一名开发人员&#xff0c;用内存处理数据是每天都在做的事情。内存处理数据最大的优势就是方便&#xff0c;快捷&#xff0c;可以很快得到结果&#xff0c;但是内存总是有瓶颈的&#xff0c;不管你运行代码的机器有多大的内存&#xff0c;总是有更大规模…...

专业学习|一文了解并实操自适应大邻域搜索(讲解代码)

一、自适应大邻域搜索概念介绍 自适应大邻域搜索&#xff08;Adaptive Large Neighborhood Search&#xff0c;ALNS&#xff09;是一种用于解决组合优化问题的元启发式算法。以下是关于它的详细介绍&#xff1a; -自适应大领域搜索的核心思想是&#xff1a;破坏解、修复解、动…...

Redis --- 使用zset处理排行榜和计数问题

在处理计数业务时&#xff0c;我们一般会使用一个数据结构&#xff0c;既是集合又可以保证唯一性&#xff0c;所以我们会选择Redis中的set集合&#xff1a; 业务逻辑&#xff1a; 用户点击点赞按钮&#xff0c;需要再set集合内判断是否已点赞&#xff0c;未点赞则需要将点赞数1…...

排序算法——快速排序

代码仓库&#xff1a; 1037827920/AlgorithmZoo 快速排序 算法步骤 选择基准元素&#xff0c;从数组中选择一个元素作为基准&#xff0c;通常选择方式有&#xff1a; 第一个元素最后一个元素中间元素随机选择 分区操作&#xff0c;将数组元素根据基准分为两部分&#xff0c;…...

有用的sql链接

『SQL』常考面试题&#xff08;2——窗口函数&#xff09;_sql的窗口函数面试题-CSDN博客 史上最强sql计算用户次日留存率详解&#xff08;通用版&#xff09;及相关常用函数 -2020.06.10 - 知乎 (zhihu.com) 1280. 学生们参加各科测试的次数 - 力扣&#xff08;LeetCode&…...

手写MVVM框架-构建虚拟dom树

MVVM的核心之一就是虚拟dom树&#xff0c;我们这一章节就先构建一个虚拟dom树 首先我们需要创建一个VNode的类 // 当前类的位置是src/vnode/index.js export default class VNode{constructor(tag, // 标签名称&#xff08;英文大写&#xff09;ele, // 对应真实节点children,…...

C++单例模式

单例模式是一种设计模式&#xff0c;它保证一个类只有一个对象。因此单例模式要私有化构造函数&#xff0c;禁用拷贝构造以及赋值重载。同时还要提供一个静态成员函数获取单例对象。 单例模式有两种实现方式&#xff1a;饿汉模式和懒汉模式 饿汉模式&#xff1a;创建静态单例…...

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 1、操…...

RabbitMQ 可靠性投递

文章目录 前言一、RabbitMQ自带机制1、生产者发送消息注意1.1、事务&#xff08;Transactions&#xff09;1.2、发布确认&#xff08;Publisher Confirms&#xff09;1.2.1、同步1.2.2、异步 2、消息路由机制2.1、使用备份交换机&#xff08;Alternate Exchanges&#xff09;2.…...

Java常见的技术场景面试题

一、单点登录这块怎么实现的&#xff1f; 单点登录概述 单点登录&#xff1a;Single Sign On&#xff08;简称SSO&#xff09;,只需要登录一次&#xff0c;就可以访问所有信任的应用系统 在以前的时候&#xff0c;一般我们就单系统&#xff0c;所有的功能都在同一个系统上。…...

使用 Postman 进行 API 测试:从入门到精通

使用 Postman 进行 API 测试&#xff1a;从入门到精通 使用 Postman 进行 API 测试&#xff1a;从入门到精通一、什么是 API 测试&#xff1f;二、Postman 简介三、环境搭建四、API 测试流程1. 收集 API 文档2. 发送基本请求示例&#xff1a;发送 GET 请求示例代码&#xff08;…...

用python实现进度条

前言 在Python中&#xff0c;可以使用多种方式实现进度条。以下是几种常见的进度条格式的实现方法&#xff1a; 1. 使用 tqdm 库 tqdm 是一个非常流行的库&#xff0c;可以轻松地在循环中显示进度条。 from tqdm import tqdm import time# 示例&#xff1a;简单的进度条 fo…...

android 自定义通话录音

在 Android 开发中&#xff0c;实现通话录音功能通常涉及到对系统通话的拦截和录音。由于通话录音涉及到用户隐私和安全性&#xff0c;Android 系统对此有严格的限制和要求。在 Android 10&#xff08;API 级别 29&#xff09;及以上版本中&#xff0c;直接访问通话录音功能变得…...

WebSocket——环境搭建与多环境配置

一、前言&#xff1a;为什么要使用多环境配置&#xff1f; 在开发过程中&#xff0c;我们通常会遇到多个不同的环境&#xff0c;比如开发环境&#xff08;Dev&#xff09;、测试环境&#xff08;Test&#xff09;、生产环境&#xff08;Prod&#xff09;等。每个环境的配置和需…...

【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案

项目背景介绍 铁路货运企业需要对物流单进行长期存档&#xff0c;以便后续查询和审计。不同的物流单可能包含不同的关键信息&#xff0c;通过自定义指定多个区域进行识别重命名&#xff0c;可以使存档的图片文件名具有统一的规范和明确的含义。比如&#xff0c;将包含货物运单…...

在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA

YOLO (You Only Look Once) 是计算机视觉领域中最具影响力的实时目标检测算法之一&#xff0c;以其高精度与高效性深受业界青睐&#xff0c;广泛应用于自动驾驶、安防监控、医疗影像等领域。 该模型最早于 2015 年由华盛顿大学研究生 Joseph Redmon 发布&#xff0c;开创了将目…...

c++可变参数详解

目录 引言 库的基本功能 va_start 宏: va_arg 宏 va_end 宏 va_copy 宏 使用 处理可变参数代码 C11可变参数模板 基本概念 sizeof... 运算符 包扩展 引言 在C编程中&#xff0c;处理不确定数量的参数是一个常见的需求。为了支持这种需求&#xff0c;C标准库提供了 &…...

Ubuntu安装VMware17

安装 下载本文的附件&#xff0c;之后执行 sudo chmod x VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle sudo ./VMware-Workstation-Full-17.5.2-23775571.x86_64.bundle安装注意事项&#xff1a; 跳过账户登录的办法&#xff1a;断开网络 可能出现的问题以及解决…...

在Debian 12上安装VNC服务器

不知道什么标题 可以看到这个文章是通过豆包从国外网站copy的&#xff0c;先这样写着好了&#xff0c;具体的我有时间再补充&#xff0c;基本内容都在这里了。 在Debian 12上安装VNC服务器 简介 VNC&#xff08;Virtual Network Computing&#xff0c;虚拟网络计算&#xf…...

设计模式Python版 外观模式

文章目录 前言一、外观模式二、外观模式示例三、抽象外观类四、抽象外观类示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&am…...

Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具&#xff0c;能够…...

论文解读:《基于TinyML毫米波雷达的座舱检测、定位与分类》

摘要 本文提出了一种实时的座舱检测、定位和分类解决方案&#xff0c;采用毫米波&#xff08;mmWave&#xff09;雷达系统芯片&#xff08;SoC&#xff09;&#xff0c;CapterahCAL60S344-AE&#xff0c;支持微型机器学习&#xff08;TinyML&#xff09;。提出了波束距离-多普勒…...

e2studio开发RA2E1(5)----GPIO输入检测

e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…...

数据结构:队列篇

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 文章目录 系列文章目录前言一.队列的概念和结构1.1概念一、动态内存管理优势二、操作效率与安全性…...

idea中git的简单使用

提交&#xff0c;推送直接合并 合到哪个分支就到先切到哪个分支...

Java中的object类

1.Object类是什么&#xff1f; &#x1f7ea;Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类(超类),位于类继承层次结构的顶端。也就是说&#xff0c;Java 允许把任何类型的对象赋给 Object 类型的变量。 &#x1f7e6;Java里面除了Object类&#xff0c;所有的…...

html2canvas绘制页面并生成图像 下载

1. 简介 html2canvas是一个开源的JavaScript库&#xff0c;它允许开发者在用户的浏览器中直接将HTML元素渲染为画布&#xff08;Canvas&#xff09;&#xff0c;并生成图像。以下是对html2canvas的详细介绍&#xff1a; 2. 主要功能 html2canvas的主要功能是将网页中的HTML元…...

Certum OV企业型通配符SSL

随着网络攻击手段的不断演变&#xff0c;仅仅依靠HTTP协议已无法满足现代企业对数据安全的需求。SSL证书&#xff0c;特别是经过严格验证的组织验证型SSL证书&#xff0c;成为了保护网站数据传输安全、提升用户信任度的标配。 一、Certum OV企业型通配符SSL概述 Certum&#…...

2024年Web前端最新Java进阶(五十五)-Java Lambda表达式入门_eclipse lambda(1),面试必备

对象篇 模块化编程-自研模块加载器 开源分享&#xff1a;【大厂前端面试题解析核心总结学习笔记真实项目实战最新讲解视频】 Arrays.sort(players, sortByName); // 1.3 也可以采用如下形式: Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2))); ??其…...

JVM 四虚拟机栈

虚拟机栈出现的背景 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功能需要更多…...

V103开发笔记1-20250113

2025-01-13 一、应用方向分析 应用项目&#xff1a; PCBFLY无人机项目&#xff08;包括飞控和手持遥控器&#xff09;&#xff1b; 分析移植项目&#xff0c;应用外设资源包括&#xff1a; GPIO, PWM,USART,GPIO模拟I2C/SPI, ADC,DMA,USB等&#xff1b; 二、移植项目的基本…...

Page Assist - 本地Deepseek模型 Web UI 的安装和使用

Page Assist Page Assist是一个开源的Chrome扩展程序&#xff0c;为本地AI模型提供一个直观的交互界面。通过它可以在任何网页上打开侧边栏或Web UI&#xff0c;与自己的AI模型进行对话&#xff0c;获取智能辅助。这种设计不仅方便了用户随时调用AI的能力&#xff0c;还保护了…...

Cookie及Session---笔记

目录 Cookiecookie简介cookiesession的认证方式tpshop完整登录实现-cookie Sessionsession简介session自动管理cookietpshop完整登录实现-sessioncookie和session的区别获取响应结果指定内容 Cookie cookie简介 工程师针对HTTP协议是无连接无状态特性所设计的一种技术&#x…...

【Block总结】DASI,多维特征融合

论文信息 HCF-Net&#xff08;Hierarchical Context Fusion Network&#xff09;是一种新提出的深度学习模型&#xff0c;专门用于红外小目标检测。该论文于2024年3月16日发布&#xff0c;作者包括Shibiao Xu、ShuChen Zheng等&#xff0c;主要研究机构为北京邮电大学。该模型…...

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域&#xff0c;电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作&#xff0c;存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网&#xff08;IIoT&#xff09;技术&#xff0c;实现电源设备…...

4.PPT:日月潭景点介绍【18】

目录 NO1、2、3、4​ NO5、6、7、8 ​ ​NO9、10、11、12 ​ 表居中或者水平/垂直居中单元格内容居中或者水平/垂直居中 NO1、2、3、4 新建一个空白演示文稿&#xff0c;命名为“PPT.pptx”&#xff08;“.pptx”为扩展名&#xff09;新建幻灯片 开始→版式“PPT_素材.doc…...

《迪拜AI展:探寻中东人工智能发展的璀璨新篇》

迪拜&#xff1a;AI 浪潮下的闪耀明珠 迪拜&#xff0c;这座位于阿拉伯半岛东部、波斯湾东南岸的城市&#xff0c;犹如一颗璀璨的明珠&#xff0c;在中东地区散发着独特的魅力。它是阿拉伯联合酋长国的第二大城市&#xff0c;也是迪拜酋长国的首府 &#xff0c;凭借优越的地理位…...

axios如何利用promise无痛刷新token

目录 需求 需求解析 实现思路 方法一&#xff1a; 方法二&#xff1a; 两种方法对比 实现 封装axios基本骨架 instance.interceptors.response.use拦截实现 问题和优化 如何防止多次刷新token 同时发起两个或以上的请求时&#xff0c;其他接口如何重试 最后完整代…...