在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. 常用LaTeX随时更

    连乘 \prod_{i=1}^n \[\prod_{i=1}^n\] 分数 \frac{a}{b} \[\frac{a}{b}\] 组合数 \tbinom{n}{r}=\tbinom{n}{n-r}= ...

  2. zabbix 自动发现端口并添加监控设置

    自动发现端口并添加监控设置UserParameter=net.listen.discovery,sudo /etc/zabbix/scripts/discovery_listport.sh #!/bi ...

  3. [CF438D]The Child and Sequence【线段树】

    题目大意 区间取模,区间求和,单点修改. 分析 其实算是一道蛮简单的水题. 首先线段树非常好解决后两个操作,重点在于如何解决区间取模的操作. 一开始想到的是暴力单点修改,但是复杂度就飙到了\(mnlo ...

  4. 新建WINDOWS服务C#

    当前作业环境 Windows8.1 | Visual Studio 2013 一. 建立项目,选择"Windows服务"模板 二. 查看生成的项目,结构很像WinForm的项目,其 ...

  5. CodeVS1288埃及分数(IDA*)

    在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的. 对于一个分数a/b,表示方法有很多种,但 ...

  6. hex文件格式

    hex文件格式是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式有很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex.   Hex文件格式解析 Hex文件如果用特殊的程 ...

  7. Markdown基础(内含:锚点使用,使用HTML,新页面跳转,目录生成)

    Github样式显示参考:点我 之前说过用word写文章,这次说说Markdown写文章(推荐) 逆天推荐使用VSCode编写 装这个插件写作更方便: 内含:锚点使用,使用HTML,新页面跳转,目录生 ...

  8. 在android模拟器上http 链接的图片地址可能不会显示

    AndroidStudio将targetSDK升为28后,http请求会无反应.Google表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求 ...

  9. SecureCRT或XShell软件

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. Xshell 是一个强大的安全终端模拟软件,它支持SSH1 ...

  10. 第一篇 - bsp抓取python中文开发者社区中的所有高级教程

    工具:python3.6  pycharm 库:bs4 + urllib 第一步:读取html源码 from bs4 import BeautifulSoup import urllib.reques ...