busybox作为conan组件编入openUBMC实践分享

在开发ipmb相关功能时,需要使用devmem修改相关寄存器,但是openUBMC没有携带devmem程序,经过指导可以将busybox作为conan组件编入openUBMC,从而在openUBMC中使用busybox的devmen功能。

1、新建busybox组件目录

创建原始的conan组件,由于使用的是第三方开源软件,所以不需要通过bmcgo创建。


conan文件相关概念,具体查看官方文档

conanfile.py:定义 Conan 包的元数据(如名称、版本、许可证)、依赖关系、构建配置、编译选项等,是 Conan 包的核心配置文件、

#!/usr/bin/python
#-*-coding:utf-8-*-
import os

from conans import ConanFile, tools, AutoToolsBuildEnvironment

class busyboxConan(ConanFile):
    name = "busybox"
    license = "Mulan PSL v2"
    description = "The SoftWare Freedom Conservancy acts as the GPL enforcement agent for various BusyBox"
    settings = "os", "compiler", "build_type", "arch"
    requires = []
    _env_build = None
    generators = "make"
    _cmake = None
    options = {"devmem": [True, False]}
    default_options = {"devmem": True}

    @property
    def _source_subfolder(self):
        return "source_subfolder"

    def source(self):
        git = tools.Git(verify_ssl=False)
        git.clone(**self.conan_data["sources"][self.version])

    def build(self):
        autotools = AutoToolsBuildEnvironment(self)
        chost = os.environ.get("CHOST")
        if chost is not None:
            os.environ["CROSS_COMPILE"] = chost + "-"
        autotools.make(target="defconfig")

        # 开启 devmem
        if self.options.devmem:
            os.system("sed -i 's/# CONFIG_DEVMEM is not set/CONFIG_DEVMEM=y/' .config")

        autotools.make()
    
    def package(self):
        self.copy("busybox", dst="opt/debug")

conandata.yml:存储依赖库的版本范围、构建选项等元数据

sources:
  "1.34.1":
    url: "https://github.com/mirror/busybox.git"
    branch: "1_34_stable"
    shallow: true

2、创建本地busybox组件

再目录下执行命令,创建本地组件,要带上build_type=Debug,bmcgo publish默认出Debug包

conan create . busybox/1.34.1@hw.ibmc.release/rc -s build_type=Debug

3、上传本地busybox组件到远程conan仓

conan upload busybox/1.34.1@hw.ibmc.release/rc --all -r=ibmc_dev

4、验证busybox组件

清除本地缓存后,验证能否从远程下载

conan install busybox/1.34.1@hw.ibmc.release/rc -r=ibmc_dev

确保 Options 设置正确,导出table.html浏览器查看

conan search busybox/1.34.1@hw.ibmc.release/rc -r=ibmc_dev --table=table.html

5、manifest引用busybox组件

  - conan: byo_general/0.0.1@hw.ibmc.common/rc
  - conan: busybox/1.34.1@hw.ibmc.release/rc
    options:
          devmem: true

6、ssh中使用busybox

opt/debug/busybox ifconfig
opt/debug/busybox devmem
...

7、其他组件使用busybox devmem

在ssh中使用opt/debug/busybox devmem会提示权限错误,猜测是Administrator用户权限问题,经过实践,可改在其他组件服务中调用。

[Service]
User=root
Restart=always
RestartSec=1
StartLimitInterval=0
EnvironmentFile=/dev/shm/dbus/.dbus
Environment="ROOT_DIR="
Environment="PROJECT_DIR="
WorkingDirectory=/opt/bmc/apps/byo_709bmc
ExecStartPre=/opt/debug/busybox touch /tmp/ipmb
ExecStartPre=/opt/debug/busybox devmem 0x08745044 w 3
ExecStartPre=/opt/debug/busybox devmem 0x08745048 w 3
ExecStartPre=/opt/debug/busybox devmem 0x0874504c w 3
ExecStartPre=/opt/debug/busybox devmem 0x08745050 w 3
ExecStartPre=/opt/debug/busybox devmem 0x0871d334 w 0x00007f6
ExecStartPre=/bin/sh -c "/opt/debug/busybox devmem 0x08745044 >> /tmp/ipmb"
ExecStartPre=/bin/sh -c "/opt/debug/busybox devmem 0x08745048 >> /tmp/ipmb"
ExecStartPre=/bin/sh -c "/opt/debug/busybox devmem 0x0874504c >> /tmp/ipmb"
ExecStartPre=/bin/sh -c "/opt/debug/busybox devmem 0x08745050 >> /tmp/ipmb"
5 个赞

点赞,有几点小建议:

1、manifest.yml引入busybox时由debug_dependencies描述依赖(而不是dependencies),debug_dependencies依赖只在个人构建时才会集成。主要考虑busybox带了不安全的telnet、tftp等协议,安装到产品包中有安全风险。
2、建议将busybox构建脚本合入到gitcode/openUBMC/conan_index。
3、默认安装telnetd服务,这样集成busybox组件的软件包启动时就能自动开启telnet,方便调试。

好的,我先来看看conan_index怎么合入