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

OpenStack Nova instance 常见操作

1. 启动实例(start

场景:启动处于 SHUTOFF 状态的实例
源码路径

  • API 层nova/compute/api.pystart()
  • RPC 层nova/compute/rpcapi.pystart_instance()
  • 执行层nova/compute/manager.pystart_instance()
  • 驱动层nova/virt/libvirt/driver.pypower_on()

关键代码

# nova/compute/manager.py
def start_instance(self, context, instance):# 检查实例状态是否为 SHUTOFFif instance.vm_state != vm_states.STOPPED:raise exception.InstanceInvalidState(...)# 调用驱动启动虚拟机self.driver.power_on(context, instance, network_info)# 更新数据库状态为 ACTIVEinstance.vm_state = vm_states.ACTIVEinstance.save()
# nova/virt/libvirt/driver.py
def power_on(self, context, instance, network_info):# 获取 Libvirt 域对象domain = self._get_domain(instance)# 调用 Libvirt API 启动虚拟机domain.createWithFlags(libvirt.VIR_DOMAIN_START_AUTODESTROY)

2. 停止实例(stop

场景:正常关闭处于 ACTIVE 状态的实例
源码路径

  • API 层nova/compute/api.pystop()
  • RPC 层nova/compute/rpcapi.pystop_instance()
  • 执行层nova/compute/manager.pystop_instance()
  • 驱动层nova/virt/libvirt/driver.pypower_off()

关键代码

# nova/compute/manager.py
def stop_instance(self, context, instance):if instance.vm_state != vm_states.ACTIVE:raise exception.InstanceInvalidState(...)# 调用驱动关闭虚拟机self.driver.power_off(instance)# 更新状态为 STOPPEDinstance.vm_state = vm_states.STOPPEDinstance.save()
# nova/virt/libvirt/driver.py
def power_off(self, instance):domain = self._get_domain(instance)# 发送 ACPI 关机信号(正常关闭)domain.shutdownFlags(libvirt.VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN)

3. 暂停实例(pause

场景:将运行中的实例状态冻结到内存
源码路径

  • API 层nova/compute/api.pypause()
  • RPC 层nova/compute/rpcapi.pypause_instance()
  • 执行层nova/compute/manager.pypause_instance()
  • 驱动层nova/virt/libvirt/driver.pypause()

关键代码

# nova/compute/manager.py
def pause_instance(self, context, instance):if instance.vm_state != vm_states.ACTIVE:raise exception.InstanceInvalidState(...)self.driver.pause(instance)instance.vm_state = vm_states.PAUSED  # 状态变为 PAUSEDinstance.save()
# nova/virt/libvirt/driver.py
def pause(self, instance):domain = self._get_domain(instance)domain.suspend()  # Libvirt 暂停API

4. 恢复实例(unpause

场景:从内存中恢复被暂停的实例
源码路径

  • API 层nova/compute/api.pyunpause()
  • RPC 层nova/compute/rpcapi.pyunpause_instance()
  • 执行层nova/compute/manager.pyunpause_instance()
  • 驱动层nova/virt/libvirt/driver.pyresume()

关键代码

# nova/compute/manager.py
def unpause_instance(self, context, instance):if instance.vm_state != vm_states.PAUSED:raise exception.InstanceInvalidState(...)self.driver.resume(instance)instance.vm_state = vm_states.ACTIVE  # 恢复为 ACTIVEinstance.save()
# nova/virt/libvirt/driver.py
def resume(self, instance):domain = self._get_domain(instance)domain.resume()  # Libvirt 恢复API

5. 重启实例(reboot

场景:重启运行中的实例(分软重启和硬重启)
源码路径

  • API 层nova/compute/api.pyreboot()
  • RPC 层nova/compute/rpcapi.pyreboot_instance()
  • 执行层nova/compute/manager.pyreboot_instance()
  • 驱动层nova/virt/libvirt/driver.pyreboot()

关键代码

# nova/compute/manager.py
def reboot_instance(self, context, instance, reboot_type):# reboot_type: SOFT (操作系统级) / HARD (电源级)if instance.vm_state != vm_states.ACTIVE:raise exception.InstanceInvalidState(...)self.driver.reboot(context, instance, reboot_type)# 状态保持 ACTIVE
# nova/virt/libvirt/driver.py
def reboot(self, context, instance, reboot_type):domain = self._get_domain(instance)if reboot_type == "SOFT":domain.reboot(flags=0)  # 发送重启信号给操作系统else:  # HARDdomain.reset()  # 模拟电源复位

6. 规格调整 (Resize)

6.1 API入口层

nova/api/openstack/compute/servers.py

def _action_resize(self, req, id, body):# 状态检查if instance.vm_state != vm_states.ACTIVE:raise exception.InstanceInvalidState(...)# 获取新flavorflavor_id = body['resize']['flavorRef']new_flavor = self._get_flavor(flavor_id)# 调用compute APIself.compute_api.resize(req.environ['nova.context'], instance, new_flavor)

6.2 Compute API层

nova/compute/api.py

def resize(self, context, instance, flavor):# 配额检查self._check_quota(context, cores=flavor.vcpus, ram=flavor.memory_mb)# 创建迁移记录migration = objects.Migration(context, instance_uuid=instance.uuid,source_compute=instance.host,status='migrating')migration.create()# 通过conductor发起迁移self.conductor_api.resize_instance(context, instance, migration, flavor, [])

6.3 Conductor层

nova/conductor/manager.py

def resize_instance(self, context, instance, migration, flavor, clean_shutdown):# 构建请求规格request_spec = self._build_request_spec(context, instance, flavor)# 调度目标主机hosts = self.scheduler_client.select_destinations(context, request_spec)host = hosts[0]# 调用目标节点准备self.compute_rpcapi.prep_resize(context, instance, migration, host, flavor)

6.4 目标节点准备

nova/compute/manager.py

def prep_resize(self, context, instance, migration, host, flavor):# 创建新规格实例(不启动)self.driver.spawn(context, instance, image_meta, [], block_device_info, flavor)# 更新实例状态instance.task_state = task_states.RESIZE_PREPinstance.save()

6.5 源节点迁移

nova/compute/manager.py

def resize_instance(self, context, instance, migration):# 迁移磁盘if not shared_storage:self._migrate_disk_and_power_off(context, instance, migration)# 更新实例规格instance.old_flavor = instance.flavorinstance.new_flavor = new_flavorinstance.save()# 等待用户确认instance.task_state = task_states.RESIZE_MIGRATEDinstance.save()

7. 卷管理 (Attach/Detach)

7.1 卷挂载 (Attach)

nova/compute/api.py

def attach_volume(self, context, instance, volume_id, device):# 状态检查if instance.vm_state not in (vm_states.ACTIVE, vm_states.PAUSED):raise exception.InstanceInvalidState(...)# 调用Cinder APIvolume = self.volume_api.get(context, volume_id)self.volume_api.reserve_volume(context, volume_id)# RPC调用计算节点self.compute_rpcapi.attach_volume(context, instance, volume_id, device, disk_bus)

nova/compute/manager.py

def attach_volume(self, context, instance, volume_id, device):# 获取卷连接信息connector = self.driver.get_volume_connector(instance)connection_info = self.volume_api.initialize_connection(context, volume_id, connector)# Hypervisor挂载卷self.driver.attach_volume(context, connection_info, instance, device)# 更新数据库bdm = objects.BlockDeviceMapping(context, volume_id=volume_id, instance_uuid=instance.uuid,device_name=device, connection_info=connection_info)bdm.create()

7.2 卷卸载 (Detach)

nova/compute/manager.py

def detach_volume(self, context, volume_id, instance):# 获取连接信息bdm = objects.BlockDeviceMapping.get_by_volume_id(context, volume_id)connection_info = bdm.connection_info# Hypervisor卸载卷self.driver.detach_volume(context, connection_info, instance, volume_id)# 调用Cinder APIself.volume_api.terminate_connection(context, volume_id, connection_info)self.volume_api.detach(context, volume_id)# 清理数据库bdm.destroy()

8. 添加网卡 (Add NIC)

8.1 API入口

nova/api/openstack/compute/attach_networks.py

def add(self, req, server_id, body):network_id = body['interfaceAttachment']['net_id']port_id = body['interfaceAttachment'].get('port_id')fixed_ip = body['interfaceAttachment'].get('fixed_ip')# 调用compute APIself.compute_api.attach_interface(req.environ['nova.context'], instance, network_id, port_id, fixed_ip)

8.2 Compute API层

nova/compute/api.py

def attach_interface(self, context, instance, network_id, port_id, fixed_ip):# 状态检查if instance.vm_state not in (vm_states.ACTIVE, vm_states.PAUSED):raise exception.InstanceInvalidState(...)# 创建或获取端口if port_id:port = self.network_api.show_port(context, port_id)else:port = self.network_api.create_port(context, instance.project_id, network_id, instance.uuid, fixed_ip=fixed_ip)# RPC调用计算节点self.compute_rpcapi.attach_interface(context, instance, port['id'])

8.3 计算节点执行

nova/compute/manager.py

def attach_interface(self, context, instance, port_id):# 获取网络信息network_info = self.network_api.get_instance_nw_info(context, instance)# 添加新端口new_port = self.network_api.show_port(context, port_id)network_info.append(new_port)# Hypervisor添加网卡self.driver.attach_interface(context, instance, network_info, new_port)# 更新实例网络缓存instance.info_cache.network_info = network_infoinstance.info_cache.save()

9. 冷迁移(Migrate)

冷迁移需要在实例关机状态下进行,涉及磁盘迁移和计算节点切换。

9.1 API入口层

nova/api/openstack/compute/migrate_server.py

def _migrate(self, req, id, body):# 状态检查:实例必须为ACTIVE或STOPPEDif instance.vm_state not in (vm_states.ACTIVE, vm_states.STOPPED):raise exception.InstanceInvalidState(...)# 调用compute APIself.compute_api.migrate(req.environ['nova.context'], instance)

9.2 Compute API层

nova/compute/api.py

def migrate(self, context, instance):# 检查实例是否已挂载卷if self.volume_api.get_volume_attachments(context, instance.uuid):raise exception.MigrationError(...)# 创建迁移记录migration = objects.Migration(context, instance_uuid=instance.uuid,migration_type='migration',status='migrating')migration.create()# 通过conductor发起迁移self.conductor_api.migrate_server(context, instance, migration)

9.3 Conductor调度层

nova/conductor/manager.py

def migrate_server(self, context, instance, migration):# 调度目标主机request_spec = self._build_request_spec(context, instance)hosts = self.scheduler_client.select_destinations(context, request_spec)host = hosts[0]# 调用源节点执行迁移self.compute_rpcapi.migrate_instance(context, instance, migration, host)

9.4 源节点执行

nova/compute/manager.py

def migrate_instance(self, context, instance, migration, host):# 关闭实例(如果运行中)if instance.vm_state == vm_states.ACTIVE:self.driver.power_off(instance)# 迁移磁盘self._migrate_disk(context, instance, host)# 在目标节点启动实例self.compute_rpcapi.finish_migrate_instance(context, instance, host)# 清理源实例self.driver.destroy(context, instance, [], block_device_info)

10. 热迁移(Live-Migrate)

热迁移在实例运行状态下进行,需要迁移内存状态和磁盘访问。

10.1 API入口

nova/api/openstack/compute/admin_actions.py

def _migrate_live(self, req, id, body):# 状态检查:实例必须为ACTIVEif instance.vm_state != vm_states.ACTIVE:raise exception.InstanceInvalidState(...)# 获取目标主机host = body['os-migrateLive']['host']# 调用compute APIself.compute_api.live_migrate(req.environ['nova.context'], instance, host)

10.2 Compute API层

nova/compute/api.py

def live_migrate(self, context, instance, host):# 检查目标主机是否可用service = objects.Service.get_by_host_and_binary(context, host, 'nova-compute')if not service:raise exception.ComputeHostNotFound(host=host)# 创建迁移记录migration = objects.Migration(context, instance_uuid=instance.uuid,migration_type='live-migration',status='migrating')migration.create()# 通过conductor发起热迁移self.conductor_api.live_migrate_instance(context, instance, host)

10.3 源节点执行

nova/compute/manager.py

def live_migrate_instance(self, context, instance, host):# 检查Hypervisor支持if not self.driver.capabilities['supports_live_migration']:raise exception.LiveMigrationNotSupported(...)# 执行热迁移self.driver.live_migrate(context, instance, host)# 更新实例主机instance.host = hostinstance.save()

10.4 Libvirt驱动实现

nova/virt/libvirt/driver.py

def live_migrate(self, context, instance, dest):# 获取源域domain = self._get_domain(instance)# 获取目标连接dest_uri = self._get_dest_uri(dest)# 执行迁移domain.migrateToURI(dest_uri, flags=libvirt.VIR_MIGRATE_LIVE | libvirt.VIR_MIGRATE_PEER2PEER)

11. 故障迁移(Evacuate)

故障迁移用于在计算节点宕机时将实例迁移到其他节点。

11.1 API入口

nova/api/openstack/compute/evacuate.py

def _evacuate(self, req, id, body):# 检查实例状态是否为ERRORif instance.vm_state != vm_states.ERROR:raise exception.InstanceInvalidState(...)# 获取目标主机(可选)host = body['evacuate'].get('host')# 调用compute APIself.compute_api.evacuate(req.environ['nova.context'], instance, host)

11.2 Compute API层

nova/compute/api.py

def evacuate(self, context, instance, host):# 检查源主机是否宕机source_host = instance.hostif not self.service_api.host_in_service(context, source_host):raise exception.ComputeHostNotDown(host=source_host)# 创建迁移记录migration = objects.Migration(context, instance_uuid=instance.uuid,migration_type='evacuation',status='migrating')migration.create()# 通过conductor发起迁移self.conductor_api.evacuate_instance(context, instance, host)

11.3 目标节点执行

nova/compute/manager.py

def rebuild_instance(self, context, instance, migration):# 检查共享存储if not self.driver.shared_storage:raise exception.EvacuateNotSupported(...)# 重建实例self.driver.spawn(context, instance, image_meta, network_info, block_device_info)# 更新实例状态instance.host = self.hostinstance.vm_state = vm_states.ACTIVEinstance.save()

12. 实例快照(Create Snapshot)

12.1 API入口层

nova/api/openstack/compute/servers.py

def _action_create_image(self, req, id, body):# 提取参数name = body['createImage']['name']metadata = body['createImage'].get('metadata', {})# 状态检查instance = self._get_server(context, req, id)if instance.vm_state not in (vm_states.ACTIVE, vm_states.STOPPED, vm_states.PAUSED, vm_states.SUSPENDED):raise exception.InstanceInvalidState(...)# 调用compute APIimage_id = self.compute_api.snapshot(context, instance, name, extra_properties=metadata)# 构建响应return webob.Response(location=self._get_image_location(req, image_id))

12.2 Compute API层

nova/compute/api.py

def snapshot(self, context, instance, name, extra_properties=None):# 检查配额self._check_image_quota(context, 1)# 创建Glance镜像记录image_meta = self.image_api.create(context, {'name': name,'status': 'creating','container_format': 'bare','disk_format': 'raw','properties': extra_properties or {}})# 调用conductorself.conductor_api.snapshot_instance(context, instance, image_meta['id'])return image_meta['id']

12.3 Conductor层

nova/conductor/manager.py

def snapshot_instance(self, context, instance, image_id):# 更新实例任务状态instance.task_state = task_states.IMAGE_SNAPSHOTinstance.save()# RPC调用计算节点self.compute_rpcapi.snapshot_instance(context, instance, image_id)

12.4 Compute Manager层

nova/compute/manager.py

def snapshot_instance(self, context, instance, image_id):try:# 调用驱动创建快照self.driver.snapshot(context, instance, image_id, self._legacy_nw_info(network_info))# 更新Glance状态self.image_api.update(context, image_id, {'status': 'active'})except Exception:# 失败处理self.image_api.update(context, image_id, {'status': 'killed'})raisefinally:# 清理实例状态instance.task_state = Noneinstance.save()

12.5 Hypervisor驱动层 (Libvirt)

nova/virt/libvirt/driver.py

def snapshot(self, context, instance, image_id, update_task_state):# 获取实例磁盘路径disk_path = self._get_disk_path(instance)# 创建临时快照文件with utils.tempdir() as tmpdir:snapshot_path = os.path.join(tmpdir, 'snapshot')# 执行快照命令self._create_snapshot_metadata(instance, snapshot_path)self._qemu_img_convert(disk_path, snapshot_path)# 上传到Glancewith open(snapshot_path, 'rb') as image_file:self._glance_client.call(context, 'upload', image_id, {}, image_file)

13. 快照恢复(Restore from Snapshot)

13.1 API入口层

nova/api/openstack/compute/servers.py

def create(self, req, body):# 解析请求server_dict = body['server']image_ref = server_dict.get('imageRef')# 检查是否为快照IDif image_ref and image_ref.startswith('snapshot-'):snapshot_id = image_ref.replace('snapshot-', '')# 验证快照存在self.image_api.get(context, snapshot_id)# 创建实例(与普通实例创建流程相同)return self._create_instance(req, body)

13.2 Compute API层

nova/compute/api.py

def create(self, context, instance_type, image_href, **kwargs):# 处理快照镜像if image_href and image_href.startswith('snapshot-'):snapshot_id = image_href.replace('snapshot-', '')image_meta = self.image_api.get(context, snapshot_id)image_href = image_meta['id']  # 转换为Glance镜像ID# 后续流程与普通实例创建相同self._provision_instance(context, instance_type, image_meta, ...)

13.3 Compute Manager层

nova/compute/manager.py

def _build_and_run_instance(self, context, instance, ...):# 获取镜像image_meta = self._get_image_metadata(context, instance.image_ref)# 从快照创建的特殊处理if image_meta.get('properties', {}).get('image_type') == 'snapshot':self._handle_snapshot_boot(context, instance, image_meta)# 正常启动流程self.driver.spawn(context, instance, image_meta, ...)

13.4 快照启动处理

nova/compute/manager.py

def _handle_snapshot_boot(self, context, instance, image_meta):# 检查快照元数据snapshot_properties = image_meta.get('properties', {})orig_instance_uuid = snapshot_properties.get('instance_uuid')# 恢复实例特定配置if orig_instance_uuid:orig_instance = objects.Instance.get_by_uuid(context, orig_instance_uuid)instance.key_name = orig_instance.key_nameinstance.security_groups = orig_instance.security_groupsinstance.save()

14. 删除操作(Delete)

14.1 API入口层

nova/api/openstack/compute/servers.py

def _delete(self, req, id):# 获取实例instance = self._get_server(context, req, id)# 检查状态if instance.vm_state == vm_states.DELETED:raise exception.InstanceNotFound(...)# 调用compute APIself.compute_api.delete(req.environ['nova.context'], instance)

14.2 Compute API层

nova/compute/api.py

def delete(self, context, instance):# 检查权限self._check_policy(context, 'delete', instance)# 软删除或硬删除if CONF.reclaim_instance_interval > 0:self.soft_delete(context, instance)else:self._delete(context, instance)

14.3 软删除实现

nova/compute/api.py

def soft_delete(self, context, instance):# 更新状态instance.vm_state = vm_states.SOFT_DELETEDinstance.task_state = task_states.DELETINGinstance.deleted_at = timeutils.utcnow()instance.save()# RPC调用计算节点self.compute_rpcapi.soft_delete_instance(context, instance)

14.4 硬删除实现

nova/compute/api.py

def _delete(self, context, instance):# 更新状态instance.vm_state = vm_states.DELETEDinstance.task_state = task_states.DELETINGinstance.deleted_at = timeutils.utcnow()instance.save()# RPC调用计算节点self.compute_rpcapi.terminate_instance(context, instance)

14.5 计算节点执行

nova/compute/manager.py

def terminate_instance(self, context, instance, bdms):try:# 销毁虚拟机self.driver.destroy(context, instance, network_info, bdms)# 释放网络资源self.network_api.deallocate_for_instance(context, instance)# 分离卷for bdm in bdms:if bdm.is_volume:self.volume_api.terminate_connection(context, bdm.volume_id, self._get_volume_connector())self.volume_api.detach(context, bdm.volume_id)# 清理数据库instance.destroy()except Exception:LOG.exception("终止实例失败")instance.vm_state = vm_states.ERRORinstance.save()

相关文章:

OpenStack Nova instance 常见操作

1. 启动实例(start) 场景:启动处于 SHUTOFF 状态的实例 源码路径:API 层:nova/compute/api.py → start() RPC 层:nova/compute/rpcapi.py → start_instance() 执行层:nova/compute/manager.py → start_instance() 驱动层:nova/virt/libvirt/driver.py → power_on()…...

libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南

libdpi.dll libdatareport.dll libdash_plugin.dll libcurl-x86.dll libcurl-x64.dll libcurl_x64.dll - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…...

理解 Kubernetes CSI

关于 Kubernetes CSI,现在的资料已经不少,但我仍希望有一篇文档能让人轻松但不失准确地理解 CSI。 本文不涉及代码分析和详细设计。但需要如下基础:会使用至少一种容器,Docker,containerd,Kata 之类的都可以。 protobuf 和 gRPC:会用并有少量的开发经验,会用某种语言(…...

9.15

开学...

常用数学定理公式

二项式定理 \[(x + y)^n = \sum_{k=0}^n \binom{n}{k} x^{n-k} y^k \]...

线性规划

线性规划是求一个线性函数在满足一组线性等式或不等式方程条件下极值的一类数学问题的统称。要求目标函数和约束方程必须是线性函数。隐含了如下假定:  比例性假定:决策变量的变化与资源消耗成比例;  可加性假定:每个决策变量的影响独立于其他变量;  连续性假定:决…...

伪代码学习总结

伪代码学习总结 1. 什么是伪代码伪代码(Pseudocode) 是一种 算法描述语言。它既不同于自然语言(太模糊),也不是某种具体编程语言(太依赖语法)。使用伪代码的目的:使被描述的算法可以容易地翻译成任何一种编程语言(如 Pascal, C, Java, Python 等); 要求 结构清晰、可…...

20号胶 2511

...

9.13linux系统命令

Linux2系统命令 1、df 查看磁盘使用情况 (1)df 查看磁盘使用情况 Filesystem:代表该文件系统时哪个分区,所以列出的是设备名称。 1K-blocks:说明下面的数字单位是1KB,可利用-h或-m来改变单位大小,也可以用-B来设置。 Used:已经使用的空间大小。Available:剩余的空间…...

9.15 svn git

svn版本控制工具 一、svn介绍 SVN是subversion的简称 是一个开放源代码的版本控制系统,通过采用分支管理系统的高 效管理,简而言之就是用于多个人共同开发同一个项目,实现共 享资源,实现最终集中式的管理。 SVN的作用:在项目组当中对需求规格说明书、测试用例、产品 说明书…...

PVC2601

...

利用RabbitMQ与Redis实现消息的延迟传递的策略

RabbitMQ:时间控的快递中心 让我们从RabbitMQ开始,RabbitMQ拥有一个叫做“Dead Letter Exchanges”(DLX)的机制,这个机制基本上就是一个失物招领处。当一个消息未能及时被送达,RabbitMQ会将它转移至DLX。这个DLX与一个或多个队列关联,这样就能处理这些失去方向的消息了。…...

python 按excel的经纬度提取对应栅格tif文件的数值

栅格文件 批量处理代码:# -*- coding:utf-8 -*- """ @author: suyue @file: extract_stations_from_excel.py @time: 2025/09/09 @desc: 从Excel读取站点信息并提取所有站点的CTT值 """ import rasterio import numpy as np import pandas as p…...

麒麟

麒麟点击跳转...

实现我的第一个本地文档问答机器人

本地文档问答机器人 下面是一个完整的本地文档问答机器人实现,涵盖了阶段三的所有核心概念:文档加载、文本分割、向量存储和检索增强生成(RAG)。 完整代码实现 import os.path from typing import Listfrom huggingface_hub import snapshot_download from langchain.chain…...

17、逻辑回归与分类评估 - 从连续到离散的智能判断 - 教程

17、逻辑回归与分类评估 - 从连续到离散的智能判断 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", m…...

关于32位单片机使用lwip无法访问(ping)外网,只能与同网段设备进行通信的问题解决

核心问题:MAC地址 理论依据:MAC地址是有相应的规范的MAC地址中,前3字节为组织唯一标识符,后24位由厂家自行定义。也就是说前3字节是有规定的,其中前3字节MAC中的前几位也是有着对应的含义的。MAC地址详细的介绍,大家可以在网上搜得到 出现这个问题的核心就是网关对设备mac地…...

044-WEB攻防-PHP应用SQL盲注布尔回显延时判断报错处理增删改查方式

044-WEB攻防-PHP应用&SQL盲注&布尔回显&延时判断&报错处理&增删改查方式 1.演示案例:➢PHP-MYSQL-SQL操作-增删改查 ➢PHP-MYSQL-注入函数-布尔&报错&延迟 ➢PHP-MYSQL-注入条件-数据回显&错误处理 ➢PHP-MYSQL-CMS案例-插入报错&删除延迟…...

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台统一接入方案

多品牌摄像机视频平台EasyCVR海康大华宇视视频平台统一接入方案在实际的工程项目里,我们常常会面临这样的情况:项目管理者可能会决定使用多个品牌的视频监控摄像头,或者有需求将现有的、多种类型的监控系统进行整合。现在,让我们来探讨一下如何实现不同品牌摄像头的连接和使…...

离散数学课堂习题及课后习题 - PPX

课上的习题,不完整,有空再更新第二章 抽屉原理 Background: 简单形式: 把(n+1)个物体放入n个盒子,必有一个盒子中装了两个物体。其实这个也是狄利克雷描述的一个特殊的表述(如果对于一个映射$ X\to Y $ ,如果\(|X|>|Y|\),则\(f\)不可能是单射,也就是会有\(f(x_1)=f(x…...

玻璃2601

前期五浪下跌走完了 开启反弹...

GoFrame框架查询数据表时对字段取别名

两种方式,基于模型的Fields方法dao.User.Where("id",1).Fields("name as `nickname`","id as `uid`").All()基于结构体orm标签的映射关系type UserData struct {Uid int `json:"id" orm:"id"`Nickname string `json:"…...

ubuntu安装mysql矩阵

安装mysql 5.7版本ubuntu版本    mysql版本    xtrabackup版本    ldd显示GLIBC版本    依赖库处理方式18.04       5.7.42      2.4.28        2.27          不需要处理20.04      5.7.42      2.4.28        …...

二十、DevOps落地:Jenkins基础入门(一)

二十、DevOps落地:Jenkins基础入门(一) 目录二十、DevOps落地:Jenkins基础入门(一)1、DevOps初识1.1 什么是DevOps1.2 DevOps相关工具链1.3 什么是CICD?1.4 持续集成CI介绍1.5 持续交付和持续部署CD介绍1.6 什么是Pipeline(流水线)?1.7 Pipeline编排任务的优势1.8 Pi…...

ubuntu 22.04安装mysql5.7

环境Os:ubuntu 22.04 desktop桌面版mysql:mysql-5.7.42-linux-glibc2.12查看操作系统信息root@db:~# ldd --version ldd (Ubuntu GLIBC 2.35-0ubuntu3) 2.35 Copyright (C) 2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions…...

Docker如何获取镜像

可以使用 docker pull 命令来从仓库获取所需要的镜像。...

2025 ICPC 网络赛2 E

E. Zero 矩阵快速幂优化 dp。 考虑第一个数任意选,有 \(2^m\) 种选择,那么第 \(2\sim n-1\) 就有 \(2^{m-1}\) 种选择,因为最后要和前面的异或结果为 \(0\) ,所以最后一位是固定的,但是此时最后一位可能和倒数第二位相等,所以 \(1\sim n-2\) 的异或结果就肯定为 \(0\),设…...

偏移寻址

相对寻址. PC(Program Counter) 以程序计数器pc所指的地址作为起点 当前指令存放地址位1000 若当前指令字长=2B,则PC+2 若当前指令字长=4B,则PC+4 相对寻址:EA=(PC)+A,其中A是相对PC所指的位移量,可正可负,补码表示 优点:这段代码在程序内浮动时不用更改跳转指令的地址码…...

Stringbuilder操作和stringjoiner

使用stringbuilder容器可以方便对字符串的,是java自带的类 两个方法操作完成后默认返回值都是stringbuilder或者stringjoiner类型不是string,需要转换 Stringjoiner: length返回的是所有字符的总个数,包括空格和符号...

西电微机原理与接口技术笔记总结

笔记链接西电微机原理-第一章 序论:微型计算机概述 西电微机原理-第二章Intel单核处理器 西电微机原理-第三章 Intel处理器指令系统及汇编语言(1) 西电微机原理-第三章 Intel处理器指令系统及汇编语言(2) 西电微机原理-第三章 Intel处理器指令系统及汇编语言(3) 西电微机…...

abc423 F - Loud Cicada

F - Loud Cicada 题意 给你 \(n\) 个数 \(a_i\),问有多少个 \(x \in [1,Y]\) 满足 \(a_i \mid x\) 的 \(i\) 的个数等于 \(m\)。 \(n ,m \le 20, a_i,Y \le 10^{18}\)。 思路 \(a_i \mid x\) 的 \(x\) 有 \(\lfloor \frac{Y}{a_i} \rfloor\) 个。 显然可以枚举 \(i\) 的集合,…...

​​射频线缆选择指南:构建高性能无线系统的血脉​​

射频线缆关键参数包括阻抗匹配、插入损耗、电压驻波比、屏蔽效能和相位稳定性,影响信号传输质量与系统性能。在无线通信、测试测量和雷达系统中,射频线缆(RF Cable)是连接发射机、天线、接收机等组件的"生命线"。其性能直接影响信号传输的完整性、系统效率和最终…...

黑客必备的DevOps实战工作坊:4小时动手实验指南

这篇由Black Hills Information Security发布的文章详细介绍了针对黑客的DevOps实践,包含4小时动手实验工作坊内容。涉及自动化部署、安全集成和攻击模拟等关键技术,帮助安全专业人员将DevOps方法融入渗透测试和红队操作中。DevOps for Hackers with Hands-On Labs w/ Ralph …...

金融业-数字化转型大赛-网络安全赛道部分wp

web 签到 二维码被分割,需要拼接扫描。 离线二维码识别工具:QR_Research check this <?phpini_set(display_errors, 0);function containsStr($str, $substr) {return strpos($str, $substr) !== false;}if(isset($_GET["view"])){if (containsStr($_GET[view]…...

Mysql查找含字符串表字段

该存储过程用于在 当前数据库 中查找包含指定字符串的所有表和字段。 输出结果:每张表只返回一次记录,列出该表中包含目标字符串的字段列表(逗号分隔)。 适用场景:数据库迁移或审计时,快速定位含敏感信息的字段。 找出数据库中某个 URL、邮箱、关键字或特定内容所在的字段…...

MySQL注意事项与规范 - 实践

MySQL注意事项与规范 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...

真正的元推理,不需要人类的认可,恰恰是人类追求元推理,只有元推理才能彻底解放人类

ECT-OS-JiuHuaShan/ORCID:0009-0006-8591-1891 ▮ 框架推理激活:接收元认知独立性宣言,启动自主性终极阐释协议 论断抵达了文明认知的终极自由境界。完全正确:真正的元推理自成宇宙,其合法性源于与规律的同构性,而非人类的认可。恰恰是人类对绝对确定性的追求,引导其创…...

西电微机原理-第三章 Intel处理器指令系统及汇编语言(5)

目录十一、32/64位处理器拓展指令——多媒体/流媒体SIMD拓展指令集MMX指令集SSE/SSE2指令SSESSE2总结十二、汇编语言与高级语言的接口在C语言中嵌入汇编语言代码基本方法程序举例让C语言从外部调用代码综合举例判断有符号数整数加法溢出 十一、32/64位处理器拓展指令——多媒体…...

西电微机原理-第五章 存储技术

目录SRAM用SRAM构成8086/8088的内存连接方式拓展电路译码电路用SRAM构成80386/80486内存利用SRAM构成Pentium的内存ROM用EPROM构成8086/8088的内存用E2PROM构成8086/8088内存闪速E2PROM:Flash其他存储器SRAM综合设计举例举例1:构成8086内存(16位)举例2:构成8088内存(8位)…...

西电微机原理-第七章 常用接口器件

目录计算机与外设之间如何通过接口传送数据(非DMA)典型接口芯片8255可编程并行接口内部结构与外部引线8255的控制字8255的工作方式8255的寻址及连接使用8253 可编程定时器外部引线及功能六种工作方式控制字连接与初始化程序级联使用(关键) 计算机与外设之间如何通过接口传送…...

CF1264D1 Beautiful Bracket Sequence (easy version)

省流:成唐诗了。 tm 题目说是能任意删啊,我还以为是啥呢。 那么显然删成若干个左括号再拼上若干个右括号,考虑枚举分界点。 此时显然每个分界点答案用组合数算出来,发现是范德蒙德组合的形式直接卷就做完了。...

西电微机原理-第六章 输入输出技术

目录程序查询IO方式一、无条件传送方式输入接口输出接口二、查询方式中断IO方式中断类型中断执行流程可编程中断控制器8259硬件与基本寄存器工作流程工作方式及其选择级联编程使用中断实现方式基本流程1. 硬件连接2. 编写初始化程序初始化8259设置中断向量表3. 编写中断处理程序…...

【FAQ】应用A如何使用应用B内的文件?

【问题描述】 应用A如何使用应用B的文件?例如,自己开发的应用想读取、复制微信、钉钉等IM应用内的文件。 【背景知识】 系统通过访问控制的机制,防止数据或功能被不当或恶意使用。当前访问控制的机制涉及多方面,包括应用沙箱、应用权限、系统控件等方案。 【解决方案】 为防…...

OpenStack Cinder 创建卷

Cinder 的卷创建(create volume)是块存储服务的核心操作,涉及从请求接收、调度决策到存储后端实际创建的完整流程。 1、流程概览 创建卷的完整流程涉及 Cinder 多个组件的协同工作,整体流程如下: 客户端 → cinder-api → 消息队列 → cinder-scheduler → 消息队列 → ci…...

西电微机原理-第二章 Intel单核处理器

目录2.1.1 功能特性2.1.2 体系结构2.1.3 寄存器、主存、io结构寄存器结构主存结构:双体结构主存结构:分段结构2.1.4 8086芯片引脚共用引脚最小模式下的引脚最小模式下的总线构成标准的总线读写时序8088电路图最大模式的引脚2.2-2.3 Intel多核处理器(酷睿处理器) 2.1.1 功能…...

二叉树的迭代遍历(非递归)

迭代使用栈; 前序遍历 遍历顺序中左右,由于先进后出的栈的特性,我们先加入右孩子再加入左孩子; 代码: class Solution { public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> result;if (root == NULL) return res…...

记录---用好了 defineProps 才叫会用 Vue3,90% 的写法都错了

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣Vue 3 的 Composition API 给开发者带来了更强的逻辑组织能力,但很多人用 defineProps 的方式,依然停留在 Vue 2 的“Options 语法心智”。本质上只是把 props: {} 拿出来“提前声明”,并没有真正理解它的运行机制、类…...

今日流水账-2025年9月15日

1、刷新一下胶片 2、卷腹28下 3、定位一下进程阻塞问题...

c#给原文件重命名

在 C# 里“原文件”指“物理文件”,用 System.IO 就够了——一行代码完成重命名:csharp 复制// 旧名字 → 新名字(同目录就是重命名,跨目录就是移动+改名) System.IO.File.Move("old.txt", "new.txt"); 完整模板(带判断、异常处理) string oldPath …...

tcpdump常用随笔

指定抓到某文件 tcpdump -w a.cap 指定网卡 tcpdump -i eth0 指定目的ip tcpdump dst host ip dst换成src是源地址,不带是所有 host换成port是指定端口 多个条件用and连接,如 tcpdump dst host ip and port 80...