解决sysrepo无法启动问题 [ERR] Module “yang“ was not found in sysrepo.

[ERR] Module “yang” was not found in sysrepo.

问题表现

出现问题时,命令输出如下。

sysrepoctl -l 提示 yang 模块不存在

$ sysrepoctl -l
[ERR] Module "yang" was not found in sysrepo.
sysrepoctl error: Failed to list modules (Item not found)
For more details you may try to increase the verbosity up to "-v3".

同时无法安装 netopeer2

netopeer2/build$ sudo make install
...
-- Installing missing sysrepo modules...
[ERR] Internal error (/home/focksor/workSpace/sysrepo/src/context_change.c:509).
sysrepoctl error: Failed to install modules (Internal error)
For more details you may try to increase the verbosity up to "-v3".
CMake Error at cmake_install.cmake:127 (message):
   scripts/setup.sh failed: 1


make: *** [Makefile:110: install] Error 1

问题原因分析

跟踪命令过程,如下:

$ gdb --args sysrepoctl -l
(gdb) br sr_errinfo_new
Function "sr_errinfo_new" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (sr_errinfo_new) pending.
(gdb) start
(gdb) c
Continuing.

Breakpoint 1, sr_errinfo_new (err_info=0x7fffffffd458, err_code=SR_ERR_NOT_FOUND, msg_format=0x7ffff7f89400 "Module \"%s\" was not found in sysrepo.") at /home/focksor/workSpace/sysrepo/src/log.c:219
219     {
(gdb) bt
#0  sr_errinfo_new (err_info=0x7fffffffd458, err_code=SR_ERR_NOT_FOUND, msg_format=0x7ffff7f89400 "Module \"%s\" was not found in sysrepo.")
    at /home/focksor/workSpace/sysrepo/src/log.c:219
#1  0x00007ffff7f1f8d2 in sr_get_module_replay_support (conn=0x55555555d380, module_name=0x555555565e80 "yang", earliest_notif=0x0, enabled=0x7fffffffd4b0)
    at /home/focksor/workSpace/sysrepo/src/sysrepo.c:1995
#2  0x000055555555709d in srctl_list_collect (conn=0x55555555d380, ly_ctx=0x55555555d7f0, list=0x7fffffffd558, list_count=0x7fffffffd560)
    at /home/focksor/workSpace/sysrepo/src/executables/sysrepoctl.c:351
#3  0x000055555555746f in srctl_list (conn=0x55555555d380) at /home/focksor/workSpace/sysrepo/src/executables/sysrepoctl.c:440
#4  0x000055555555890c in main (argc=2, argv=0x7fffffffda48) at /home/focksor/workSpace/sysrepo/src/executables/sysrepoctl.c:907

可以看到这是在共享内存中没检索到 “yang” 模块。检查一下内存模块:

(gdb) p *((sr_mod_shm_t *)(conn)->mod_shm.addr)
$1 = {mod_count = 0}

模块数量为 0,那就是没有加载任何模块到共享内存中。

检查值 mod_count 的引用位置,可以看到其主要在 sr_shmmod_store_modules 处写入,而这个函数的作用正是往 shm 中存储模块。

检查 sr_shmmod_store_modules 调用,可以看到上述命令执行过程中,命中的路径在 sr_connect 处。该函数先是通过 sr_shmmain_open 尝试打开 shm,如果 shm 不存在则创建,然后初始化模块。

检查共享内存,可以看到 shm 已创建,删除后重新执行命令测试:

$ ls /dev/shm/
sr_ext  sr_main  sr_mod
$ sudo rm /dev/shm/sr_*
$ sysrepoctl -l
Segmentation fault (core dumped)

发生了 coredump,进 gdb 检查一下:

$ gdb --args sysrepoctl -l
(gdb) start
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7f1ab3c in sr_connect (opts=0, conn_p=0x7fffffffd5e8) at /home/focksor/workSpace/sysrepo/src/sysrepo.c:256
256             assert(!strcmp(LYD_NAME(lyd_child(sr_mods)), "content-id"));
(gdb) p sr_mods
$1 = (struct lyd_node *) 0x0

可以看到是访问了空指针导致的。跟踪该变量 sr_mods 的使用,可以看到是在 sr_lydmods_parse 处初始化的。分析此函数逻辑,大致如下:

  1. 如果 startup db 文件存在,则尝试从 db 文件加载数据
  2. 否则,重新初始化 db

通过跟踪该函数的执行,可以看到其进入了路径 1:

(gdb) s
1067        if (srpjson_get_path(NULL, ly_mod->name, SR_DS_STARTUP, &path)) {
(gdb) s
srpjson_get_path (plg_name=0x0, mod_name=0x5555555b1320 "sysrepo", ds=SR_DS_STARTUP, path=0x7fffffffd508) at /home/focksor/workSpace/sysrepo/src/plugins/common_json.c:617
617     {
(gdb) fini
Run till exit from #0  srpjson_get_path (plg_name=0x0, mod_name=0x5555555b1320 "sysrepo", ds=SR_DS_STARTUP, path=0x7fffffffd508)
    at /home/focksor/workSpace/sysrepo/src/plugins/common_json.c:617
sr_lydmods_parse (ly_ctx=0x55555558a5c0, initialized=0x7fffffffd544, sr_mods_p=0x7fffffffd560) at /home/focksor/workSpace/sysrepo/src/lyd_mods.c:1067
1067        if (srpjson_get_path(NULL, ly_mod->name, SR_DS_STARTUP, &path)) {
Value returned is $7 = 0
(gdb) p path
$8 = 0x5555555736d0 "/home/focksor/workSpace/sysrepo/build/repository/data/sysrepo.startup"

检查文件 repository/data/sysrepo.startup,其内容为空,推测是在某次初始化的时候失败导致产生了空白的数据,删除整个文件夹后,数据访问正常。

解决方法

该问题的解决方法如下:

  1. 删除 sysrepo 共享内存
  2. 删除 sysrepo 数据仓库(默认配置是在 build 下)

解决问题的指令如下:

$ sudo rm /dev/shm/sr_*
build$ rm -rf repository/

验证:执行 sysrepoctl -l 正常

$ sysrepoctl -l
Sysrepo repository: /home/focksor/workSpace/sysrepo/build/repository

Module Name                | Revision   | Flags | Owner           | Startup Perms | Submodules | Features                 
--------------------------------------------------------------------------------------------------------------------------
ietf-datastores            | 2018-02-14 | I     | focksor:focksor | 444           |            |                          
ietf-factory-default       | 2020-08-31 | I     | focksor:focksor | 600           |            | factory-default-datastore
ietf-inet-types            | 2013-07-15 | i     |                 |               |            |                          
ietf-netconf               | 2013-09-29 | I     | focksor:focksor | 644           |            |                          
ietf-netconf-acm           | 2018-02-14 | I     | focksor:focksor | 600           |            |                          
ietf-netconf-notifications | 2012-02-06 | I     | focksor:focksor | 644           |            |                          
ietf-netconf-with-defaults | 2011-06-01 | I     | focksor:focksor | 444           |            |                          
ietf-origin                | 2018-02-14 | I     | focksor:focksor | 444           |            |                          
ietf-yang-library          | 2019-01-04 | I     | focksor:focksor | 644           |            |                          
ietf-yang-metadata         | 2016-08-05 | i     |                 |               |            |                          
ietf-yang-schema-mount     | 2019-01-14 | I     | focksor:focksor | 644           |            |                          
ietf-yang-structure-ext    | 2020-06-17 | i     |                 |               |            |                          
ietf-yang-types            | 2013-07-15 | i     |                 |               |            |                          
sysrepo-factory-default    | 2023-02-23 | I     | focksor:focksor | 600           |            |                          
sysrepo-monitoring         | 2022-08-19 | I     | focksor:focksor | 600           |            |                          
sysrepo-plugind            | 2022-08-26 | I     | focksor:focksor | 644           |            |                          
yang                       | 2022-06-16 | I     | focksor:focksor | 444           |            |                          

Flags meaning: I - Installed/i - Imported; R - Replay support

你可能感兴趣的:(解决sysrepo无法启动问题 [ERR] Module “yang“ was not found in sysrepo.)