FAQ

本文主要提供 Baetyl 在各系统、平台部署、启动的相关问题及解决方案。

问题 1: 在以容器模式启动 Baetyl 时,提示缺少启动依赖配置文件

_images/docker-engine-conf-miss.png图片

参考方案: 如上图所示,Baetyl 启动缺少配置依赖文件,参考 GitHub-Baetyl example 文件夹补充相应配置文件即可(位于 etc/baetyl/conf.yml)。

问题 2: Ubuntu/Debian 下输入命令 docker info 后提示:”WARNING: No swap limit support”

参考方案:

  • 修改 /etc/default/grub 文件,在其中,编辑或者添加 GRUB_CMDLINE_LINUX 为如下内容:

GRUB_CMDLINE_LINUX=”cgroup_enable=memory swapaccount=1”

  • 保存后执行命令 sudo update-grub,完成后重启系统生效。

注意:如果执行第 2 步时提示出错,可能是 grub 设置有误,请检查后重复步骤 1 和步骤 2。

问题 3: 启动 Baetyl 服务提示:”WARNING: Your kernel does not support swap limit capabilities. Limitation discarded”

参考方案: 参考问题 2。

问题 4: 启动 Baetyl 服务提示:”Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json: dial unix /var/run/docker.sock: connect: permission denied”

参考方案

  • 提供管理员权限
  • 通过以下命令添加当前用户到 docker 用户组
  1. sudo usermod -aG docker ${USER}
  2. su - ${USER}

如提示没有 docker group,使用如下命令创建新 docker 用户组后再执行上述命令:

  1. sudo groupadd docker

问题 5: 启动 Baetyl 服务出现:”Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”

参考方案:按照问题 4 解决方案执行后如仍报出此问题,重新启动 docker 服务即可。

例,CentOS 下启动命令:

  1. systemctl start docker

问题 6: 启动 Baetyl 服务提示:”failed to create master: Error response from daemon: client version 1.39 is too new. Maximum supported API version is 1.38”

参考方案

  • 如果 Baetyl 的版本大于等于 1.0.0,可在 Baetyl 的配置文件(etc/baetyl/conf.yml)中添加如下内容:
  1. docker:
  2. api_version: 1.38
  • 如果 Baetyl 的版本小于 1.0.0,则需要配置设备的环境变量 DOCKER_API_VERSION=1.38,比如:
  1. sudo vim ~/.bash_profile
  2. export DOCKER_API_VERSION=1.38
  3. source ~/.bash_profile

另外,如果执行完上述命令之后发现服务还是不能启动,则是由于环境变量在当前用户并未生效导致。可以参考的解决办法如下:

  1. sudo vim /etc/sudoers # 如果系统没有安装 vim,可以先安装或是采用 vi,gedit 等其他编辑器

然后,将 Defaults env_reset 修改为 Defaults !env_reset 保存、退出即可。

注意:以上修改的仅仅是当前用户的环境变量规则,也就是说,在当前用户下使用 sudo 不会更改环境变量,但是 sudo -s 后进入的是 root 用户,再提权即 root 用户使用 sudo,那么环境变量依然遵循 root用户的配置。相关原理可以参考 系统中 sudo 的作用。如果想要 root 后依旧保留当前环境配置,需要额外设置,可以参考 如何对所有用户设置环境变量

问题 7: Baetyl 如何使用 NB-IoT 连接百度云管理套件或者物接入?

参考方案:NB-IoT 是一种网络制式,和 2/3/4G 类似,带宽窄功耗低。NB-IoT 支持基于 TCP 的 MQTT 通信协议,因此可以使用 NB-IoT 卡连接百度云物接入,部署 Baetyl 应用和 BIE 云管理通信。但国内三大运营商中,电信对他们的 NB 卡做了限制,仅允许连接电信的云服务 IP,所以目前只能使用移动 NB 卡和联通 NB 卡连接百度云服务。

问题 8: Baetyl 支持数据计算后将计算结果推送 Kafka 吗?

参考方案:支持,您可以参考 如何针对 Python 运行时编写 Python 脚本 一文,向 Hub 订阅消息,并将消息逐个写入 Kafka。您也可以参考 如何开发一个 Baetyl 自定义模块,该模块用于向 Hub 订阅消息,然后批量写入 Kafka。

问题 9: Baetyl 配置更改的方式有哪些?只能通过 云端管理套件 进行配置更改吗?

参考方案:目前,我们推荐通过云端管理套件进行配置定义和下发,但您也可以手动更改核心设备上的配置文件,然后重启 Baetyl 服务使之生效。

问题 10:我下载了 Linux MQTTBox 客户端,解压缩后将可执行文件放置到了 /usr/local/bin 目录(其他系统启动加载目录相同,如 /usr/bin/bin/usr/sbin等),启动时候提示:”error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory”

参考方案:这是由于 MQTTBox 启动缺少 libgconf-2.so.4 库所致。推荐做法如下:

  • 步骤 1:下载并解压缩 MQTTBox 软件包;
  • 步骤 2:进入 MQTTBox 软件包解压缩后的目录,为 MQTTBox 可执行文件配置执行权限;
  • 步骤 3:为 MQTTBox 设置软连接:sudo ln -s /path/to/MQTTBox /usr/local/bin/MQTTBox
  • 步骤 4:进入终端,执行 MQTTBox 即可。问题 11:在使用智能边缘 BIE 下发配置后,本地启动 Baetyl 服务,利用函数计算模块进行消息处理,发现 localfunc 无法进行消息处理,查看 funclog 有如下报错信息:
level=error msg=”failed to create new client” dispatcher=mqtt error=”dial tcp 0.0.0.0:1883:connect:connection refused”

参考方案:如果是使用智能边缘 BIE 云端管理套件下发配置,有如下几个点需要注意:

  • 云端下发配置目前只支持容器模式
  • 如果是云端下发配置,localfunc 里配置的 hub 地址应为 localhub 而非 0.0.0.0根据以上信息结合实际报错进行判断,根据需要重新从云端进行配置下发,或者参考 配置解析文档 进行核对及配置。

问题 12: 在使用智能边缘 BIE 云端管理套件时,如何选取 CFC 函数?

参考方案

  • 确保您的智能边缘 BIE 配置和 CFC 配置处于同一区域,例如同在北京/广州;
  • 确保您的函数在 CFC 平台已经发布。
  • 创建存储卷时,选择 CFC 函数模板进行创建,可以引入在 CFC 平台发布的函数,更多存储卷应用内容可参考 如何正确地引入存储卷问题 13:配置文件中的 ports 和 Hub 配置文件中的 listen 有什么关系?

参考方案

  • ports 配置了宿主机和容器内的端口映射关系;
  • listen 则是 Hub 的监听端口,Hub 是进程模式则监听宿主机的端口,Hub 是容器模式则监听容器内的端口;
  • 请参考 配置文件解读文档问题 14:消息通过 Baetyl 传输到 百度云 IoT Hub 后,如何在云端进行后续的数据处理?

参考方案:消息到达物接入后,可以通过 规则引擎 进行简单的 sql 处理,或者通过规则引擎传输给 百度云函数计算平台 等其他云端服务,具体配置详情参考 规则引擎操作指南。更多配置亦可参考 通过 Baetyl 实现数据脱敏后存储百度云 TSDB 一文。

问题 15:Baetyl 如何使用 Remote 功能连接 百度云 IoT Hub 设备型项目

参考方案:Baetyl 端云协同强制使用证书认证,目前物接入设备型项目还不支持证书认证,作为临时方案可以在本地手动配置用户名密码和物接入设备型项目交互。

问题 16:如果要保证消息不丢,所有消息都能被同步到云端,该怎么做?

参考方案

需要满足下如下两个条件:

  • 发送给本地 Hub 的消息的 QoS 必须是 1,保证消息在本地持久化。
  • Remote 向本地 Hub 订阅消息的 QoS 和向云端 Hub 发布消息的 QoS 也必须都为 1,保证消息成功上云。请参考 配置文件解读文档问题 17:从云端下发配置到边缘后,默认都是 docker 模式启动,修改 mode: native 之后,启动报错类似下述内容:”failed to update system: open /Users/xxx/baetyl_native/var/run/baetyl/services/agent/lib/baetyl/hub.baidubce.com/baetyl/baetyl-agent:latest/package.yml: no such file or directory”

参考方案: 目前我们的云管理不支持进程模式,如果需要在本地以进程模式启动 Baetyl 请参考 example/native 中的配置内容,执行命令 make install-native 来进行安装,并通过命令 sudo baetyl start 以进程方式来启动。

问题 18:下载镜像时有类似报错:”error=”Error response from daemon: Get https://hub.baidubce.com/v2/: x509: certificate signed by unknown authority” baetyl=master” Or “error=”Error response from daemon: Get https://hub.baidubce.com/v2/: x509: failed to load system roots and no roots provided” baetyl=master”

参考方案:这种情况是因为系统中缺少 https://hub.baidubce.com 网站的证书导致,可以先尝试安装 ca-certificates 包解决。例如,如宿主机系统为 debian ,可使用以下命令操作

  1. sudo apt-get update
  2. sudo apt-get install ca-certificates
  3. sudo service docker restart

如果仍然报错,可以使用 openssl 添加 https://hub.baidubce.com 网站的证书到系统中

  1. echo -n | openssl s_client -showcerts -connect hub.baidubce.com:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
  2. sudo service docker restart

其他系统可类比上述方案进行解决。

问题 19:CentOS7 系统上启动 Baetyl 时,报没有权限的错误:”container (0054b7d0da0f) [agent][agent] failed to load config: open etc/baetyl/service.yml: permission denied” Or “container (0054b7d0da0f) failed to parse log level (), use default level (info)[agent][agent] service is stopped with error: open etc/baetyl/service.yml: permission denied”

参考方案:这种情况是因为 CentOS7 中的安全模块 selinux 并未开放相关文件的权限,Docker 19.03 版本已经修复这个问题。用户可以参考 docker.com/install 升级到 19.03 或以上版本。