学习OpenStack有半年多了,一直都停留在使用和trouble shooting的阶段,最近有时间来好好研究了一下代码,因为以前是C++/Windows出生的,所以对Linux下面的Python开发不是很熟悉,本文适合一些已经使用过OpenStack并且想要初步了解代码工作原理的朋友,如果有什么不对的地方欢迎指正
这里分析的是Nova-Compute服务的开启过程,其他服务如Nova-Scheduler, Nova-Conductor等的启动过程类似(代码是基于GitHub上nova的icehouse版本的)
首先,当我们安装完OpenStack的Nova-Compute组件后,通常我们会通过下面两条命令来启动服务:
service nova-compute start
start nova-compute
这两条命令实际上是调用了upstart-job脚本来启动nova-compute服务的
首先我们可以在/etc/init/nova-compute.conf文件中看到下面的shell启动脚本
chdir /var/run
pre-start script
mkdir -p /var/run/nova
chown root:root /var/run/nova/
mkdir -p /var/lock/nova
chown root:root /var/lock/nova/
modprobe nbd
end script
exec start-stop-daemon --start --chuid root --exec /usr/local/bin/nova-compute -- --config-file=/etc/nova/nova.conf --config-file=/etc/nova/nova-compute.conf
前面几条可以不用管,就是修改一些权限之类的,最后一句exec start-stop-deamon脚本真正的用来启动/usr/local/bin/nova-compute服务,后面带的--config参数相信童鞋们都很熟悉了,就是nova-compute服务的两个配置文件,这在后面的代码中会用到来初始化配置
接下来可以找到/usr/local/bin/nova-compute文件
import sys
from nova.cmd.compute import main
if __name__ == "__main__":
sys.exit(main())
这里有点像C++的main函数启动过程,调用了nova.cmd.compute的main方法
def main():
config.parse_args(sys.argv)
logging.setup('nova')
utils.monkey_patch()
objects.register_all()
gmr.TextGuruMeditation.setup_autorun(version)
if not CONF.conductor.use_local:
block_db_access()
objects_base.NovaObject.indirection_api = \
conductor_rpcapi.ConductorAPI()
server = service.Service.create(binary='nova-compute',
topic=CONF.compute_topic,