在openstack中,消息的传递一共有两种方式,分别是:服务之间的传递调用Restful api,服务中模块之间的传递使用消息队列。每一个模块在启动是都会启动消息队列,等待队列中的有消息到来。所以模块的启动是openstack运行起来最早做的工作。以nova-compute模块为例,说明该服务模块是如何启动并运行的。

nova的架构设计图如下:

aaarticlea/png;base64,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" alt="" />

nova启动时使用service命令,如下图:

service命令实际上是调用/etc/init.d/nova-compute来实现的。在/etc/init.d/文件下有一个nova-compute脚本,负责nova-compute的启动,停止,状态查询等。

/etc/init.d/nova-compute脚本的执行是通过/etc/init/nova-compute.conf中的配置项来完成的,下面看看nova-compute.conf文件中的内容。

/etc/init/nova-compute.conf

 #!/bin/sh
### BEGIN INIT INFO
# Provides: nova-compute
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Should-Start: libvirt-bin postgresql mysql keystone rabbitmq-server ntp neutron-ovs-cleanup
# Should-Stop: libvirt-bin postgresql mysql keystone rabbitmq-server ntp
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Nova Compute server
# Description: Provides compute server resources for the
# OpenStack cloud computing system
### END INIT INFO # Author: Julien Danjou <acid@debian.org> # PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenStack Compute"
PROJECT_NAME=nova
NAME=${PROJECT_NAME}-compute
DAEMON_ARGS=""
if [ -f '/etc/nova/nova-compute.conf' ] ; then
DAEMON_ARGS="--config-file=/etc/nova/nova-compute.conf"
fi #!/bin/sh
# The content after this line comes from openstack-pkg-tools
# and has been automatically added to a .init.in script, which
# contains only the descriptive part for the daemon. Everything
# else is standardized as a single unique script. # Author: Thomas Goirand <zigo@debian.org> # PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin if [ -z "${DAEMON}" ] ; then
DAEMON=/usr/bin/${NAME}
fi
PIDFILE=/var/run/${PROJECT_NAME}/${NAME}.pid
if [ -z "${SCRIPTNAME}" ] ; then
SCRIPTNAME=/etc/init.d/${NAME}
fi
if [ -z "${SYSTEM_USER}" ] ; then
SYSTEM_USER=${PROJECT_NAME}
fi
if [ -z "${SYSTEM_GROUP}" ] ; then
SYSTEM_GROUP=${PROJECT_NAME}
fi
if [ "${SYSTEM_USER}" != "root" ] ; then
STARTDAEMON_CHUID="--chuid ${SYSTEM_USER}:${SYSTEM_GROUP}"
fi
if [ -z "${CONFIG_FILE}" ] ; then
CONFIG_FILE=/etc/${PROJECT_NAME}/${PROJECT_NAME}.conf
fi
LOGFILE=/var/log/${PROJECT_NAME}/${NAME}.log
if [ -z "${NO_OPENSTACK_CONFIG_FILE_DAEMON_ARG}" ] ; then
DAEMON_ARGS="--config-file=${CONFIG_FILE} ${DAEMON_ARGS}"
fi # Exit if the package is not installed
[ -x $DAEMON ] || exit 0 # If ran as root, create /var/lock/X, /var/run/X, /var/lib/X and /var/log/X as needed
if [ `whoami` = "root" ] ; then
for i in lock run lib ; do
mkdir -p /var/$i/${PROJECT_NAME}
chown ${SYSTEM_USER}:${SYSTEM_GROUP} /var/$i/${PROJECT_NAME}
done
for i in log ; do
mkdir -p /var/$i/${PROJECT_NAME}
chown ${SYSTEM_USER}:adm /var/$i/${PROJECT_NAME}
done
fi # This defines init_is_upstart which we use later on (+ more...)
. /lib/lsb/init-functions # Manage log options: logfile and/or syslog, depending on user's choosing
[ -r /etc/default/openstack ] && . /etc/default/openstack
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
[ "x$USE_SYSLOG" = "xyes" ] && DAEMON_ARGS="$DAEMON_ARGS --use-syslog"
if [ -z "${NO_OPENSTACK_LOGFILE_DAEMON_ARG}" ] ; then
[ "x$USE_LOGFILE" != "xno" ] && DAEMON_ARGS="$DAEMON_ARGS --log-file=$LOGFILE"
fi do_start() {
start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --chdir /var/lib/${PROJECT_NAME} --startas $DAEMON \
--test > /dev/null || return 1
start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --chdir /var/lib/${PROJECT_NAME} --startas $DAEMON \
-- $DAEMON_ARGS || return 2
} do_stop() {
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
RETVAL=$?
rm -f $PIDFILE
return "$RETVAL"
} do_systemd_start() {
exec $DAEMON $DAEMON_ARGS
} case "$1" in
start)
init_is_upstart > /dev/null 2>&1 && exit 1
log_daemon_msg "Starting $DESC" "$NAME"
do_start
case $? in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
init_is_upstart > /dev/null 2>&1 && exit 0
log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case $? in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
systemd-start)
do_systemd_start
;;
restart|force-reload)
init_is_upstart > /dev/null 2>&1 && exit 1
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case $? in
0|1)
do_start
case $? in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*) log_end_msg 1 ;; # Failed to stop
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|systemd-start}" >&2
exit 3
;;
esac exit 0

/etc/init/nova-compute.conf

 # vim: set ft=upstart et ts=2:
description "Nova compute worker"
author "Soren Hansen <soren@linux2go.dk>" start on runlevel [2345]
stop on runlevel [!2345] chdir /var/run env MAX_STATUS_CHECK_RETRIES=20 pre-start script
mkdir -p /var/run/nova
chown nova:root /var/run/nova/ mkdir -p /var/lock/nova
chown nova:root /var/lock/nova/ # Only try to modprobe if not running within a container
if [ ! -f /run/container_type ]; then
modprobe nbd
fi # If libvirt-bin is installed, always wait for it to start first
if status libvirt-bin; then
start wait-for-state WAIT_FOR=libvirt-bin WAIT_STATE=running WAITER=nova-compute
fi # If installed, wait for neutron-ovs-cleanup to complete prior to starting
# nova-compute.
if status neutron-ovs-cleanup; then
# See LP #1471022 for explanation of why we do like this
retries=$MAX_STATUS_CHECK_RETRIES
delay=1
while true; do
# Already running?
s=`status neutron-ovs-cleanup`
echo $s
`echo $s| grep -qE "\sstart/running"` && break
if retries=`expr $retries - 1`; then
# Give it a push
echo "Attempting to start neutron-ovs-cleanup"
start neutron-ovs-cleanup || :
# Wait a bit to avoid hammering ovs-cleanup (which itself may be waiting
# on dependencies)
echo "Recheck neutron-ovs-cleanup status in ${delay}s"
sleep $delay
if _=`expr $retries % 2`; then
delay=`expr $delay + 2`
fi
else
echo "Max retries ($MAX_STATUS_CHECK_RETRIES) reached - no longer waiting for neutron-ovs-cleanup to start"
break
fi
done
fi
end script exec start-stop-daemon --start --chuid nova --exec /usr/bin/nova-compute -- --config-file=/etc/nova/nova.conf --config-file=/etc/nova/nova-compute.conf

其中最后一行代码是关键代码,这个脚本之所以能启动是执行了nova-compute的可执行脚本,位置在/usr/bin/nova-compute。

/usr/bin/nova-compute

 #!/usr/bin/python
# PBR Generated from u'console_scripts' import sys from nova.cmd.compute import main if __name__ == "__main__":
sys.exit(main())

该脚本导入了/nova/cmd/compute中的main函数来完成启动任务。

/nova/nova/cmd/compute

 # Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License. """Starter script for Nova Compute.""" import shlex
import sys import os_vif
from oslo_log import log as logging
from oslo_privsep import priv_context
from oslo_reports import guru_meditation_report as gmr from nova.cmd import common as cmd_common
from nova.conductor import rpcapi as conductor_rpcapi
import nova.conf
from nova import config
from nova import objects
from nova.objects import base as objects_base
from nova import service
from nova import utils
from nova import version CONF = nova.conf.CONF
LOG = logging.getLogger('nova.compute') def main():
config.parse_args(sys.argv)
logging.setup(CONF, 'nova')
priv_context.init(root_helper=shlex.split(utils.get_root_helper()))
utils.monkey_patch()
objects.register_all()
# Ensure os-vif objects are registered and plugins loaded
os_vif.initialize() gmr.TextGuruMeditation.setup_autorun(version) cmd_common.block_db_access('nova-compute')
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI() server = service.Service.create(binary='nova-compute',
topic=CONF.compute_topic)
service.serve(server)
service.wait()
 # Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
# Copyright 2012 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License. from oslo_log import log from nova.common import config
import nova.conf
from nova.db.sqlalchemy import api as sqlalchemy_api
from nova import rpc
from nova import version CONF = nova.conf.CONF def parse_args(argv, default_config_files=None, configure_db=True,
init_rpc=True):
log.register_options(CONF)
# We use the oslo.log default log levels which includes suds=INFO
# and add only the extra levels that Nova needs
if CONF.glance.debug:
extra_default_log_levels = ['glanceclient=DEBUG']
else:
extra_default_log_levels = ['glanceclient=WARN']
log.set_defaults(default_log_levels=log.get_default_log_levels() +
extra_default_log_levels)
rpc.set_defaults(control_exchange='nova')
config.set_middleware_defaults() CONF(argv[1:],
project='nova',
version=version.version_string(),
default_config_files=default_config_files) if init_rpc:
rpc.init(CONF) if configure_db:
sqlalchemy_api.configure(CONF)

/nova/nova/service.py

 class Service(service.Service):
"""Service object for binaries running on hosts. A service takes a manager and enables rpc by listening to queues based
on topic. It also periodically runs tasks on the manager and reports
its state to the database services table.
""" def __init__(self, host, binary, topic, manager, report_interval=None,
periodic_enable=None, periodic_fuzzy_delay=None,
periodic_interval_max=None, db_allowed=True,
*args, **kwargs):
super(Service, self).__init__()
self.host = host
self.binary = binary
self.topic = topic
self.manager_class_name = manager
self.servicegroup_api = servicegroup.API()
manager_class = importutils.import_class(self.manager_class_name)
self.manager = manager_class(host=self.host, *args, **kwargs)
self.rpcserver = None
self.report_interval = report_interval
self.periodic_enable = periodic_enable
self.periodic_fuzzy_delay = periodic_fuzzy_delay
self.periodic_interval_max = periodic_interval_max
self.saved_args, self.saved_kwargs = args, kwargs
self.backdoor_port = None
self.conductor_api = conductor.API(use_local=db_allowed)
self.conductor_api.wait_until_ready(context.get_admin_context())

/nova/nova/service.py

 @classmethod
def create(cls, host=None, binary=None, topic=None, manager=None,
report_interval=None, periodic_enable=None,
periodic_fuzzy_delay=None, periodic_interval_max=None,
db_allowed=True):
"""Instantiates class and passes back application object. :param host: defaults to CONF.host
:param binary: defaults to basename of executable
:param topic: defaults to bin_name - 'nova-' part
:param manager: defaults to CONF.<topic>_manager
:param report_interval: defaults to CONF.report_interval
:param periodic_enable: defaults to CONF.periodic_enable
:param periodic_fuzzy_delay: defaults to CONF.periodic_fuzzy_delay
:param periodic_interval_max: if set, the max time to wait between runs """
if not host:
host = CONF.host
if not binary:
binary = os.path.basename(sys.argv[0])
if not topic:
topic = binary.rpartition('nova-')[2]
if not manager:
manager_cls = ('%s_manager' %
binary.rpartition('nova-')[2])
manager = CONF.get(manager_cls, None)
if report_interval is None:
report_interval = CONF.report_interval
if periodic_enable is None:
periodic_enable = CONF.periodic_enable
if periodic_fuzzy_delay is None:
periodic_fuzzy_delay = CONF.periodic_fuzzy_delay debugger.init() service_obj = cls(host, binary, topic, manager,
report_interval=report_interval,
periodic_enable=periodic_enable,
periodic_fuzzy_delay=periodic_fuzzy_delay,
periodic_interval_max=periodic_interval_max,
db_allowed=db_allowed) return service_obj

/nova/nova/service.py

 def serve(server, workers=None):
global _launcher
if _launcher:
raise RuntimeError(_('serve() can only be called once')) _launcher = service.launch(CONF, server, workers=workers)

未完待续。。。。。

openstack服务启动之nova-compute的更多相关文章

  1. (原创)OpenStack服务如何使用Keystone(一)---Keystone端的操作

    (一)Keystone端的操作 (二)如何在OpenStack服务上部署Keystone中间件 (三)详细配置keystonemiddleware OpenStack项目如果要使用Keystone作为 ...

  2. openstack Q版部署-----nova服务配置-控制节点(5)

    一.创建数据库(控制节点) 创建数据库以及用户: CREATE DATABASE nova_api; CREATE DATABASE nova; CREATE DATABASE nova_cell0; ...

  3. Openstack 03 - Nova Compute

    1.前言 非常早之前就開始着手写Openstack 系列的博客了,在写了总体架构和Keystone之后,准备写Nova,可是每次写到一半,自己心里就认为不踏实,由于似乎我并没有真正理解Nova,或者说 ...

  4. S1_搭建分布式OpenStack集群_06 nova服务配置 (控制节点)

    一.创建数据库(控制节点)创建数据库以及用户:# mysql -uroot -p12345678MariaDB [(none)]> CREATE DATABASE nova_api;MariaD ...

  5. OpenStack 服务状态检查

    openstack服务不正常 使用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@node-5 TimaIaas]# nova- ...

  6. openstack安装newton版本Nova部署(三)

    一.控制节点安装部署Nova Nova 包含API(负责接收相应外部请求,支持OpenStackAPI,EC2API):cert:负责身份认证:schedule:用于云主机调度(虚拟机创建在哪台主机上 ...

  7. 在Openstack H版部署Nova Cell 时 ,终端输入nova service-list 和 nova host-list 命令将报错

    关于Cell的基本介绍,可以参考贤哥的一篇文章: [OpenStack]G版中关于Nova的Cell  http://blog.csdn.net/lynn_kong/article/details/8 ...

  8. OpenStack kilo版(3) Nova部署

    部署在controller和compute节点 配置数据库 MariaDB [(none)]> CREATE DATABASE nova;  Query OK, 1 row affected ( ...

  9. OpenStack 虚拟机启动流程 UML 分析(内含 UML 源码)

    目录 文章目录 目录 前言 API 请求 Nova API 阶段 Nova Conductor 阶段 Nova Scheduler 阶段 Nova Compute 阶段(计算节点资源分配部分) Nov ...

随机推荐

  1. day5 range 用法示例

    函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: ...

  2. 【UVALive - 6534 】Join two kingdoms (树的直径的期望)

    bupt spring training for 2015 #2nd J 题意 给两棵树,分别有 n,m 个节点(1 ≤ N, Q ≤ 4 × 10^4),等概率连接属于不同树的两个节点,求新树的直径 ...

  3. EasyFlash 的初始化配置

    @2019-02-18 [小记] EasyFlash的初始化流程 easyflash_init ---> ef_port_init ---> sfud_init ---> sfud_ ...

  4. 使用unittest单元测试框架对加法做单元测试

    import unittest from parameterized import parameterized def cacl(a, b): return a+b class MyCacl(unit ...

  5. 2017蓝桥杯 省赛D题(方格分割)

    6x6的方格,沿着格子的边线剪开成两部分.要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法.    试计算:包括这3种分法在内,一共有多少种不同的分割 ...

  6. 【Asia Yokohama Regional Contest 2018】Arithmetic Progressions

    题目大意:给定 N(1<N<=5000) 个不同元素组成的集合,求从中选出若干数字组成的等差数列最长是多少. 题解:直接暴力有 \(O(n^3)\) 的算法,即:枚举等差数列的前两个值,再 ...

  7. pyinstall实现不显示控制窗口

    做图形界面的时候,总会弹出一个cmd的黑框框,为了美观,通常希望将其隐藏. 查找资料得知:1.pythonw.exe .py不会出现(此方法没试过) 2.python.exe .pyw即将py文件的后 ...

  8. bash 5

    1)bash支持一维数组(不支持多维数组),并且没有限定数组的大小. 类似于 C 语言,数组元素的下标由 0 开始编号.获取数组中的元素要 利用下标,下标可以是整数或算术表达式,其值应大于或等于 0. ...

  9. 数位DP入门题

    站点一览: hdu 2089"不要62" hdu 4734"F(X)" poj 3252"Round Numbers" hdu 3709&q ...

  10. 计算机基础:计算机网络-chapter5 运输层

    一.运输层做什么事情,通过什么协议实现, 运输层做什么 为相互通信的应用提供逻辑通信 通过端口号来确定应用,提供端到端的服务: 为什么需要运输层,IP层不是就实现了传输数据吗 从IP层来说,是两台主机 ...