服务架构
Stx 3.0的补丁相关服务主要包含以下几个:
sw-patch-controller-daemon
:控制服务,主要包含三个线程:api-thread
是提供RestAPI供外部访问;auth-api-thread
主要提供用户权限校验;main-thread
处理patch和host的业务逻辑,负责与patch-agent通信。各线程都访问全局变量pa:PatchController。控制服务运行在控制节点。patch-agent
:agent服务,主要负责与控制节点的main-thread通信,负责查询本机rpm状态、安装rpm包等操作。agent服务在所有节点都存在。patch-alarm-manager
:负责补丁相关的告警的产生和消除,通过各服务的RestAPI周期查询补丁状态和告警列表,通过比较来set和clear告警。
操作流程
如上图所示,使用sw-patch命令或者portal页面可以对补丁做以上6种操作,每一步操作完成之后,补丁的状态和主机的状态可以参考图中内容。具体sw-patch命令如下:
upload补丁:
sw-patch upload TC_19.12_PATCH_TEST.patch
apply补丁:
sw-patch apply TC_19.12_PATCH_TEST
查看补丁列表和状态:
sw-patch query
查看主机列表和状态:
sw-patch query-hosts
指定节点安装补丁:
sw-patch host-install compute-0
remove补丁:
sw-patch remove TC_19.12_PATCH_TEST
delete补丁:
sw-patch delete TC_19.12_PATCH_TEST
commit补丁:
sw-patch commit TC_19.12_PATCH_TEST
commit操作可以删除相关补丁中版本低的rpm包,节省磁盘空间,但commit操作是不可逆的,一般使用得较少
补丁结构
可以使用命令解压补丁
tar -xzvf TC_19.12_PATCH_0003.patch
- metadata.xml中记录了补丁的基本信息,包括补丁ID、状态、说明、内容等信息
- software.tar包含补丁的rpm包
- semantics.tar存放在apply前或者remove前需要执行的脚本,目前没有用到
- signature是补丁签名,是最原始的签名方式
- signature.v2是第二代补丁签名,R5和stx中有,R4中没有
上传补丁
上传补丁的流程:
- 执行
sw-patch upload TC_19.12_PATCH_TEST.patch
命令上传补丁,是调用patch_client代码的patch_upload_req()
方法,发送一个RestAPI请求给patch-controller。 - 响应上传补丁接口的是PatchAPIController控制器的
upload()
方法。 upload()
将补丁文件完整的保存在/scratch/
目录下。- 调用全局变量pa:PatchController的
patch_import_api()
解析补丁内容,如果补丁ID已存在就只更新补丁的metadata,如果补丁ID不存在就全部解析。 patch_import_api()
调用PatchFile的extract_patch()
方法提取补丁。extract_patch()
先调用read_patch()
方法把补丁解压到/tmp/patch_xxxxxx
目录下read_patch()
方法使用文件md5值校验第一版签名,然后调用patch_verify的verify_files()
方法校验第二版签名;extract_patch()
解析补丁信息,比对补丁内rpm包与基础库rpm包版本号,如果版本号小于或等于基础库版本号,抛异常;比对补丁内rpm包与升级库rpm包,如果该rpm包在以前的任何补丁中存在,抛异常;extract_patch()
归档补丁文件,将metadata.xml
文件归档到/opt/patching/metadata/available
目录,将rpm包归档到/opt/patching/packages/{SW_VERSION}
目录。extract_patch()
返回当前补丁信息- 更新PatchController的patch_data,更新/新增upload的补丁信息。
patch_import_api()
返回提示信息upload()
调用pa:PatchController的patch_sync()方法同步
参考资料
社区源代码仓库:https://opendev.org/starlingx/update
smart代码仓库:https://github.com/smartpm/smart