[关闭]
@wenshizhang 2016-10-10T10:51:53.000000Z 字数 4764 阅读 467

suse实习——hb_report源码分析

suse实习 周报 shell crmsh hb_report


前面大概分析了crmsh的源码,后面我的工作就是把crmsh中的hb_report改称用python实现,现在使用的hb_report是用shell实现的,很有挑战性,因为bash和python都不熟悉。

为什么要再用python重写一遍

这个问题,我刚开始也很迷惑。因为目前hb_report可以完成期待的工作。而且hb_report并不是任何一个产品的feature。我去问crmsh的作者,他具体说了三点:
* 为了减少产生bug的风险,crmsh和hb_report工作起来有点类似(因为都是去读集群的状态吗?)
* 目前的hb_report结构杂乱无章,可能因为不停的打patch然后导致的,也会出现一些新的bug,如果使用更加结构话的语言实现更方便调试
* 用python重写方便未来添加一些新的feature

什么是 hb_report

根据man手册,hb_report是一个Pacemaker或者Heartbeat错误报告工具。它负责收集指定时间内集群相关的信息(包括日志、集群配置文件和系统信息等和),然后压缩成bz2和tar压缩包(也可以选择不压缩)。当集群中的某些节点以某些不知名错误被fence,这个工具可以用来收集出错时刻节点的信息。
其他的详细的信息参见传送门:hb_report man手册


hb_report调试和执行逻辑

为了更好的理解hb_report的执行逻辑,调试了hb_report,调试真的是一个很好用的工具,代码运行起来更容易理解了。

hb_report调试

crmsh是用python实现,调试器使用pdb,使用命令和gdb差不多吧。

启动pdb调试器

  1. python -m pdb *.py

pdb调试器详细用法及命令参见传送门:pdb官方手册

hb_report调试

打开man手册得到hb_report的用法,hb_report -f 3:00 -t 4:00 -n "node1 node2 node3" report表示收集从3:00开始到4:00,node1、node2和node3上的infomation,并命名为report存储在当前工作目录。
打印出当前系统环境变量的PATH变量,然后找到hb_report可执行文件的路径。

  1. # echo $PATH
  2. >>>/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
  3. # find / -name hb_report
  4. >>>/usr/share/crmsh/hb_report
  5. >>>/usr/share/crmsh/hb_report/hb_report
  6. >>>/usr/sbin/hb_report
  7. >>>/usr/src/crmsh/hb_report

这样就得到了hb_report的入口在/usr/sbin/hb_report,并且该文件是用shell实现的,先打开bash调试参数,输出脚本的执行过程。

  1. # bash -x /usr/sbin/hb_report -f 3:00 -t 4:00 -n "node1 node2 node3" report
  2. >>>++ ps -o comm= 6091
  3. >>>+ PARENT_COMMAND=bash
  4. ...
  5. >>>+ crm report -f 3:00 -t 4:00 -n 'shiwen1 shiwen2 ' report

最后一行表示hb_report实际上就是crm report,而且crm是用python实现的,bash不能调试这部分。
使用find命令找到crm的路径

  1. find / -name crm
  2. >>>/usr/sbin/crm
  3. >>>/usr/src/crmsh/crm
  4. >>>/var/cache/crm
  5. >>>/etc/crm
  6. >>>/run/crm

得到crm的路径是/usr/sbin/crm,启动pdb调试器。

  1. python -m pdb /usr/sbin/crm report -f 3:00 -t 4:00 -n "node1 node2 node3" report

crm的执行流程参见传送门:crmsh阅读笔记, 此处不再赘述。在前面crm分析中提到,crm每一个命令的实现使用command_info.function方法封装,report命令的command_info.function创建子进程执行/usr/share/crmsh/hb_report/hb_report,父进程等待子进程退出。
/usr/share/crmsh/hb_report/目录下的文件就是hb_report的源码实现,用shell实现。调试这个shell脚本。

  1. bash -x /usr/share/crmsh/hb_report/hb_report -f 3:00 -t 4:00 -n "node1 node2 node3" report

hb_report执行流程(一部分)

hb_report模块详细分析

现在是2016年09月28日14:51分,hb_report源码第一遍大概读完了,值得纪念一下。

hb_report目录下有四个脚本,hb_report脚本、utillib.sh脚本、ha_cf_support.sh脚本和openais_conf_support.sh脚本,都是shell实现。其中hb_report脚本是入口脚本,他负责整个hb_report的逻辑调用,其他脚本都是各种各样的函数实现。

hb_report 脚本

前面说了,hb_report是入口脚本,负责hb_report的全部逻辑。这个脚本中也实现了一些函数,下面是实现的大部分函数的分析。

start_collect_info函数实现

findsshuser函数实现

getlog函数实现

compatibility_pcmk实现

is_collocter

ha_cf_support 脚本

openais_conf_support 脚本

utillib 脚本

utillib.sh脚本中没有可以直接执行的语句,全部是函数的实现。下面是函数的具体解释。

get_cluster_type实现

findlogdcf实现

init_tmpfiles实现

debug实现

其他模块

做一些环境初始化的工作,比如先测试相关的命令,相关函数是否存在,配置文件是否存在等等。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注