nova创建虚机流程源码分析 openstack

    今天跟大家分享openstack中利用nova创建虚机时的源码流程,以便更好的理解openstack云平台实现,也有助于故障定位。

    创建虚机方式有两种,一种是通过dashboard云管理平台创建,一种是nova命令行方式创建。现在各云计算公司都有自己的云平台界面,而openstack原生云管理平台是Horizon实现的Dashboard。
    Dashboard直接调用nova提供的API接口来创建虚机,nova命令行方式也是通过novaclient将命令行参数转化为标准的http请求到nova API,所以分析创建虚机的流程首先从nova API接收请求开始。
    nova服务接收到请求后先由上述的server.py处理,创建server:
nova/api/openstack/compute/servers.py

def create(self, req, body):
    """Creates a new server for a given user."""
    (instances, resv_id) = self.compute_api.create(context,

    body参数就是http请求发来的参数,这一部分主要是先做权限检查,project_id,user_id,可用域等,然后对body进行解析,flavor,image,network,包括volume等参数提取,主要动作是调用compute对虚机资源进行计算(此处调用compute只是计算资源,并没有创建)。
下面到nova/compute/api.py

    def create(self, context, instance_type,
        return self._create_instance(

    该方法对network和可用域做判断,然后继续调用api中的方法,我们来看_create_instance:

def _create_instance(self, context, instance_type,
    self.compute_task_api.schedule_and_build_instances(

    主要对虚机资源进行计算,网络,存储,镜像等,最后将计算出的虚机信息参数提交给conductor,由conductor来统一控制调度,创建等流程。

    下面两步是调用流程,不做详细介绍,看下调用方法即可。
nova/conductor/api.py

def schedule_and_build_instances(self, context,       

nova/conductor/rpcapi.py

def schedule_and_build_instances(self, context, 

nova/conductor/manager.py

def schedule_and_build_instances(self, context, 
    hosts = self._schedule_instances(context, legacy_spec,
    self.compute_rpcapi.build_and_run_instance

    在这一方法中,先调用schedule进行调度来选择主机,调度过程也不做详细介绍,主要是根据nova.conf中配置的策略选择符合条件的主机列表,计算权重,得出最优主机来创建instance;然后创建的任务就要需要调用nova compute来完成。

    openstack中的rpc调用,都是先通过apcapi.py来接收,再由manager.py里面的具体方法来实现,下面直接看:
nova/compute/manager.py

def build_and_run_instance(self, context, instance, 
    utils.spawn_n(_locked_do_build_and_run_instance,

    下面两步调用,不做详解:

def _locked_do_build_and_run_instance(*args, **kwargs):
def _do_build_and_run_instance(self, context, instance, 
    LOG.debug('Starting instance...', instance=instance)
    with timeutils.StopWatch() as timer:
       self._build_and_run_instance(context, instance,

    此处开始创建虚机,debug打印启动虚机,设置定时器,然后调用创建方法:

def _build_and_run_instance(self, context, instance, 
    self._build_resources(context, instance,
    self.driver.spawn(context, instance, image_meta,

    此时虚机状态为build,创建资源:资源主要是网络,镜像和卷;然后调用driver创建虚机:openstack中使用的虚拟化driver通常为libvirt,这个在nova.conf中配置,所以下面到virt中看代码如下:

nova/virt/libvirt/driver.py

def spawn(self, context, instance, image_meta, 
    self._create_domain_and_network(

    主要工作为创建本地镜像,获取虚机xml文件,最后创建domain
这部分成功返回后,说明虚机已经创建成功处于running状态,

def _create_domain(self, xml=None, domain=None,
    guest = libvirt_guest.Guest.create(xml, self._host)

    继续调用:
nova/virt/libvirt/guest.py

    def create(cls, xml, host):
        """Create a new Guest"""
        guest = host.write_instance_config(xml)

    所以资源都已创建好,映射好,现在只需根据xml配置文件创建guest:

def write_instance_config(self, xml):
    domain = self.get_connection().defineXML(xml)

    这里面主要调用的是libvirt提供的接口函数来创建虚拟机,这也是openstack层面的最后一步调用,defineXML(xml)函数是由libvirt中的c语言实现,做的工作也是对xml中的虚机配置进行检查,包括创建使用ovs命令创建真实port等做操,最后将xml中的配置参数转换为qemu命令行参数,由qemu实现真正的创建虚机进程。

    根据本文的流程分析,由云管理平台发起,到最后虚拟化的完成,可以清楚的梳理在整个openstack云环境下各个层面的角色和作用,可以加深对云计算的理解。


小笨驴在吃草的时候创建了微信公众号,为方便更多觅食的“小笨驴”,为大家准备了大量的免费基础教学资料以及技术解决方案,还会定时发布一些好的技术文章,当然也会扯扯蛋、谈谈人生、呵呵,希望我们这群乐于分享技术的“小笨驴”团队越来越大!(技术干货分享群qq:128015753)


这里写图片描述

### 实施工程师相关面试问题及答案 #### 1. 拟化技术与容器技术的区别是什么?运维在部署和管理上需要注意什么? 拟化技术和容器技术的主要区别在于它们的隔离级别以及资源利用效率。拟化技术通过 Hypervisor 创建独立的操作系统实例,每个都有自己的 Guest OS 和硬件抽象层[^1]。而容器技术共享宿主的操作系统内核,仅隔离应用及其依赖项,因此更轻量化且启动速度更快。 对于拟化的部署和管理: - **注意资源配置**:合理分配 CPU、内存和存储等资源给各个 VM。 - **备份恢复计划**:定期创建快照以防止数据丢失。 - **性能优化**:监控性能指标,调整 QoS 设置提升整体效能。 而对于容器技术,则需关注以下方面: - **镜像版本控制**:确保所使用的 Docker 镜像是最新稳定版。 - **网络安全策略**:配置防火墙规则保护容器间通信安全。 - **日志管理和监控**:集成 ELK Stack 或 Prometheus 等工具跟踪容器运行状态。 --- #### 2. KVM 的工作原理是什么?如何判断一台物理服务器是否适合运行大量 KVM ? KVM(Kernel-based Virtual Machine)是一种基于 Linux 内核的全拟化解决方案,它将监视器功能整合到了标准 Linux 内核中。启用 VT-x/AMD-V 技术后,Guest OS 可直接访问底层硬件资源而不经过 Host OS 中介[^1]。 评估服务器承载能力可以从以下几个维度入手: - **CPU 支持情况**:检查处理器是否开启硬件辅助拟化特性。 - **可用内存总量**:预留足够的 RAM 来满足所有预期需求。 - **I/O 吞吐量表现**:硬盘读写速率直接影响拟桌面用户体验质量。 - **网络带宽供给**:保障每台能获得稳定的外部连接通道。 ```bash # 查看当前器是否支持 Intel VT 或 AMD-V 功能 egrep -c '(vmx|svm)' /proc/cpuinfo ``` 如果返回值大于零表示该设备兼容主流拟化平台。 --- #### 3. VMware ESXi 和 XenServer 主要特点对比分析? VMware ESXi 属于 Type-1 类型裸金属架构 hypervisor,以其高度成熟的企业级特性和稳定性著称。其特色如下: - 提供 vMotion 功能实现在线迁移无需停维护。 - 支持 Storage DRS 自动平衡集群内的 LUN 使用率。 - 拥抱广泛的第三方插件生态系统扩展功能性。 相比之下,Citrix XenServer 更加开放源码友好,并紧密绑定 Citrix 自家产品线如 NetScaler ADC 和 ShareFile 存储服务。它的亮点包括: - 原生支持 SR-IOV 加速直通 PCI 设备至特定 guest domain。 - 整合 HDX 协议传输协议降低延迟提高远程接入体验感。 - 免费社区版本即可覆盖大部分中小型企业日常运营场景。 尽管如此,两种方案均能满足大多数数据中心基础建设要求只是侧重点略有差异而已。 --- #### 4. Hyper-V 如何设置动态内存分配?此方法的优势在哪里? Microsoft Windows Server 平台上内置的 Hyper-V 角色允许管理员灵活定制参数其中包括启用了 Dynamic Memory 的选项。具体步骤如下: 1. 打开 Hyper-V Manager GUI 工具找到目标右键属性对话框进入“Memory”标签页。 2. 勾选 Enable Dynamic Memory 开关接着填写 Startup, Minimum 和 Maximum 数值范围单位为 MB。 3. 应用更改重启生效即完成配置过程。 采用这种方式的好处显而易见: - 提升物理主利用率减少闲置浪费现象发生频率。 - 当某时段某些负载较低时自动释放多余份额让渡给急需方使用从而达到全局最优解效果。 ```powershell # PowerShell 示例脚本批量修改现有动态内存设定 Get-VM | Set-VMMemory -DynamicMemoryEnabled $true -StartupBytes 2GB -MinimumBytes 512MB -MaximumBytes 4GB ``` --- #### 5. OpenStack Nova 组件负责哪部分业务逻辑?实际项目里怎样调试 nova-compute 服务异常? OpenStack 计算模块 Nova 构建了一个分布式云基础设施框架其中核心职责便是调度并管理计算节点上的生命周期事件链路[^3]。典型流程涵盖从初始化 instance 请求直至最终销毁回收整个闭环周期。 针对 nova-compute 日常排查任务建议按照下面思路展开调查行动路线图: - **查阅日志记录**:定位 `/var/log/nova/compute.log` 文件寻找报错关键词线索。 - **验证消息队列连通性**:确认 RabbitMQ/RPC Broker 正常运作能够成功传递指令包。 - **检测驱动加载状况**:依据不同 libvirt/kvm/hyperv backend 情况单独检验对应库函数引入环节是否有缺失冲突等问题存在。 ```bash # 显示最近一段时间内 nova compute service 状态变更历史轨迹 nova service-list --host <hostname> --binary nova-compute ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值