OurBMC 활용 문제 7: OpenBMC 프로세스 간 통신 D-Bus

칼럼 소개: "Playing with OurBMC"는 OurBMC 커뮤니티에서 제작한 지식 공유 칼럼으로, 주로 커뮤니티와 BMC 풀스택 기술에 관련된 기본 지식 공유에 중점을 두고 이론 원리부터 실무까지 지식 전달의 모든 측면을 다루고 있습니다. 운영. OurBMC 커뮤니티는 "Fun OurBMC" 칼럼을 통해 개발자들이 커뮤니티 문화, 개념, 특성에 대한 심층적인 이해를 얻을 수 있도록 돕고, BMC의 풀스택 기술에 대한 개발자들의 이해도를 높일 예정입니다.

"Fun OurBMC" 칼럼에 관심을 갖고 OurBMC 커뮤니티의 놀라운 세계를 함께 탐험해 보시기 바랍니다. 동시에 모든 개발자들이 "Playing OurBMC" 칼럼에 기여하고, 함께 배우고 발전하며, 칼럼을 지혜를 모으고 창의력을 자극하는 지식 정원으로 만들어가길 진심으로 바랍니다.

 OpenBMC 에서는  IPC(Inter-Process Communication)가 중요한 구성 요소이며, 가볍고 효율적인 IPC 메커니즘으로 D-Bus가 널리 사용됩니다. 이번 호에서는 이 통신 네트워크인 D-Bus의 위버에 중점을 둘 것입니다. 먼저 D-Bus가 제공하는 인터페이스와 주요 개념을 소개한다. 그런 다음 OpenBMC 커뮤니티 애플리케이션을 기반으로 D-Bus에 대한 보다 심층적인 분석을 수행합니다. D-Bus 분석을 통해 독자들이 이 강력한 IPC 메커니즘을 더 잘 이해하고 사용하여 시스템의 전반적인 성능과 안정성을 향상시킬 수 있기를 바랍니다.

D-버스 소개

D-Bus(데스크탑 버스)는 Linux 운영 체제에서 널리 사용되는 고급 IPC(프로세스 간 통신) 메커니즘입니다. 이를 통해 소프트웨어 애플리케이션은 동기식 또는 비동기식으로 통신하여 프로세스 간 메시지를 보내고 받을 수 있습니다. 기존 IPC 메커니즘(예: PIPE/FIFO/소켓/공유 메모리/SysvIpc)과 비교하여 D-Bus는 낮은 대기 시간, 낮은 오버헤드 및 고가용성 IPC 메커니즘은 기본 IPC 메커니즘의 복잡성을 숨기고 개발자에게 더욱 발전되고 사용하기 쉬운 인터페이스를 제공합니다.

  • 메소드 호출:

크로스 프로세스 메서드(함수) 호출을 구현하는 데 사용되며 코드 생성 도구와 결합하면 프로세스 간 함수 호출을 일반 함수 호출과 거의 구별할 수 없게 만들 수 있습니다.

  • 신호:

게시-구독(Pub-Sub) 모델의 통신 메커니즘인 송신 프로세스는 신호를 등록하고 전송(브로드캐스트)하며, 수신 프로세스는 관심 있는 신호를 구독합니다.

  • 속성:

C++ 클래스의 멤버 변수 Getter-Setter와 비교할 수 있습니다. 프로세스 A가 속성을 제공하면 다른 프로세스가 D-Bus를 통해 속성을 읽고 쓸 수 있습니다.

동시에, D-Bus 호출의 특정 객체를 결정하기 위해 다음 개념이 사용됩니다:

  • 버스 이름:

버스에 등록된 서비스 이름은 각 애플리케이션(또는 통신 개체)이 자신을 식별하는 데 사용하는 고유한 이름입니다. 이 이름은 D-Bus 시스템에 대해 전역적으로 고유하므로 다른 응용 프로그램에서 참조 및 통신을 위해 사용할 수 있습니다. 이는 lib 라이브러리의 이름과 유사하게 "IP" 주소로 이해될 수 있습니다.

  • 개체 경로:

D-Bus의 특정 애플리케이션이나 서비스 내의 개체를 식별하는 데 사용됩니다. 이는 파일 시스템의 경로와 유사하지만 파일 대신 D-Bus 개체에 사용됩니다. 개체 경로는 일반적으로 더 쉬운 구성과 관리를 위해 계층 구조를 따릅니다. 개체 경로의 명명 규칙은 /com/example/MusicPlayer1이며, 이는 "MusicPlayer1"이라는 응용 프로그램의 루트 개체를 나타냅니다. C++에서 같은 클래스의 객체(객체)와 비교할 수 있습니다.

  • 상호 작용:

인터페이스는 메소드, 속성 및 신호를 포함하여 D-Bus 객체가 제공하는 기능을 정의합니다. 인터페이스는 여러 객체로 구현될 수 있으며 여러 애플리케이션이나 서비스에서 사용될 수 있습니다. 인터페이스는 개체의 동작과 액세스 가능한 속성을 설명하는 C++의 클래스 또는 헤더 파일과 유사합니다. D-Bus에서 객체는 여러 인터페이스를 구현할 수 있으며 각 인터페이스에는 일련의 메서드, 속성 및 신호가 포함되어 있습니다. 이러한 메서드와 속성은 D-Bus를 통해 다른 애플리케이션이나 서비스에서 호출하거나 액세스할 수 있습니다.

D-버스 실제 응용

OpenBMC에서 D-Bus는 센서 데이터 수집, 하드웨어 오류 관리, 원격 관리 인터페이스와 같은 시나리오에서 널리 사용됩니다. 이는 다양한 구성 요소 간의 통신을 간단하고 효율적으로 만들어 시스템의 안정적인 작동을 강력하게 보장합니다.

다음은 OpenBMC 커뮤니티의 실제 적용을 기반으로 D-Bus에 대한 보다 심층적인 분석입니다.

  • D-Bus 도구(busctl)

Busctl은 D-Bus 시스템 버스와 상호 작용하기 위해 systemd에서 제공하는 명령줄 도구입니다. Busctl 도구를 사용하여 버스 이름, 객체 경로, 인터페이스 및 기타 매개변수를 입력하여 속성, 신호, 메소드 호출(메소드) 등을 포함하여 D-Bus 객체가 제공하는 세부 정보를 얻습니다. D-Bus의 다양한 추상 개념을 보다 직관적으로 이해할 수 있습니다.

  • 재산

ADCsensor 프로그램을 예로 들면, 이 과정은 구성 파일을 통해 칩 SOC를 식별하고, 커널에서 제공하는 ADC의 원래 값을 전압으로 변환하여, 에서 설명한 센서에 따라 D-Bus 형태로 표시하는 과정입니다. 구성 파일:

버스 이름: xyz.openbmc_project.ADCSensor

개체 경로: /xyz/openbmc_project/sensors/volt/xxx, 전압 센서를 나타내기 위해 보드 수준 구성 파일에 따라 여러 개체 경로가 생성됩니다.

인터페이스 1: xyz.openbmc_project.Sensor.Value

이 인터페이스에서 제공하는 속성:

MaxValue(이중형): 센서 최대값

MinValue(이중형): 센서 최소값

단위(문자열 유형): 값 유형, 볼트

Value(이중형): 센서의 현재값

인터페이스 2: xyz.openbmc_project.Sensor.Threshold.Critical

이 인터페이스에서 제공하는 속성:

CriticalAlarmHigh(부울 유형): 심각도가 높은 임계값에 도달했는지 여부

CriticalAlarmLow(부울 유형): 낮은 심각도 임계값에 도달했는지 여부

CriticalHigh(이중 유형): 임계 높음 임계값

CriticalLow(이중 유형): 매우 낮은 임계값

인터페이스 3: xyz.openbmc_project.Sensor.Threshold 경고.

이 인터페이스에서 제공하는 속성:

WarningAlarmHigh(부울 유형): 높은 경고 임계값에 도달했는지 여부

WarningAlarmLow(부울 유형): 낮은 경고 임계값에 도달했는지 여부

WarningHigh(이중 유형): 경고 임계값이 높음

WarningLow(이중 유형): 경고 낮은 임계값

이 시점에서 다른 애플리케이션 모듈은 이러한 추상화된 D-Bus 속성을 통해 관련 기능을 구현할 수 있습니다. 예를 들어, IPMI 센서 모듈은 IPMI SDR을 동적으로 생성할 수 있고, IPMI SEL 모듈은 속성을 모니터링하고 경보 로그를 생성하며, Redfish 모듈은 센서 redfish 인터페이스 등을 생성할 수 있습니다.

  • 신호

모든 D-Bus 객체에는 org.freedesktop.DBus.Properties 인터페이스와 그 아래에 PropertiesChanged 신호가 있습니다. 이 객체에 속한 모든 인터페이스의 속성이 변경되면 신호가 D-Bus로 전송됩니다. 신호의 내용 형식은 sa{sv}as이며 해당 의미는 다음과 같습니다.

문자열: 인터페이스 이름

DICT_ENTRY<STRING,VARIANT> 속성 이름 및 변경된 값의 ARRAY(복수)

ARRAY<STRING> 값이 변경되었지만 변경된 값을 알 수 없는 속성의 이름입니다. (다수의)

또한 모든 D-Bus 메시지에는 버스 이름과 개체 경로가 포함되며, 다른 프로세스에서는 모니터링을 위해 이러한 매개 변수를 자유롭게 선택하여 관심 있는 변수를 캡처할 수 있습니다.

  • 방법

D-Bus 버스에는 두 가지 유형의 메시지만 있습니다. 하나는 신호이고 다른 하나는 방법입니다. 둘 사이의 주요 차이점은 다음과 같습니다.

1. 신호는 버스에서 방송되는 반면, 방법은 특성 객체로 전송되는 메시지입니다.

2. 신호에는 반환 값이 없지만 Method에는 호출된 메서드가 반환 값을 정의하는지 여부에 따라 반환 값(동기 또는 비동기)이 있을 수 있습니다.

3. 신호는 주로 이벤트 알림에 사용되는 반면, 방법은 일반적으로 데이터를 요청하거나 작업을 수행하는 데 사용됩니다.

속성을 읽고 쓰는 것은 본질적으로 Dbus 표준 인터페이스 org.freedesktop.DBus.Properties 에서 Get 및 Set을 호출하는 방법 입니다.

네트워크 카드 IP 주소를 생성하는 방법을 예로 들어 보겠습니다.

버스 이름 : xyz.openbmc_project.Network

개체:/xyz/openbmc_project/network/<network_name>

인터페이스:xyz.openbmc_project.Network.IP.Create

방법:IP ssys:“<IP 프로토콜>:ipv6\ipv4”“<IP 주소>” “<넷마스크 접두사>” “<네트워크 게이트웨이>”, “새 IP 개체 경로”를 반환합니다.

Busctl 도구를 사용하여 IP를 만듭니다.

Busctl --verbose call xyz.openbmc_project.Network /xyz/openbmc_project/network/eth0 xyz.openbmc_project.Network.IP.IP 생성 ssys "xyz.openbmc_project.Network.IP.Protocol.IPv4" "10.10.10.192" 24 "10.10 .10.1"

반환 값:

메시지 "o" {

                OBJECT_PATH "/xyz/openbmc_project/network/eth0/_310_2e10_2e10_2e192_2f24";

};

xyz.openbmc_project.Network.IP.Create 인터페이스의 IP 메소드를 IP 정보를 입력하고, 네트워크 카드에 IP 주소를 추가하고, 새로 생성된 객체 경로를 반환하는 함수로 생각할 수도 있습니다.

문자열 IP(문자열 프로토콜, 문자열 ip_addr, 서명되지 않은 문자 넷마스크, 문자열 게이트웨이)

간단히 말해서 D-Bus는 OpenBMC의 프로세스 간 통신을 위한 중요한 메커니즘 중 하나입니다. 안정적이고 유연한 메시지 버스 시스템을 제공하여 다양한 프로세스와 애플리케이션이 서로 통신할 수 있도록 합니다. 이는 프로세스 간 통신의 복잡성을 단순화하고 많은 유용한 기능을 제공하여 OpenBMC 시스템의 안정성과 유지 관리성을 향상시킵니다.

OurBMC 커뮤니티를 팔로우하고 BMC 기술에 대해 자세히 알아보는 모든 분들을 환영합니다.

OurBMC 커뮤니티 공식 웹사이트:

https://www.ourbmc.cn/

"Qing Yu Nian 2"의 불법 복제된 리소스가 npm에 업로드되어 npmmirror가 unpkg 서비스를 중단하게 되었습니다. Zhou Hongyi: Google에 남은 시간이 많지 않습니다. time.sleep(6) 여기서는 어떤 역할을 합니까? 리누스는 "개사료 먹기"에 가장 적극적입니다! 새로운 iPad Pro는 12GB의 메모리 칩을 사용하지만 8GB의 메모리를 가지고 있다고 주장합니다. People's Daily Online은 사무용 소프트웨어의 마트료시카 스타일 충전을 검토합니다. "세트"를 적극적으로 해결해야만 Flutter 3.22 및 Dart 3.4 출시가 가능 합니다. 'ref/reactive'가 필요 없는 Vue3의 새로운 개발 패러다임, 'ref.value'가 필요 없음 MySQL 8.4 LTS 중국어 매뉴얼 출시: 데이터베이스 관리의 새로운 영역을 마스터하는 데 도움 Tongyi Qianwen GPT-4 수준 메인 모델 가격 인하 97% 증가, 1위안 200만 토큰
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/ourbmc/blog/11183508