当前位置: 首页 > 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 创建虚拟机 每种方式…...

WordPress使用(2)

上一篇文章讲述了WordPress的基本安装&#xff0c;主要是docker方式的处理。本文章主要介绍WordPress安装后的其他设置。 1. 安装后设置 安装后碰到的第一个需求就是安装一个合适的主题&#xff0c;但WordPress默认的上传文件大小是2M&#xff0c;远远无法满足要求&#xff0…...

git中文件的状态状态切换

文件的状态分类 Git 中文件的状态主要分为以下几种&#xff1a; Untracked&#xff08;未跟踪&#xff09; 定义&#xff1a;这些文件从未被 Git 跟踪过&#xff0c;通常是因为它们是新创建的文件&#xff0c;或者被 .gitignore 排除在外。 示例&#xff1a;新创建的文件 new…...

解决php8.3无法加载curl扩展

把它的值更改为扩展存在的目录的绝对路径(扩展存在的目录为有php_xxx.dll存在的目录) extension_dir "e:\serv\php83\ext" 然后从php根目录复制 libssh2.dll 和 libcrypto-*.dll 和 libssl-*.dll 到Apache根目录下的bin目录 重启apache服务即可...

三路排序算法

三路排序算法 引言 排序算法是计算机科学中基础且重要的算法之一。在数据分析和处理中&#xff0c;排序算法的效率直接影响着程序的执行速度和系统的稳定性。本文将深入探讨三路排序算法&#xff0c;包括其原理、实现和应用场景。 一、三路排序算法的原理 三路排序算法是一…...

入行FPGA设计工程师需要提前学习哪些内容?

FPGA作为一种灵活可编程的硬件平台&#xff0c;广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师&#xff0c;但对于新手来说&#xff0c;可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备&#xff0c;本文将详细介绍入行FPGA设计工程…...

DBASE DBF数据库文件解析

基于Java实现DBase DBF文件的解析和显示 JDK19编译运行&#xff0c;实现了数据库字段和数据解析显示。 首先解析数据库文件头代码 byte bytes[] Files.readAllBytes(Paths.get(file));BinaryBufferArray bis new BinaryBufferArray(bytes);DBF dbf new DBF();dbf.VersionN…...

html基本结构和常见元素

html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…...

JAVAweb学习日记(十) Mybatis入门操作

一、介绍 二、快速入门程序 三、入门-数据库连接池 四、入门-lombok工具包...

从Transformer到世界模型:AGI核心架构演进

文章目录 引言&#xff1a;架构革命推动AGI进化一、Transformer&#xff1a;重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律 二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破 三、构建…...

Rk3588芯片介绍(含数据手册)

芯片介绍&#xff1a;RK3588是一款低功耗&#xff0c;高性能的处理器&#xff0c;适用于基于arm的PC和边缘计算设备&#xff0c;个人移动互联网设备和其他数字多媒体应用&#xff0c;集成了四核Cortex-A76和四核Cortex-A55以及单独的NEON协处理器 视频处理方面&#xff1a;提供…...

java开发面试自我介绍模板_java面试自我介绍3篇

java 面试自我介绍 3 篇 java 面试自我介绍篇一&#xff1a; 我叫赵&#xff0c;我的同学更都喜欢称呼我的英文名字&#xff0c;叫&#xff0c;六月的 意思&#xff0c;是君的谐音。我来自安徽的市&#xff0c;在 21 年我以市全市第一名 的成绩考上了大学&#xff0c…...

w193基于Spring Boot的秒杀系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新&#xff0c;可以去下载最新的chromedriver使用&#xff0c;自动化中使用新的chromedr…...

【HTML入门】Sublime Text 4与 Phpstorm

文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域&#xff0c…...

Python----Python高级(并发编程:进程Process,多进程,进程间通信,进程同步,进程池)

一、进程Process 拥有自己独立的堆和栈&#xff0c;既不共享堆&#xff0c;也不共享栈&#xff0c;进程由操作系统调度&#xff1b;进程切换需要的资源很最大&#xff0c;效率低。 对于操作系统来说&#xff0c;一个任务就是一个进程&#xff08;Process&#xff09;&#xff…...

汽车自动驾驶AI

汽车自动驾驶AI是当前汽车技术领域的前沿方向&#xff0c;以下是关于汽车自动驾驶AI的详细介绍&#xff1a; 技术原理 感知系统&#xff1a;自动驾驶汽车通过多种传感器&#xff08;如激光雷达、摄像头、雷达、超声波传感器等&#xff09;收集周围环境的信息。AI算法对这些传感…...

Linux之安装MySQL

1、查看系统当前版本是多少位的 getconf LONG_BIT2.去官网下载对应的MYSQL安装包 这里下载的是8版本的&#xff0c;位数对应之前的64位 官网地址&#xff1a;https://downloads.mysql.com/archives/community/ 3.上传压缩包 4.到对应目录下解压 tar -xvf mysql-8.0.26-lin…...

说说Redis的内存淘汰策略?

大家好&#xff0c;我是锋哥。今天分享关于【说说Redis的内存淘汰策略?】面试题。希望对大家有帮助&#xff1b; 说说Redis的内存淘汰策略? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 提供了多种内存淘汰策略&#xff0c;用于在内存达到限制时决定如何…...

SQL范式与反范式_优化数据库性能

1. 引言 什么是SQL范式 SQL范式是指数据库设计中的一系列规则和标准,旨在减少数据冗余、提高数据完整性和一致性。常见的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(Boyce-Codd范式)。 什么是SQL反范式 SQL反范式是指在满足范式要求的基础上,有…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...