添加新系統到 OpenBMC
內容: 如何添加一個新的系統到 OpenBMC
版本
受眾: 熟悉 OpenBMC
的開發者
需求: 完成了環境配置文檔
我的博客
總覽
本文檔將描述如下的內容:
- 回顧
Yocto
與BitBake
的歷史 - 創建新的系統層
- 完善這個新的層
- 編譯新的系統並使用
QEMU
進行測試 - 為
sensor
,LED
,資產
等內容添加配置
背景
OpenBMC
版本基於Yocto項目。Yocto
項目允許開發者創建定制化的 Linux
發行版本。 OpenBMC
使用 Yocto
創建自己的運行在各種設備尚的嵌入式 Linux
版本。
Yocto
具有一個層架構的概念。當你構建一個基於 Yocto
的構建版本時,你會定義關於該版本的一系列的層。OpenBMC
使用一些 Yocto
中通用的層以及自己構建的層。OpenBMC
中定義的層可以在 OpenBMC
的 GitHub項目的 meta-*
目錄中找到。
Yocto
的層是定義在這個層中的構成這個層的不同包的組合。其中一個關鍵的層是BitBake使用的食譜。
BitBake
具有自身完備的功能性。在本文檔中,我們將僅專注於添加一個新的系統過程中需要使用的 BitBake
內容。
啟動 BitBake 初始化
你需要至少100GB的存儲空間的開發環境,盡可能多的內存以及CPU核。第一次構建 OpenBMC
版本可能會消耗幾個小時。一旦初次構建完成,未來的構建將會使用第一次構建中生成的緩存數據進行構建,從而大幅加速了后續的構建過程。
首先,跟着 Github
中的項目文檔進行初次構建。
創建一個新的系統
如果上面的工作能夠順利完成,讓我們開始創建我們的新系統吧。與前面的內容相同,我們將會使用 Romulus
作為我們的參考內容。我們新的系統將稱為 romulus-prime
。
在之前克隆的openbmc的倉庫中,Romulus
等位於 meta-ibm/meta-romulus/
目錄下。 Romulus
層定義在 conf
子目錄下。在 conf
目錄中,可以看到如下的結構:
meta-ibm/meta-romulus/conf/
├── bblayers.conf.sample
├── conf-notes.txt
├── layer.conf
├── local.conf.sample
└── machine
└── romulus.conf
為了創建我們自己的 romulus-prime
系統,首先復制當前的 romulus
層:
cp -R meta-ibm/meta-romulus meta-ibm/meta-romulus-prime
讓我們調整在新的層中需要的每個文件:
-
meta-ibm/meta-romulus-prime/conf/bblayers.conf.sample
這個文件定義了要引入到meta-romulus-prime
版本中的層,你可以在這個文件中看到不同的Yocto
層(比如meta
,meta-openembedded/meta-oe
等)。它也有OpenBMC
的層,比如meta-phosphor
,meta-openpower
,meta-ibm
以及meta-ibm/meta-romulus
。對這個文件要做出的唯一修改是將其中的兩個
meta-romulus
實例,修改為meta-romulus-prime
,這將允許你使用你新構建的層。 -
meta-ibm/meta-romulus-prime/conf/conf-notes.txt
這個文件簡單陳述你構建的新層要構建的默認目標,這個文件保留不變,因為這個文件在所有的OpenBMC
系統都保持一致。 -
meta-ibm/meta-romulus-prime/conf/layer.conf
這個文件的主要目的是告訴BitBake
去哪里查找食譜(*.bb)文件,食譜文件以.bb
作為后綴名,包含不同層的打包邏輯。.bbappend
文件也是食譜文件,但是卻是作為.bb
文件的補充。.bbapped
文件通常用來添加或移除相關聯的.bb
文件中的內容。 -
meta-ibm/meta-romulus-prime/conf/local.conf.sample
這個文件中包含你的層中的本地配置設置信息。這個文件中的內容寫的很好,值得一讀。唯一需要改變的內容是,將MACHINE
修改為romulus-prime
。 -
meta-ibm/meta-romulus-prime/conf/machine/romulus.conf
這個文件描述了你的機型的規定的內容,你定義使用的內核設備樹,你引入的覆寫特性,以及其他的系統特性。這個文件是創建新系統變動不同的內容時的好參考(內核設備樹,MRW,LED設置,資產訪問等)。
首先,你需要將這個文件重命名為romulus-prime.conf
。
這個配置數據的主體數據不再使用了,但是在完全移除它之前,你依然需要提供這些內容。
構建新系統
上面的工作順利完成后,再繼續進行后續的操作。后面的操作過程中,可能會出現一些錯誤,但是這些錯誤可以幫助你更好的理解構建新系統的過程。
-
為當前的構建調整
conf
在shell
中,你進行了bitbake
的初始化操作,現在需要為你新構建的系統重置conf
文件,你可以手動的復制新文件,或只是移除它,讓BitBake
幫助你完成:cd .. rm -rf ./build/conf export TEMPLATECONF=meta-ibm/meta-romulus-prime/conf . openbmc-env
運行你想運行的
bitbake
命令。 -
沒有 RPROVIDES 'romulus-prime-config'
這是你在新系統中運行bitbake obmc-phosphor-image
之后出現的第一個錯誤。
在初始化OpenBMC
的原型初始化時,會使用openbmc/skeleton
倉庫,在這個倉庫中是 configs 目錄。
既然這個倉庫與文件是這樣的情況,我們將簡單地快速解決這個問題。
創建如下的配置文件:cp meta-ibm/meta-romulus-prime/recipes-phosphor/workbook/romulus-config.bb meta-ibm/meta-romulus-prime/recipes-phosphor/workbook/romulus-prime-config.bb vi meta-ibm/meta-romulus-prime/recipes-phosphor/workbook/romulus-prime-config.bb SUMMARY = "Romulus board wiring" DESCRIPTION = "Board wiring information for the Romulus OpenPOWER system." PR = "r1" inherit config-in-skeleton #Use Romulus config do_make_setup() { cp ${S}/Romulus.py \ ${S}/obmc_system_config.py cat <<EOF > ${S}/setup.py from distutils.core import setup setup(name='${BPN}', version='${PR}', py_modules=['obmc_system_config'], ) EOF }
重新運行你的
bitbake
命令。 -
提取
URL
失敗: file://romulus.cfg
這是內核需要的一個配置文件,在這里你可以放置一些額外的內核配置參數。在我們的需求中,只需要調整romulus-prime
來使用romulus.cfg
文件。我們只需要添加-prime
來擴展路徑。vi ./meta-ibm/meta-romulus-prime/recipes-kernel/linux/linux-aspeed_%.bbappend FILESEXTRAPATHS_prepend_romulus-prime := "${THISDIR}/${PN}:" SRC_URI += "file://romulus.cfg"
現在重新運行你的 `bitbake 命令。
-
沒有提供目標
arch/arm/boot/dts/aspeed-bmc-opp-romulus-prime.dtb.dtb
文件是設備樹塊文件。這個文件在Linux
內核基於對應的.dts
文件編譯過程中生成的文件。當你引入一個新的OpenBMC
系統時,你需要發送這些內核更新上游內容。鏈接郵件 thread 是這個過程的例子。在本文檔中,我們只簡單的使用Romulus
內核配置文件:vi ./meta-ibm/meta-romulus-prime/conf/machine/romulus-prime.conf # Replace the ${MACHINE} variable in the KERNEL_DEVICETREE # Use romulus device tree KERNEL_DEVICETREE = "${KMACHINE}-bmc-opp-romulus.dtb"
重新運行你的
bitbake
命令。
啟動新系統
現在,你編譯了你的新的系統鏡像!有很多可以繼續定制化的內容,但在現在,我們先驗證一下我們的工作吧!
你的新鏡像在編譯完成后,它會位於相對於你的 bitbake
命令使用的目錄於:
./tmp/deploy/images/romulus-prime/obmc-phosphor-image-romulus-prime.static.mtd
復制這個鏡像到你配置的 QEMU
位置,重新運行啟動 QEMU
命令(在 dev-environment.md 中的 qemu-system-arm
命令),並使用你的新的文件作為輸入。
一旦啟動,你將會看到如下的登錄接口:
romulus-prime login:
好了!現在,你已經成功的實現了初步的創建、啟動以及構建一個新的系統。這雖然在實際意義上並不是一個新的系統,但是你現在有了定制自己需要系統的基礎。
深度客制化
在創建一個新系統時,有很多可以定制化的內容。
修改內核
本小節介紹如何修改內核,以移植 OpenBMC
到新的設備。設備樹位於 https://github.com/openbmc/linux/tree/dev-4.13/arch/arm/boot/dts 中。比如,查看 aspeed-bmc-opp-romulus.dts 或相似的設備。完成下面的步驟來做出內核的修改:
- 添加新機型的設備樹
- 描述
GPIOs
,即LED
,FSI
,gpio-keys
等內容。你應該可以從硬件原理圖中獲取到需要配置的信息 - 描述
i2c
總線以及設備,通常包含不同的硬件檢測hwmon
sensor
- 描述其他的設備,即
uarts
,mac
等內容 - 通常
flash
布局不需要改變,只需要包含openbmc-flash-layout.dtsi
- 描述
- 調整
Makefile
來編譯設備樹 - 參考 openbmc kernel doc 提交補丁到郵件列表
注意:
- 在
dev-4.10
中,arch/arm/mach-aspeed/aspeed.c
中具有通用的以及指定設備的代碼,這個文件是用來通用的初始化,以及指定的機型的設置。在branch
dev-4.13
中,沒有這樣的初始化代碼。大多數初始化是與時鍾以及重置驅動中完成的 - 如果設備需要特定的配置(即 uart 路由),請發送郵件到郵件列表 the mailing list 進行討論
工作簿
在舊版的 OpenBMC
中,有一個"工作簿"描述設備的服務、傳感器以及FRU等信息。這個工作簿是一個 python
配置文件,且它被 skeleton 的其他服務使用。在最新版的 OpenBMC
中,skeleton
服務大多數被 phosphor-xxx
服務替代,因此skeleton
已經被拋棄了。但是在當前的構建中依舊需要"工作簿"。
meta-quanta是一個在 OpenBMC
樹中定義的自有的配置示例,盡管是偽造的,它不再依賴於 skeleton
。
在 e0e69be 中,或在 v2.4
標簽之前,OpenPOWER
機型使用 GPIO
相關的一些配置,例如,在 Romulus.py 中,配置細節如下:
GPIO_CONFIG['BMC_POWER_UP'] = \
{'gpio_pin': 'D1', 'direction': 'out'}
GPIO_CONFIG['SYS_PWROK_BUFF'] = \
{'gpio_pin': 'D2', 'direction': 'in'}
GPIO_CONFIGS = {
'power_config' : {
'power_good_in' : 'SYS_PWROK_BUFF',
'power_up_outs' : [
('BMC_POWER_UP', True),
],
'reset_outs' : [
],
},
}
編譯時需要 PowerUp
以及 PowerOK
GPIOs
,來上電機箱並檢測上電狀態。
在這之后,GPIO
相關的配置從工作簿移除,並被 gpio_defs.json
替換,即 2a80da2 引入了對Romulus
的 GPIO
json
配置。
{
"gpio_configs": {
"power_config": {
"power_good_in": "SYS_PWROK_BUFF",
"power_up_outs": [
{ "name": "SOFTWARE_PGOOD", "polarity": true},
{ "name": "BMC_POWER_UP", "polarity": true}
],
"reset_outs": [
]
}
},
"gpio_definitions": [
{
"name": "SOFTWARE_PGOOD",
"pin": "R1",
"direction": "out"
},
{
"name": "BMC_POWER_UP",
"pin": "D1",
"direction": "out"
},
...
}
每一個機型必須定義相似的 json
配置來描述 GPIO
配置。
硬件檢測傳感器
硬件檢測傳感器(hwmon sensors)包括板卡上的傳感器(即溫度傳感器、風扇)以及 OCC
傳感器。配置文件路徑以及名稱必須於設備樹中的設備匹配。
在下面的文檔中具有一些細節: doc/architecture/sensor-architecture。
現在讓我們以 Romulus
為例,配置文件為 meta-romulus/recipes-phosphor/sensors,它包含板上傳感器以及 OCC
傳感器,其中板卡上的傳感器通過 i2c
訪問,OCC
傳感器通過 FSI
訪問。
-
w83773g@4c.conf 定義了
w83773
溫度傳感器,包含三個溫度LABEL_temp1 = "outlet" ... LABEL_temp2 = "inlet_cpu" ... LABEL_temp3 = "inlet_io"
這些設備定義為它的設備樹 w83773g@4c 中,當
BMC
啟動時,udev
規則將會啟動phosphor-hwmon
,它將基於sysfs
屬性創建在如下D-Bus
溫度傳感器對象:/xyz/openbmc_project/sensors/temperature/outlet /xyz/openbmc_project/sensors/temperature/inlet_cpu /xyz/openbmc_project/sensors/temperature/inlet_io
-
pwm-tacho-controller@1e786000.conf 定義了風扇以及配置於上面類似,不同點是,它創建
fan_tach
傳感器 -
occ-hwmon.1.conf 為主
CPU
定義了occ
硬件檢測傳感器,這個配置有點不同,它必須告知phosphor-hwmon
讀取標識,而不是直接獲取傳感器的索引,因為CPU
內核以及DIMMs
可以是動態的,即CPU
核可以被關閉,DIMMs
可以被取出MODE_temp1 = "label" MODE_temp2 = "label" ... MODE_temp31 = "label" MODE_temp32 = "label" LABEL_temp91 = "p0_core0_temp" LABEL_temp92 = "p0_core1_temp" ... LABEL_temp33 = "dimm6_temp" LABEL_temp34 = "dimm7_temp" LABEL_power2 = "p0_power" ...
MODE_temp* = "label"
表示,如果要查看tempX
,必須讀取sensor id
即label
LABEL_temp* = "xxx"
表示,通過sensor id
獲取到的sensor name
- 比如,如果
temp1_input
為 37000 且temp1_label
在sysfs
中為 91,phosphor-hwmon
直到temp1_input
是sensor id
為 91 的值,即p0_core0_temp
,因此它將創建xyz/openbmc_project/sensors/temperatur/p0_core0_temp
,且其值為 37000 - 對於
Romulus
功率傳感器不需要讀取標識,因為所有的功率在系統上是可以獲取到的 - 對於
Witherspoon
,功率傳感器與溫度傳感器相似,它必須告知hwmon
讀取function_id
而不是直接獲取到傳感器的索引值
LED燈
一些部分涉及到了LED燈。
- 在內核設備樹中,必須描述
LEDs
,如在 romulus dts 描述了3盞LED
燈,故障燈、定位燈以及電源指示燈:leds { compatible = "gpio-leds"; fault { gpios = <&gpio ASPEED_GPIO(N, 2) GPIO_ACTIVE_LOW>; }; identify { gpios = <&gpio ASPEED_GPIO(N, 4) GPIO_ACTIVE_HIGH>; }; power { gpios = <&gpio ASPEED_GPIO(R, 5) GPIO_ACTIVE_LOW>; }; };
- 在機型層,
LEDs
必須通過yaml
進行配置,用以描述它們的功能,如在 Romulus led yaml 中:
它表示bmc_booted: power: Action: 'Blink' DutyOn: 50 Period: 1000 Priority: 'On' power_on: power: Action: 'On' DutyOn: 50 Period: 0 Priority: 'On' ...
LED
電源指示燈在BMC
啟動后閃爍,當主機上電之后常量。 - 在運行時,
LED
管理基於上面的yaml
配置自動設置LEDs
亮/滅/閃爍 LED
可以通過/xyz/openbmc_project/led/
手動的訪問,比如:- 獲取定位燈狀態:
curl -b cjar -k https://$bmc/xyz/openbmc_project/led/physical/identify
- 設置定位燈狀態為閃爍:
curl -b cjar -k -X PUT -H "Content-Type: application/json" -d '{"data": "xyz.openbmc_project.Led.Physical.Action.Blink" }' https://$bmc/xyz/openbmc_project/led/physical/identify/attr/State
- 獲取定位燈狀態:
- 當發生
FRU
相關的故障時,將在日志中創建一條帶有CALLOUT
路徑的事件日志,phosphor-fru-fault-monitor 檢測日志:- 當帶有
CALLOUT
路徑的故障發生時,修改相關燈的狀態 - 當日志顯式相關的事件解除或被刪除時,修改相關燈的狀態
- 當帶有
注意: 這個 yaml
配置可以通過 phosphor-mrw-tools 的MRW自動生成,詳情查看Witherspoon example
資產信息以及其他傳感器
資產信息,其他傳感器(比如 CPU/DIMM 溫度),以及 FRU
在 ipmi
的 yaml
配置文件中定義。
比如,meta-romulus/recipes-phosphor/ipmi
romulus-ipmi-inventory-map
定義了常規的資產信息,如,CPU,內存,母板等phosphor-ipmi-fru-properties
定義了額外的資產信息屬性phosphor-ipmi-sensor-inventory
定義了 IPMI 的傳感器romulus-ipmi-inventory-sel
定義了 IPMI SEL 使用的資產
對於資產映射以及FRU屬性,它們在不同的系統下都十分相似,你可以參考這些例子,並制作自己的系統。
對於 ipmi-sensor-inventory
,IPMI 中的傳感器因系統而異,因此你需要定義你自己的傳感器,比如:
0x08:
sensorType: 0x07
path: /org/open_power/control/occ0
...
0x1e:
sensorType: 0x0C
path: /system/chassis/motherboard/dimm0
...
0x22:
sensorType: 0x07
path: /system/chassis/motherboard/cpu0/core0
第一個值 0x08
,0x1e
,0x22
是 IPMI 的 sensor id
,在 MRW 中定義。你應該遵從系統的 MRW 來定義上面的配置。
注意: yaml
配置可以自動從它的 MRW 的 phosphor-mrw-tools 中自動生成,詳情查看 Witherspoon example
風扇
phosphor-fan-presence 管理所有的風扇有關的服務:
phosphor-fan-presence
檢查風扇是否在位,在資產信息中創建風扇D-Bus
對象,並更新Present
狀態屬性phosphor-fan-monitor
檢測風扇是否有效,並更新D-Bus
對象中的Functional
資產屬性phosphor-fan-control
按照條件設置風扇速度目標(如,基於溫度)來設置風扇轉速phosphor-cooling-type
通過設置/xyz/openbmc_project/inventory/system/chassis
對象屬性,檢測並設置系統是風冷還是水冷
所有上面的服務都是可配置的,比如通過 yaml
配置,因此在移植 OpenBMC
到新的系統時,機型相關的配置必須寫入。
以 Romulus
為例,它是風冷且具有3個風扇,無 GPIO 在位檢測的。
風扇在位
Romulus
沒有 GPIO 在位檢測,因此它通過檢測風扇轉速傳感器:
- name: fan0
path: /system/chassis/motherboard/fan0
methods:
- type: tach
sensors:
- fan0
yaml
配置表示:
- 它必須在資產中創建
/system/chassis/motherboard/fan0
對象 - 它必須檢測
fan0
轉速傳感器 (/sensors/fan_tach/fan0
) 來設置fan0
對象的Present
屬性
風扇監測
Romulus
風扇使用 pwm
實現風扇速度控制,pwm
范圍為 0-255,風扇速度為 0-7000。因此它需要一個一個機制將 pwm
轉換為 speed
- inventory: /system/chassis/motherboard/fan0
allowed_out_of_range_time: 30
deviation: 15
num_sensors_nonfunc_for_fan_nonfunc: 1
sensors:
- name: fan0
has_target: true
target_interface: xyz.openbmc_project.Control.FanPwm
factor: 21
offset: 1600
這個 yaml
配置表示:
- 它必須使用
FanPwm
作為轉速傳感器的目標接口 - 它必須以
target*21 + 1600
計算期望的風扇速度 - 偏差是 15$,因此如果風扇速度在期望的工作范圍外工作超過30秒,
fan0
必將被設置為無效風扇
風扇控制
風扇控制服務需要4個 yaml
配置文件:
-
zone-condition
定義制冷區條件,Romulus
總是通過風冷制冷,因此配置比較簡單,定義為air-cooled-chassis
- name: air_cooled_chassis type: getProperty properties: - property: WaterCooled interface: xyz.openbmc_project.Inventory.Decorator.CoolingType path: /xyz/openbmc_project/inventory/system/chassis type: bool value: false
-
zone-config
定義制冷區,Romulus
只有一個區zones: - zone: 0 full_speed: 255 default_floor: 195 increase_delay: 5 decrease_interval: 30
它定義了風扇的滿轉速度以及默認地板速度,因此,全速狀態下,
pwm
將會設置為255;默認地板狀態下,將會設置為195 -
fan-config
定義了在哪個區需要控制哪個風扇,哪個目標接口必須使用,比如,下面的yaml
配置中,定義了fan0
必須在zone0
進行控制,必須使用FanPwm
接口:- inventory: /system/chassis/motherboard/fan0 cooling_zone: 0 sensors: - fan0 target_interface: xyz.openbmc_project.Control.FanPwm ...
-
event-config
定義了不同的事件,及事件處理。比如,在哪個溫度必須設置哪個風扇。這個配置有一點復雜,example event yaml 提供了示例與文檔,Romulus
例子如下:- name: set_air_cooled_speed_boundaries_based_on_ambient groups: - name: zone0_ambient interface: xyz.openbmc_project.Sensor.Value property: name: Value type: int64_t matches: - name: propertiesChanged actions: - name: set_floor_from_average_sensor_value map: value: - 27000: 85 - 32000: 112 - 37000: 126 - 40000: 141 type: std::map<int64_t, uint64_t> - name: set_ceiling_from_average_sensor_value map: value: - 25000: 175 - 27000: 255 type: std::map<int64_t, uint64_t>
在上面的
yaml
配置中,定義了在zone0_ambient
不同溫度下的風扇的地板以及天花板速度,如
i. 當溫度低於 27 攝氏度,地板速度為 85
ii. 當溫度在 27-32 攝氏度之間,地板速度為 112注意:
Romulus
風扇比較簡單,如果想看復雜的例子,可以參考 Witherspoon fan configurations,在這個例子有如下的額外配置:- 通過 GPIO 監測在位信息
- 通過 GPIO 監測風冷還是水冷
- 具有更多的傳感器及更多的事件
GPIOs
本小節主要關注於設備樹中必須監控的 GPIOs,比如:
- 一個 GPIO 可能表示一個主機故障點信號(host checkstop)
- 一個 GPIO 可能表示一個按鈕按下(button)
- 一個 GPIO 可能表示設備鏈接(device attach)
有 phosphor-gpio-presense
用來監測設備在位,phosphor-gpio-monitor
用於監測一個 GPIO。
設備樹中的 GPIO
所有監測的 GPIOs 必須在設備樹中進行描述,比如:
gpio-keys {
compatible = "gpio-keys";
checkstop {
label = "checkstop";
gpios = <&gpio ASPEED_GPIO(J, 2) GPIO_ACTIVE_LOW>;
linux,code = <ASPEED_GPIO(J, 2)>;
};
id-button {
label = "id-button";
gpios = <&gpio ASPEED_GPIO(Q, 7) GPIO_ACTIVE_LOW>;
linux,code = <ASPEED_GPIO(Q, 7)>;
};
};
如下的代碼描述兩個 GPIO 引腳,一個是 checkstop
另一個是 id-button
,引腳代碼來在aspeed-gpio.h:
#define ASPEED_GPIO_PORT_A 0
#define ASPEED_GPIO_PORT_B 1
...
#define ASPEED_GPIO_PORT_Y 24
#define ASPEED_GPIO_PORT_Z 25
#define ASPEED_GPIO_PORT_AA 26
...
#define ASPEED_GPIO(port, offset) \
((ASPEED_GPIO_PORT_##port * 8) + offset)
GPIO 在位
Witherspoon
以及 Zaius
具有 GPIO 在位的例子:
-
INVENTORY=/system/chassis/motherboard/powersupply0 DEVPATH=/dev/input/by-path/platform-gpio-keys-event KEY=104 NAME=powersupply0 DRIVERS=/sys/bus/i2c/drivers/ibm-cffps,3-0069
它監測 GPIO 引腳 104,作為
powersupply0
的在位情況,創建資產對象,並綁定或解除綁定驅動 -
INVENTORY=/system/chassis/pcie_card_e2b DEVPATH=/dev/input/by-path/platform-gpio-keys-event KEY=39 NAME=pcie_card_e2b
它監測 GPIO 引腳 39,作為
pcie_card_e2b
的在位情況,創建資產目標
GPIO 監測
通常的 GPIO 監測用來監測主機的故障點事件,或按鈕按下。
- checkstop monitor 是一個
OpenPOWER
機型的常用服務
默認情況下,它監測 GPIO 引腳 74,如果它觸發,將告知DEVPATH=/dev/input/by-path/platform-gpio-keys-event KEY=74 POLARITY=1 TARGET=obmc-host-crash@0.target
systemd
啟動obmc-host-crash@0.target
。
對於使用不同 GPIO 引腳作為故障監測點的,它簡單在meat-machine
層指定自己的配置文件,來覆蓋原有的默認的配置即可。
比如 Zaius's checkstop config.
注意: 當引腳觸發,phosphor-gpio-monitor
啟動目標並退出 - id-button monitor 是
Romulus
中的服務,用來監測定位按鈕按下
它監測 GPIO 引腳 135 按鈕按下,並啟動服務DEVPATH=/dev/input/by-path/platform-gpio-keys-event KEY=135 POLARITY=1 TARGET=id-button-pressed.service EXTRA_ARGS=--continue
id-button-pressed.service
,這個服務設置定位指示燈觸發相應的Assert
動作
注意: 它具有額外的參數--continue
,告知phosphor-gpio-monitor
按鈕按下后,不要退出,繼續工作