在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. Android stadio 生成项目 Plugin with id 'com.android.application' not found

    buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2. ...

  2. BSGS及扩展BSGS总结(BSGS,map)

    蒟蒻哪里有什么总结,只能点击%YL% 还有这位ZigZagK大佬的blog \(\mbox{BSGS}\) 模板题:洛谷P3846 [TJOI2007]可爱的质数 给定\(a,b\)和模数\(\mbo ...

  3. LA3490 Generator(KMP + 高斯消元)

    题意 一开始给你一个长为 \(S\) 的字符串. 从空串开始,不断在后面添加一个 \([A, A + n]\) 的一个字符. 第一次包含 \(S\) 的时候会停止添加.问期望的添加次数. 有 \(T\ ...

  4. [SDOI2010]大陆争霸

    幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增.作为克里斯军团的主帅,你决定利用这一机会发动奇袭,一举击败杰森国 ...

  5. This license xxx has been cancelled 解决

    上节回顾:JetBrains全家桶破解思路 hosts屏蔽一下即可,Linux是:/etc/hosts 0.0.0.0 account.jetbrains.com 重新输入Code即可,最后补一个地址 ...

  6. window 操作 快捷键

    win 下在当前目录下打开cmd命令窗口: 方法一: 在当前目录下,按下shift + 鼠标右键,会出现“在此处打开命令窗口”的字样,然后点击即可. 方法二: 在该文件夹上,按下shift + 鼠标右 ...

  7. Ubuntu下搜狗输入法无法输入中文

    现象:无法打出中文,但是有输入框.如下图所示情形: 解决方法 删除配置文件,重启fcitx 配置文件在~/.config下的3个文件夹里SogouPY.SogouPY.users.sogou-qimp ...

  8. python datetime 字符串 时间戳

    #把datetime转成字符串 def datetime_toString(dt): return dt.strftime("%Y-%m-%d-%H") #把字符串转成dateti ...

  9. 4.1、实现4个LED灯同时闪烁

    图中可以看出,P1的0.1.3.4引脚分别连接着4个LED.控制引脚状态,来控制LED. #include "ioCC2530.h" //引用CC2530头文件 /******** ...

  10. vmstat命令详解

    一:简介 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个 ...