nova-compute启动分析之一

本文详细介绍了nova-compute服务的启动过程,包括设置flagfile、初始化日志、创建服务对象、启动服务并等待请求。重点讲解了Service.create()方法,如何动态加载manager和虚拟化驱动,并分析了start()方法中初始化资源、建立RPC连接和设置循环任务等关键步骤。通过这些步骤,理解nova-compute如何准备环境并监听消息队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. python启动脚本 bin/nova-compute
python启动脚本 bin/nova-compute

 

[html] view plaincopyprint?
  1. utils.default_flagfile()  #设置flag文件路径. 
  2. flags.FLAGS(sys.argv)   #把flag文件中的参数放到args中。 
  3. logging.setup()           #设置日志 
  4. utils.monkey_patch() 
  5. server = service.Service.create(binary='nova-compute') #创建服务 
  6. service.serve(server)  #启动服务 
  7. service.wait()             #等待请求 
    utils.default_flagfile()  #设置flag文件路径.
    flags.FLAGS(sys.argv)   #把flag文件中的参数放到args中。
    logging.setup()           #设置日志
    utils.monkey_patch()
    server = service.Service.create(binary='nova-compute') #创建服务
    service.serve(server)  #启动服务
    service.wait()             #等待请求

 

 

 

下面我讲按6大步进行讲述:

第一步:utils.default_flagfile()

[html] view plaincopyprint?
  1. if args is None: 
  2.      args = sys.argv 
  3. for arg in args: 
  4.      if arg.find('flagfile') != -1: 
  5.          break 
  6. else: 
  7.      if not os.path.isabs(filename): 
  8.          # turn relative filename into an absolute path 
  9.          script_dir = os.path.dirname(inspect.stack()[-1][1]) 
  10.          filename = os.path.abspath(os.path.join(script_dir, filename)) 
  11.      if not os.path.exists(filename): 
  12.          filename = "./nova.conf" 
  13.          if not os.path.exists(filename): 
  14.              filename = '/etc/nova/nova.conf' 
  15.      flagfile = '--flagfile=%s' % filename 
  16.      args.insert(1, flagfile) 
  17.   其实所完成的功能也就是把--flagfile=/etc/nova/nova.conf加到入参数列表中。 
   if args is None:
        args = sys.argv
    for arg in args:
        if arg.find('flagfile') != -1:
            break
    else:
        if not os.path.isabs(filename):
            # turn relative filename into an absolute path
            script_dir = os.path.dirname(inspect.stack()[-1][1])
            filename = os.path.abspath(os.path.join(script_dir, filename))
        if not os.path.exists(filename):
            filename = "./nova.conf"
            if not os.path.exists(filename):
                filename = '/etc/nova/nova.conf'
        flagfile = '--flagfile=%s' % filename
        args.insert(1, flagfile)
     其实所完成的功能也就是把--flagfile=/etc/nova/nova.conf加到入参数列表中。



第二步:flags.FLAGS(sys.argv)

  flags.py中有一句
  FLAGS = FlagValues(),那么直接查看FlagValues()这个类,这个类是继承于gflags.FlagValues.



第三步:logging.setup()

这个是对这个服务开启日志功能。




第四步:server = service.Service.create(binary='nova-compute')

这个函数位于/nova/service.py: 类Service中

[html] view plaincopyprint?
  1. class Service(object): 
  2.     """Service object for binaries running on hosts. 
  3.     A service takes a manager and enables rpc by listening to queues based 
  4.     on topic. It also periodically runs tasks on the manager and reports 
  5.     it state to the database services table.""" 
  6. 函数定义如下: 
  7.    @classmethod  
  8.     def create(cls, host=None,binary=None,topic=None,manager=None
  9.                report_interval=None,periodic_interval=None): 
  10.         """Instantiates class and passes back application object. 
  11.  
  12.         :param host: defaults to FLAGS.host 
  13.         :param binary: defaults to basename of executable 
  14.         :param topic: defaults to bin_name - 'nova-' part 
  15.         :param manager: defaults to FLAGS.<topic>_manager 
  16.         :param report_interval: defaults to FLAGS.report_interval 
  17.         :param periodic_interval: defaults to FLAGS.periodic_interval 
  18.  
  19.         """ 
  20.         if not host: 
  21.             host = FLAGS.host #host name  ‘nova’ 
  22.         if not binary: 
  23.             binary = os.path.basename(inspect.stack()[-1][1]) # 这是因为python可以查看动栈的内容。 
  24.       &nbs
### 虚拟机启动失败原因分析 当遇到 `libvirt.libvirtError: Path '/dev/vfio/182' is not accessible: No such file or directory` 错误时,这通常表明虚拟机尝试通过 VFIO(Virtual Function I/O)访问指定设备路径 `/dev/vfio/182` 时未能成功找到该文件或目录。以下是可能的解决方案: #### 权限配置问题 确保主机上的 VFIO 设备具有正确的权限设置。如果权限不足可能导致路径不可访问的情况发生。可以尝试调整相关目录的权限以验证是否存在此问题: ```bash chmod -R 777 /dev/vfio/ ``` 上述命令会赋予 `/dev/vfio/` 及其子目录完全读写执行权限[^3]。 #### 验证VFIO模块加载状态 确认内核是否已正确加载 VFIO 模块以及对应的 PCI 设备驱动程序绑定情况。运行以下命令来检查必要模块的存在与否并手动加载缺失部分: ```bash lsmod | grep vfio modprobe vfio-pci dmesg | tail ``` #### 文件系统挂载与SELinux策略冲突排查 有时 SELinux 安全上下文可能会阻止某些操作完成。临时关闭 SELinux 测试效果如何可以帮助判断是否有这方面的影响因素存在: ```bash setenforce 0 ``` 另外还需要注意的是,对于特定存储位置如 `/mnt/westos.qcow2`, 移动到默认镜像库路径下也可能有助于避免潜在错误触发: ```bash mv /mnt/westos.qcow2 /var/lib/libvirt/images/ ``` 此处涉及到了将磁盘映射文件迁移至标准区域的操作建议[^1]。 #### XML定义文件校正 重新审视对应虚拟机实例所使用的XML描述文档内容准确性至关重要。特别是涉及到硬件资源分配的部分参数设定需精确无误。例如之前提到过的案例里有提及过把测试环境下的配置迁移到其他地方保存前后的注意事项[^2]: ```xml <domain type='kvm'> ... </domain> ``` #### 使用qemu-monitor-command进一步诊断内存气球状况 最后还可以借助 qemu 的监控接口获取更多实时动态数据辅助定位根本症结所在之处。比如查询当前 ballooning 实际数值等信息作为参考依据之一[^4]: ```bash virsh qemu-monitor-command DOMAIN_NAME --hmp "info balloon" ``` 以上是从不同角度出发针对此类问题提出的几种常见处理办法汇总介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值