openbmc hwmon与sensor监控

news2024/12/23 4:26:45

1.说明

参考文档:

  • https://github.com/openbmc/entity-manager/blob/master/docs/entity_manager_dbus_api.md
  • https://github.com/openbmc/entity-manager/blob/master/docs/my_first_sensors.md

1.1 简单介绍

注意: 本节是快速浏览整个sensor框架,了解大致openbmc sensor的运行机制。难免会有相关描述不当,谨慎阅读。

本节主要简述怎么让sensoropenbmc上运行起来。 sensor包含物理硬件数据的读取与sensor相关的配置信息,例如阈值,sensor名字(ipmitool sensor list出来的名字)。

openbmc上讲究的均为功能分离,模块化的管理。因此,简单说涉及到几个文件:

  • 内核hwmon: 底层实际和物理硬件通信,获取实际的数据。
  • https://github.com/openbmc/dbus-sensors,实际应用层获取sensor数据,暴露到dbus
  • https://github.com/openbmc/entity-manager,sensor的配置信息,暴露到dbus上。

1.2 文件关系与文档

  • 内核hwmon: 底层实际和物理硬件通信,获取实际的数据。
  • https://github.com/openbmc/dbus-sensors,实际应用层获取sensor数据,暴露到dbus
  • https://github.com/openbmc/entity-manager,sensor的配置信息,暴露到dbus上。

hwmon介绍上描述的均为让温度、电压、风扇、电源等设备管理的更加的方便。

摘抄一下文件:linux-aspeed/drivers/hwmon/hwmon.c中的描述:

hwmon.c - part of lm_sensors, Linux kernel modules for hardware monitoring
This file defines the sysfs class "hwmon", for use by sensors drivers.

所以,简单说,hwmon定义了sysfs接口,硬件监控的数据获取均从sysfs接口拿到。

参考阅读文档:

  • linux/Documentation/hwmon/hwmon-kernel-api.rst
  • linux/include/linux/hwmon-sysfs.h

分析hwmon会发现openbmc将物理sensor的数据获取下放到kernel driver层。这还是对于驱动的稳定性抱很大的信心哪。

2.分析hwmon

2.1 目录内容

查看目录,可以看到如下图所示内容:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 驱动分析

驱动代码位置在:kernel/linux/drivers/hwmon/hwmon.c,先分析一下该文件,然后延申,了解整个驱动框架做了什么事情。

2.2.1 文件kernel/linux/drivers/hwmon/hwmon.c分析

1.入口函数

入口函数为:hwmon_init(),调用内容如下:

static int __init hwmon_init(void)
---> hwmon_pci_quirks(); 
	---> #if defined CONFIG_X86 && defined CONFIG_PCI //不定义这2项,函数代码是不执行的
---> class_register(&hwmon_class);

看一下hwmon_class的定义:

static struct class hwmon_class = {
	.name = "hwmon",
	.owner = THIS_MODULE,
	.dev_groups = hwmon_dev_attr_groups,
	.dev_release = hwmon_dev_release,
};

总体而言,初始化之后,在openbmc下显示的效果为在目录/sys/class下创建了hwmon目录。

2.结构体.dev_groups = hwmon_dev_attr_groups

定义如下:

static const struct attribute_group *hwmon_dev_attr_groups[] = {
	&hwmon_dev_attr_group,
	NULL
};

其中:

static const struct attribute_group hwmon_dev_attr_group = {
	.attrs		= hwmon_dev_attrs,
	.is_visible	= hwmon_dev_name_is_visible,
};

另外:

static struct attribute *hwmon_dev_attrs[] = {
	&dev_attr_name.attr,
	NULL
};

看到全局定义一个结构体:

static DEVICE_ATTR_RO(name);

找到文件:linux/include/linux/device.h,定义如下:

#define DEVICE_ATTR_RO(_name) \
	struct device_attribute dev_attr_##_name = __ATTR_RO(_name)

找到文件:linux/include/linux/sysfs.h,定义如下:

#define __ATTR_RO(_name) {						\
	.attr	= { .name = __stringify(_name), .mode = 0444 },		\
	.show	= _name##_show,						\
}

因此,文件中定义了内容:

struct device_attribute dev_attr_name = 
{
	.attr	= { .name = __stringify(_name), .mode = 0444 },
	.show   = name_show,
}

在看一个函数name_show(struct device *dev, struct device_attribute *attr, char *buf)的定义:

static ssize_t
name_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "%s\n", to_hwmon_device(dev)->name);
}

所以,整个框架基本成型,hwmon利用sysfs接口对外提供数据接口能力。

那它当前支持哪些硬件的监控? 可以看文件linux/include/linux/hwmon.h中的如下代码:

enum hwmon_sensor_types {
	hwmon_chip,
	hwmon_temp,
	hwmon_in,
	hwmon_curr,
	hwmon_power,
	hwmon_energy,
	hwmon_humidity,
	hwmon_fan,
	hwmon_pwm,
	hwmon_intrusion,
	hwmon_max,
};

即,包含了:hwmon_temphwmon_inhwmon_currhwmon_powerhwmon_energyhwmon_humidityhwmon_fan等硬件。

3.硬件设备支持

可以看到,有3种函数调用关系:

  • 第一种,描述的是过时的调用关系,使用函数hwmon_device_register():
struct device *hwmon_device_register(struct device *dev)
---> 	dev_warn(dev,
		 "hwmon_device_register() is deprecated. Please convert the driver to use hwmon_device_register_with_info().\n");
---> __hwmon_device_register(dev, NULL, NULL, NULL, NULL);
  • 第二种, 使用函数hwmon_device_register_with_info():
struct device *
devm_hwmon_device_register_with_info(struct device *dev, const char *name,
				     void *drvdata,
				     const struct hwmon_chip_info *chip,
				     const struct attribute_group **groups)
---> hwdev = hwmon_device_register_with_info(dev, name, drvdata, chip,
						groups);
	---> if (chip && (!chip->ops || !chip->ops->is_visible || !chip->info))
		return ERR_PTR(-EINVAL);
	---> __hwmon_device_register(dev, name, drvdata, chip, extra_groups);
  • 第三种,使用函数devm_hwmon_device_register_with_groups():
struct device *
devm_hwmon_device_register_with_groups(struct device *dev, const char *name,
				       void *drvdata,
				       const struct attribute_group **groups)
---> hwdev = hwmon_device_register_with_groups(dev, name, drvdata, groups);
	---> __hwmon_device_register(dev, name, drvdata, NULL, groups);

4.举例

拿一个简单的代码例子:linux/drivers/hwmon/ad7314.c:

static int ad7314_probe(struct spi_device *spi_dev)
---> hwmon_dev = devm_hwmon_device_register_with_groups(&spi_dev->dev,
							   spi_dev->modalias,
							   chip, ad7314_groups);

另外,ad7314_groups定义如下:

ATTRIBUTE_GROUPS(ad7314);

#define ATTRIBUTE_GROUPS(_name)					\
static const struct attribute_group _name##_group = {		\
	.attrs = _name##_attrs,					\
};	

static struct attribute *ad7314_attrs[] = {
	&sensor_dev_attr_temp1_input.dev_attr.attr,
	NULL,
};

#define SENSOR_DEVICE_ATTR_RO(_name, _func, _index)		\
	SENSOR_DEVICE_ATTR(_name, 0444, _func##_show, NULL, _index)

static SENSOR_DEVICE_ATTR_RO(temp1_input, ad7314_temperature, 0);

#define SENSOR_DEVICE_ATTR(_name, _mode, _show, _store, _index)	\
struct sensor_device_attribute sensor_dev_attr_##_name		\
	= SENSOR_ATTR(_name, _mode, _show, _store, _index)

static ssize_t ad7314_temperature_show(struct device *dev,
				       struct device_attribute *attr,
				       char *buf)


参考文件:

  • linux/include/linux/hwmon-sysfs.h
  • linux/include/linux/sysfs.h
  • linux/include/linux/device.h
  • linux/include/linux/hwmon.h

3.分析dbus-sensors

3.1 dbus-sensors的目标

  • dbus-sensors的实现仓库为: https://github.com/openbmc/dbus-sensors
dbus-sensors is a collection of sensor applications that provide the 
xyz.openbmc_project.Sensor collection of interfaces. They read sensor 
values from hwmon, d-bus, or direct driver access to provide readings. 
Some advance non-sensor features such as fan presence, pwm control, 
and automatic cpu detection (x86) are also supported.

因此,其目的即实现了实际的硬件数据的读取,并能将数据暴露给dbus,供其他应用程序使用。

3.2 目录结构

目录结构如下:

# tree 
.
└── dbus-sensors-master
    ├── include
    │   └── linux
    │       └── peci-ioctl.h
    ├── LICENSE
    ├── meson.build
    ├── meson.options
    ├── OWNERS
    ├── README.md
    ├── service_files
    │   ├── meson.build
    │   ├── xyz.openbmc_project.adcsensor.service
    │   ├── xyz.openbmc_project.exitairsensor.service
    │   ├── xyz.openbmc_project.externalsensor.service
    │   ├── xyz.openbmc_project.fansensor.service
    │   ├── xyz.openbmc_project.hwmontempsensor.service
    │   ├── xyz.openbmc_project.intelcpusensor.service
    │   ├── xyz.openbmc_project.intrusionsensor.service
    │   ├── xyz.openbmc_project.ipmbsensor.service
    │   ├── xyz.openbmc_project.mctpreactor.service
    │   ├── xyz.openbmc_project.mcutempsensor.service
    │   ├── xyz.openbmc_project.nvmesensor.service
    │   └── xyz.openbmc_project.psusensor.service
    ├── src
    │   ├── adc
    │   │   ├── ADCSensor.cpp
    │   │   ├── ADCSensor.hpp
    │   │   ├── ADCSensorMain.cpp
    │   │   └── meson.build
    │   ├── dbus-sensor_config.h.in
    │   ├── DeviceMgmt.cpp
    │   ├── DeviceMgmt.hpp
    │   ├── exit-air
    │   │   ├── ExitAirTempSensor.cpp
    │   │   ├── ExitAirTempSensor.hpp
    │   │   └── meson.build
    │   ├── external
    │   │   ├── ExternalSensor.cpp
    │   │   ├── ExternalSensor.hpp
    │   │   ├── ExternalSensorMain.cpp
    │   │   └── meson.build
    │   ├── fan
    │   │   ├── FanMain.cpp
    │   │   ├── meson.build
    │   │   ├── PresenceGpio.cpp
    │   │   ├── PresenceGpio.hpp
    │   │   ├── TachSensor.cpp
    │   │   └── TachSensor.hpp
    │   ├── FileHandle.cpp
    │   ├── FileHandle.hpp
    │   ├── hwmon-temp
    │   │   ├── HwmonTempMain.cpp
    │   │   ├── HwmonTempSensor.cpp
    │   │   ├── HwmonTempSensor.hpp
    │   │   └── meson.build
    │   ├── intel-cpu
    │   │   ├── IntelCPUSensor.cpp
    │   │   ├── IntelCPUSensor.hpp
    │   │   ├── IntelCPUSensorMain.cpp
    │   │   └── meson.build
    │   ├── intrusion
    │   │   ├── ChassisIntrusionSensor.cpp
    │   │   ├── ChassisIntrusionSensor.hpp
    │   │   ├── IntrusionSensorMain.cpp
    │   │   └── meson.build
    │   ├── ipmb
    │   │   ├── IpmbSDRSensor.cpp
    │   │   ├── IpmbSDRSensor.hpp
    │   │   ├── IpmbSensor.cpp
    │   │   ├── IpmbSensor.hpp
    │   │   ├── IpmbSensorMain.cpp
    │   │   └── meson.build
    │   ├── mctp
    │   │   ├── MCTPDeviceRepository.hpp
    │   │   ├── MCTPEndpoint.cpp
    │   │   ├── MCTPEndpoint.hpp
    │   │   ├── MCTPReactor.cpp
    │   │   ├── MCTPReactor.hpp
    │   │   ├── MCTPReactorMain.cpp
    │   │   └── meson.build
    │   ├── mcu
    │   │   ├── MCUTempSensor.cpp
    │   │   ├── MCUTempSensor.hpp
    │   │   └── meson.build
    │   ├── meson.build
    │   ├── nvme
    │   │   ├── meson.build
    │   │   ├── NVMeBasicContext.cpp
    │   │   ├── NVMeBasicContext.hpp
    │   │   ├── NVMeContext.hpp
    │   │   ├── NVMeSensor.cpp
    │   │   ├── NVMeSensor.hpp
    │   │   └── NVMeSensorMain.cpp
    │   ├── psu
    │   │   ├── meson.build
    │   │   ├── PSUEvent.cpp
    │   │   ├── PSUEvent.hpp
    │   │   ├── PSUSensor.cpp
    │   │   ├── PSUSensor.hpp
    │   │   └── PSUSensorMain.cpp
    │   ├── PwmSensor.cpp
    │   ├── PwmSensor.hpp
    │   ├── sensor.hpp
    │   ├── SensorPaths.cpp
    │   ├── SensorPaths.hpp
    │   ├── tests
    │   │   ├── meson.build
    │   │   ├── test_IpmbSensor.cpp
    │   │   ├── test_MCTPEndpoint.cpp
    │   │   ├── test_MCTPReactor.cpp
    │   │   └── test_Utils.cpp
    │   ├── Thresholds.cpp
    │   ├── Thresholds.hpp
    │   ├── Utils.cpp
    │   ├── Utils.hpp
    │   └── VariantVisitors.hpp
    └── subprojects
        ├── boost.wrap
        ├── googletest.wrap
        ├── libgpiod.wrap
        ├── libpeci.wrap
        ├── liburing.wrap
        ├── nlohmann_json.wrap
        ├── packagefiles
        │   └── boost
        │       └── meson.build
        ├── phosphor-logging.wrap
        └── sdbusplus.wrap

21 directories, 107 files

从目录service_files中,可以看到openbmc将每一种类型的sensor做成了一个服务。

4.分析entity-manager

4.1 目录结构

目录结构如下:

# tree
.
└── entity-manager-master
    ├── blacklist.json
    ├── CONFIG_FORMAT.md
    ├── configurations
    │   ├── 1ux16_riser.json
    │   ├── 2ux8_riser.json
    │   ├── 3ypower_vast2112_psu.json
    │   ├── 8x25_hsbp.json
    │   ├── a2ul16riser.json
    │   ├── a2ux8x4riser.json
    │   ├── acbell_rica_psu.json
    │   ├── acbel_r1ca2122a_psu.json
    │   ├── ahw1um2riser.json
    │   ├── aspower_u1a-d10550_psu.json
    │   ├── aspower_u1a-d10800_psu.json
    │   ├── aspower_u1a-d11200_psu.json
    │   ├── aspower_u1a-d11600_psu.json
    │   ├── aspower_u1d-d10800_psu.json
    │   ├── asrock_c3_medium_x86.json
    │   ├── asrock_e3c246d4i.json
    │   ├── asrock_e3c256d4i.json
    │   ├── asrock_m3_small_x86.json
    │   ├── asrock_n3_xlarge_x86.json
    │   ├── asrock_romed8hm3.json
    │   ├── asrock_spc621d8hm3.json
    │   ├── axx1p100hssi_aic.json
    │   ├── axx2prthdhd.json
    │   ├── bellavista.json
    │   ├── blueridge_1s4u_chassis.json
    │   ├── blueridge_2u_chassis.json
    │   ├── blueridge_4u_chassis.json
    │   ├── blyth.json
    │   ├── bnp_baseboard.json
    │   ├── bonnell.json
    │   ├── brcm_100g_1p_ocp_mezz.json
    │   ├── brcm_200g_1p_ocp_mezz.json
    │   ├── compuware_cdr_9011_3m1_psu.json
    │   ├── cx7_ocp.json
    │   ├── delta_awf2dc3200w_psu.json
    │   ├── delta_dps-1600ab_psu.json
    │   ├── delta_dps-2000ab_psu.json
    │   ├── delta_dps-750xb_psu.json
    │   ├── everest.json
    │   ├── f1u12x25_hsbp.json
    │   ├── f1u4x25_hsbp.json
    │   ├── f2u12x35_hsbp.json
    │   ├── f2u8x25_hsbp.json
    │   ├── flextronics_s-1100adu00-201_psu.json
    │   ├── fp5280g3_chassis.json
    │   ├── fp5280g3_fanboard.json
    │   ├── fuji.json
    │   ├── genesis3_baseboard.json
    │   ├── genesis3_chassis.json
    │   ├── genesis3_psu.json
    │   ├── gospower_g1136-1300wna_psu.json
    │   ├── ibm_tacoma_rack_controller.json
    │   ├── ingraham.json
    │   ├── intel_front_panel.json
    │   ├── kudo_bmc.json
    │   ├── kudo_motherboard.json
    │   ├── meta
    │   │   ├── bletchley_baseboard.json
    │   │   ├── bletchley_chassis.json
    │   │   ├── bletchley_frontpanel.json
    │   │   ├── bmc_storage_module.json
    │   │   ├── catalina_fio.json
    │   │   ├── catalina_hdd.json
    │   │   ├── catalina_hdd_nvme.json
    │   │   ├── catalina_osfp.json
    │   │   ├── catalina_pdb.json
    │   │   ├── catalina_scm.json
    │   │   ├── fbtp.json
    │   │   ├── fbyv2.json
    │   │   ├── fbyv35.json
    │   │   ├── fbyv35_nic_mellanox.json
    │   │   ├── greatlakes.json
    │   │   ├── greatlakes_nic_mellanox.json
    │   │   ├── harma_bsm.json
    │   │   ├── harma_fanboard.json
    │   │   ├── harma_mb.json
    │   │   ├── harma_mb_vr_infineon.json
    │   │   ├── harma_scm.json
    │   │   ├── minerva_cmm_bsm.json
    │   │   ├── minerva_cmm_hsc_infineon.json
    │   │   ├── minerva_cmm.json
    │   │   ├── minerva_cmm_scm.json
    │   │   ├── minerva_fanboard.json
    │   │   ├── minerva_pdb_hsc_xdp.json
    │   │   ├── minerva_pdb.json
    │   │   ├── minerva_pttv.json
    │   │   ├── minerva_sitv.json
    │   │   ├── terminus_2x100g_nic_tsff.json
    │   │   ├── twinlake.json
    │   │   ├── ventura_fanboard.json
    │   │   ├── ventura_ioboard.json
    │   │   ├── ventura_ledboard.json
    │   │   ├── ventura_rmc.json
    │   │   ├── ventura_scm.json
    │   │   ├── yosemite4_chassis.json
    │   │   ├── yosemite4_cpu.json
    │   │   ├── yosemite4_fanboard_fsc_max_adc_ti_led_nxp_efuse_max.json
    │   │   ├── yosemite4_fanboard_fsc_max_adc_ti_led_nxp_efuse_mps.json
    │   │   ├── yosemite4_fanboard_fsc_nct_adc_max_led_ons_efuse_max.json
    │   │   ├── yosemite4_fanboard_fsc_nct_adc_max_led_ons_efuse_mps.json
    │   │   ├── yosemite4_floatingfalls.json
    │   │   ├── yosemite4.json
    │   │   ├── yosemite4_medusaboard_adc_rns_12vhsc_adi_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_12vhsc_mps_48vhsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_rns_12vhsc_mps_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_hsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_12vhsc_adi_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_12vhsc_mps_48vhsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_12vhsc_mps_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_rns_isl_hsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_ti_12vhsc_adi_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_ti_12vhsc_mps_48vhsc_adi.json
    │   │   ├── yosemite4_medusaboard_adc_ti_12vhsc_mps_48vhsc_inf.json
    │   │   ├── yosemite4_medusaboard_adc_ti_hsc_adi.json
    │   │   ├── yosemite4n.json
    │   │   ├── yosemite4_sentineldome_chassis.json
    │   │   ├── yosemite4_sentineldome_t1.json
    │   │   ├── yosemite4_sentineldome_t1_retimer.json
    │   │   ├── yosemite4_sentineldome_t2.json
    │   │   ├── yosemite4_sentineldome_t2_retimer.json
    │   │   ├── yosemite4_spiderboard_adc_max_pwr_ti.json
    │   │   ├── yosemite4_spiderboard_adc_ti_pwr_ti.json
    │   │   └── yosemite4_wailuafalls.json
    │   ├── micron_7450.json
    │   ├── mori_bmc.json
    │   ├── mori_motherboard.json
    │   ├── mtjade.json
    │   ├── mtjefferson_bmc.json
    │   ├── mtjefferson_bp.json
    │   ├── mtjefferson_mb.json
    │   ├── mtmitchell_bmc.json
    │   ├── mtmitchell_bp.json
    │   ├── mtmitchell_mb.json
    │   ├── mtmitchell_riser.json
    │   ├── mudflap.json
    │   ├── nf5280m7_baseboard.json
    │   ├── nisqually.json
    │   ├── nuvoton_npcm8xx_evb.json
    │   ├── nvidia_gb200_io_board.json
    │   ├── nvidia_gb200.json
    │   ├── nvidia_hmc.json
    │   ├── nvme_intel_p_series.json
    │   ├── nvme_p4500_p5500.json
    │   ├── pcie_ssd_retimer.json
    │   ├── pennybacker.json
    │   ├── pssf132202a.json
    │   ├── pssf162205a.json
    │   ├── pssf212201a.json
    │   ├── pssf222201a.json
    │   ├── r1000_chassis.json
    │   ├── r2000_chassis.json
    │   ├── rainier_1s4u_chassis.json
    │   ├── rainier_2u_chassis.json
    │   ├── rainier_4u_chassis.json
    │   ├── sas_module.json
    │   ├── sbp1_baseboard.json
    │   ├── sbp1_chassis.json
    │   ├── sbp1_hbm.json
    │   ├── sbp1_nvme.json
    │   ├── sbp1_psu.json
    │   ├── sbp1_rssd.json
    │   ├── solum_pssf162202_psu.json
    │   ├── storm_king.json
    │   ├── stp_baseboard.json
    │   ├── stp_p4000_chassis.json
    │   ├── supermicro-pws-920p-sq_psu.json
    │   ├── system1_baseboard.json
    │   ├── system1_chassis.json
    │   ├── tola.json
    │   ├── tyan_s7106_baseboard.json
    │   ├── tyan_s8036_baseboard.json
    │   ├── vegman_n110_baseboard.json
    │   ├── vegman_rx20_baseboard.json
    │   ├── vegman_sx20_baseboard.json
    │   ├── VENDORS.md
    │   └── wft_baseboard.json
    ├── docs
    │   ├── associations.md
    │   ├── blacklist_configuration.md
    │   ├── entity_manager_dbus_api.md
    │   └── my_first_sensors.md
    ├── Doxyfile
    ├── format-code
    ├── LICENCE
    ├── meson.build
    ├── meson_options.txt
    ├── OWNERS
    ├── README.md
    ├── schemas
    │   ├── global.json
    │   ├── ibm.json
    │   ├── intel.json
    │   ├── legacy.json
    │   ├── mctp.json
    │   ├── openbmc-dbus.json
    │   ├── pid.json
    │   ├── pid_zone.json
    │   ├── README.md
    │   ├── satellite_controller.json
    │   ├── stepwise.json
    │   └── virtual_sensor.json
    ├── scripts
    │   ├── autojson.py
    │   ├── run-ci.sh
    │   └── validate_configs.py
    ├── service_files
    │   ├── dbus
    │   │   └── xyz.openbmc_project.EntityManager.service
    │   ├── devicetree-vpd-parser.service
    │   ├── meson.build
    │   ├── xyz.openbmc_project.EntityManager.service
    │   └── xyz.openbmc_project.FruDevice.service
    ├── src
    │   ├── devices.hpp
    │   ├── devicetree_vpd_parser.cpp
    │   ├── entity_manager.cpp
    │   ├── entity_manager.hpp
    │   ├── expression.cpp
    │   ├── expression.hpp
    │   ├── fru_device.cpp
    │   ├── fru_reader.cpp
    │   ├── fru_reader.hpp
    │   ├── fru_utils.cpp
    │   ├── fru_utils.hpp
    │   ├── machine_context.cpp
    │   ├── machine_context.hpp
    │   ├── meson.build
    │   ├── overlay.cpp
    │   ├── overlay.hpp
    │   ├── perform_probe.cpp
    │   ├── perform_scan.cpp
    │   ├── topology.cpp
    │   ├── topology.hpp
    │   ├── utils.cpp
    │   ├── utils.hpp
    │   └── variant_visitors.hpp
    ├── subprojects
    │   ├── boost.wrap
    │   ├── gtest.wrap
    │   ├── nlohmann_json.wrap
    │   ├── phosphor-dbus-interfaces.wrap
    │   ├── phosphor-logging.wrap
    │   ├── sdbusplus.wrap
    │   └── valijson.wrap
    └── test
        ├── expected-schema-errors.txt
        ├── test_entity-manager.cpp
        ├── test_fru-utils.cpp
        └── test_topology.cpp

11 directories, 242 files

其基本功能包含:

  • 1.A detection daemon
  • 2.An entity manager configuration file
  • 3.A reactor

BMC系统下,对应目录:
在这里插入图片描述

5.软件包的联动 TBD…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

thinkphp框架diygw-ui-php进销存出库记录操作

将进销存的出库明细记录存储到数据库中,thinkphp框架diygw-ui-php后台通常涉及以下几个步骤: 数据库表定义 实现我们定义了三张表、一个产品表、出库订单表、出库订单产品明细表 生成API 进入DIY可视化API代码生成器,我们生成这三张表结应…

vertx idea快速使用

目录 1.官网下载项目 2.修改代码 2.1拷贝代码方式 为了能够快速使用,我另外创建一个新的maven项目,将下载项目的src文件和pom文件拷贝到新建的maven项目。 2.2删除.mvn方式 3.更新配置 4.配置application 5.idea启动项目 1.官网下载项目 从vert…

ComE(Community Embedding) -- 基于嵌入的社区检测优化算法

ComE(Community Embedding)是一种基于嵌入的社区检测优化算法。 它结合了节点嵌入技术与社区划分的目标,能够有效识别网络中的社区结构,并在社区划分过程中捕捉复杂的节点相互作用信息。 算法背景 传统的社区检测方法,…

CSS|14 z-index

z-index z-index表示谁压盖着谁,数值大的会压盖住数值小的。只有定位的元素才有z-index值,只有设置了固定定位、相对定位、绝对定位了的元素,才会拥有z-indexz-index的值是没有单位的,值是一个正整数,默认的z-index值…

重撸设计模式--代理模式

文章目录 定义UML图代理模式主要有以下几种常见类型:代理模式涉及的主要角色有:C 代码示例 定义 代理模式(Proxy Pattern)属于结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…

vue中验证码的实现方式

在写登录页的时候有的系统会让你也进行一下验证码绘制,那么验证码如何实现的呢?我在写登录页的时候通过将登录框,验证码分开页面来写,最后将它们变成标签来导入到我的样式页面中,这样写不仅方便,更容易修改…

Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器

文章目录 一、SpringWeb概述 二、SpringWeb特点 三、搭建SpringWeb(在web项目中) 1、导包 2、在web.xml文件中配置统一拦截分发器 DispatcherServlet 3、开启 SpringWEB 注解 4、处理器搭建 四、SpringWeb运行流程 五、SpringWeb组件 1、前端控…

构建MacOS应用小白教程(打包 签名 公证 上架)

打包 在package.json中,dependencies会被打进 Electron 应用的包里,而devDependencies则不会,所以必要的依赖需要放到dependencies中。files中定义自己需要被打进 Electron 包里的文件。以下是一个完整的 mac electron-builder的配置文件。 …

2.4 网络概念(分层、TCP)

网络层与传输层概述 网络层: 抽象概念:网络层是基于 IP 的抽象概念,与数据链路层用 MAC 地址标记设备不同。MAC 地址是一种具体化的概念,绑定于所在的物理网络,而 IP 地址可以是固定的,也可以通过路由动态…

【JetPack】Room数据库笔记

Room数据库笔记 ORM框架&#xff1a;对齐数据库数据结构与面向对象数据结构之间的关系&#xff0c;使开发编程只考虑面向对象不需要考虑数据库的结构 Entity : 数据实体&#xff0c;对应数据库中的表 <完成面向对象与数据库表结构的映射> 注解&#xff1a; 类添加注解…

基于前端技术UniApp和后端技术Node.js的电影购票系统

文章目录 摘要Abstruct第一章 绪论1.1 研究背景与意义1.2 国内外研究现状 第二章 需求分析2.1 功能需求分析2.2 非功能性需求分析 第二章系统设计3.1 系统架构设计3.1.1 总体架构3.1.2 技术选型 3.2 功能架构 第四章 系统实现4.1 用户端系统实现4.1.1 用户认证模块实现4.1.2 电…

大模型微调---Lora微调实战

目录 一、前言二、LoRA实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、LoRA微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 LoRA是一种参数高效的微调技术&#xff0c;通过低秩转换对大型语言模型进行适应性更新&#xff0c;减少…

centos7下docker 容器实现redis主从同步

1.下载redis 镜像 docker pull bitnami/redis2. 文件夹授权 此文件夹是 你自己映射到宿主机上的挂载目录 chmod 777 /app/rd13.创建docker网络 docker network create mynet4.运行docker 镜像 安装redis的master -e 是设置环境变量值 docker run -d -p 6379:6379 \ -v /a…

SLAAC如何工作?

SLAAC如何工作&#xff1f; IPv6无状态地址自动配置(SLAAC)-常见问题 - 苍然满关中 - 博客园 https://support.huawei.com/enterprise/zh/doc/EDOC1100323788?sectionj00shttps://www.zhihu.com/question/6691553243/answer/57023796400 主机在启动或接口UP后&#xff0c;发…

2024.12.21辩论赛感受

背景 今天辩论赛的双方论点是&#xff1a; 正方&#xff1a;寒假留在研发中心的收获大 反方&#xff1a;寒假去做其他事情的收获 辩论赛&#xff0c;为了锻炼自己&#xff0c;选择了不想选择以及相对不好辩论的反方。出现的状况有一下几点&#xff1a; 1.发现自己脑子完全跟不…

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…

C语言:文件IO

C语言&#xff1a;文件IO 文件操作 概述 什么是文件 文件是保存在外存储器&#xff08;一般代指磁盘&#xff0c;U盘&#xff0c;移动硬盘等&#xff09;的数据的集合 文件操作体现在哪几个方面 文件内容的读取文件内容的写入 数据的读取和写入可被视为针对文件进行输入&…

时间序列异常值处理方法

文章目录 一、删除法二、替换法三、插值法四、滑动窗口五、基于模型的替换 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 时间序列预测算法—Prophet 时间序列分类任务—tsfresh python时间序列处理 有季节效应的非平稳序列分析 时间序列异常值检测方法 时间序列…

【报错】node:internal/modules/cjs/loader:936

报错问题&#xff1a; 当执行npm run dev后&#xff0c;出现下面错误 这个错误一般是由于Node.js无法找到所需的模块而引起的&#xff0c;解决此问题的一种方法就是重新安装所需的模块。 解决办法&#xff1a; 删除npm install 所下载在项目里的node_modules文件执行操作&…

故障诊断 | 一个小创新:特征提取+KAN分类

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…