D버스

D-Bus
D버스
개발자레드햇
초기 릴리즈2006년 11월, 15년 전(2006-11)
안정된 릴리스
1.14.0 / 2022년 2월 28일; 5개월 전(2022-02-28)[1]
프리뷰 릴리즈
1.15.0 / 2022년 2월 28일; 5개월 전(2022-02-28)[2]
저장소
기입처C
운영 체제크로스 플랫폼
유형
면허증.GPLv2+ 또는 AFL 2[3].1
웹 사이트www.freedesktop.org/wiki/Software/dbus

컴퓨팅에서 D-Bus ("데스크탑 버스"[4]의 줄임말)는 메시지 지향 미들웨어 메커니즘으로, 동일한 [5][6]기계에서 동시에 실행되는 여러 프로세스 간에 통신할 수 있습니다.D-Bus는 GNOME과 KDE와 [7][8][dead link]같은 Linux 데스크톱 환경에서 제공하는 서비스를 표준화하기 위해 Red Hat의 Harvac Pennington에 의해 시작된 freedesktop.org 프로젝트의 일부로 개발되었습니다.

또한 freedesktop.org 프로젝트는 libdbus라고 불리는 자유 오픈 소스 소프트웨어 라이브러리를 규격의 레퍼런스 구현으로 개발하였습니다.GDBus(GNOME),[9] QtDBus(QT/KDE),[10] dbus-java[11] 및 sd-bus(systemd[12]일부) 등 D-Bus 사양의 다른 구현도 존재하므로 이 라이브러리는 D-Bus 자체와 혼동하지 마십시오.

개요

D-Bus는 GNOME KDE Linux 데스크톱 환경(각각 [13][14]CORBA 및 DCOP)에서 사용되는 소프트웨어 컴포넌트 통신 시스템을 대체하도록 설계된 프로세스 간 통신(IPC) 메커니즘입니다.이러한 데스크톱 환경의 컴포넌트는 보통 많은 프로세스로 분산되어 있으며, 각 프로세스에서 제공하는 서비스는 몇 개(보통 1개)에 지나지 않습니다.이러한 서비스는 일반 클라이언트 애플리케이션 또는 데스크톱 환경의 다른 컴포넌트에서 작업을 수행하기 위해 사용할 수 있습니다.

Processes without D-Bus
D-Bus가 없는 프로세스
Processes with D-Bus
D-Bus와 같은 프로세스
대규모 공동 프로세스 그룹에서는 (1 대 1의 IPC 방식을 사용하여) 개별 통신 채널의 밀도 높은 메쉬가 이들 사이에 요구됩니다.D-Bus는 단일 공유 채널로 IPC 요건을 간소화합니다.

관련된 프로세스의 수가 많기 때문에(서비스와 클라이언트에 액세스 하는 프로세스를 추가하는 것) 모든 프로세스 간에 일대일 IPC를 확립하는 것은 비효율적이고 매우 신뢰할 수 없는[citation needed] 접근법이 됩니다.대신 D-Bus는 단일 공유 가상 [6]채널을 통해 프로세스 그룹 간의 모든 통신을 수집하는 소프트웨어 버스 추상화를 제공합니다.버스에 접속되어 있는 프로세스에서는 내부 구현 방법을 알 수 없지만, D-Bus 사양에서는 버스에 접속되어 있는 모든 프로세스가 버스를 통해 서로 통신할 수 있음을 보증합니다.

Linux 데스크톱 환경에서는 여러 버스를 인스턴스화함으로써 D-Bus 기능을 활용합니다.특히 [15][6][16]다음과 같습니다.

  • 시스템 서비스(운영체제 및 시스템 데몬에서 제공하는 서비스 등)에 대한 접근을 제공하는 시스템의 모든 사용자와 프로세스가 이용할 수 있는 단일 시스템 버스
  • 각 사용자 로그인 세션용 세션버스: 동일한 데스크톱 세션의 사용자 애플리케이션에 데스크톱 서비스를 제공하고 데스크톱 세션 전체를 통합할 수 있습니다.

접근이 허가되어 있는 한 프로세스는 임의의 수의 버스에 접속할 수 있습니다.실제로는 모든 사용자 프로세스가 시스템버스와 현재 세션버스에 접속할 수 있지만 다른 사용자의 세션버스나 같은 사용자가 소유한 다른 세션버스에는 접속할 수 없습니다.후자의 제한은 모든 사용자 세션을 단일 사용자 [17]버스에 결합하면 향후 변경될 수 있습니다.

D-Bus는 정보 공유, 모듈화, 권한 분리 등의 기존 기능을 애플리케이션에 추가 또는 단순화합니다.예를 들어, Bluetooth 또는 Skype 를 개입시켜 수신한 착신 보이스 콜의 정보는, 현재 동작하고 있는 음악 플레이어에 의해서 전파 및 해석할 수 있습니다.음악 플레이어는, 음량을 뮤트 하거나 [18]콜이 종료할 때까지 재생을 일시 정지하는 것으로 응답할 수 있습니다.

D-Bus는 사용자 애플리케이션의 여러 구성 요소를 통합하는 프레임워크로도 사용할 수 있습니다.를 들어 오피스 스위트는 세션버스를 통해 통신하여 워드프로세서스프레드시트 간에 데이터를 공유할 수 있습니다.

D-Bus 사양

버스 모델

버스에 대한 모든 연결은 D-Bus 컨텍스트에서 버스 [5]이름으로 식별됩니다.버스 이름은 두 개 이상의 도트로 구분된 문자, 숫자, 대시 및 밑줄 문자열로 구성됩니다.유효한 버스 이름의 예는 다음과 같습니다.org.freedesktop.NetworkManager를 클릭합니다.[6]

프로세스가 버스에 대한 연결을 설정할 때 버스는 연결에 고유 연결 [16][6]이름이라는 특수 버스 이름을 할당합니다.이러한 유형의 버스 이름은 불변하며, 연결이 존재하는 한 변경되지 않으며, 더 중요한 것은 버스 [5][16][6]수명 동안 재사용할 수 없다는 것입니다.즉, 같은 프로세스가 버스에 대한 접속을 셧다운하고 새로운 접속을 작성하더라도 해당 버스에 대한 다른 접속에는 이러한 고유한 접속명이 할당되지 않습니다.고유한 연결 이름은 콜론 [16][6]문자로 시작하므로 쉽게 인식할 수 있습니다.고유한 연결 이름의 예는 다음과 같습니다.:1.1553(콜론 뒤의 문자는 특별한[16] 의미가 없습니다).

요청된 이름이 버스에 대한 다른 연결에서 이미 사용되고 있지 않은 경우 프로세스에서 [16]연결에 대한 추가 버스 이름을 요구할 수 있습니다.D-Bus 용어로 버스 이름이 연결에 할당되면 해당 연결이 버스 [5][16]이름을 소유한다고 합니다.그런 의미에서 버스 이름을 동시에 두 개의 연결로 소유할 수는 없지만 고유한 연결 이름과 달리 이러한 이름을 사용할 수 있는 경우 재사용할 수 있습니다. 즉, 프로세스가 의도적으로 릴리스된 버스 이름을 다른 [5][6]프로세스에 의해 회수할 수 있습니다.

일반적으로 잘 알려진 이러한 추가 버스 이름의 배후에 있는 아이디어는 미리 정해진 버스 [16][6]이름을 사용하여 서비스를 참조하는 방법을 제공하는 것입니다.예를 들어, 시스템버스의 현재 시각과 날짜를 보고하는 서비스는 접속이 소유하는 프로세스에 있습니다.org.substesktop.substate1 버스 이름(어느 프로세스인지에 관계없이)

버스 이름은 단일 인스턴스 응용 프로그램을 구현하는 간단한 방법으로 사용할 수 있습니다(두 번째 인스턴스는 버스 이름이 [16]이미 사용되었음을 감지함).또한 프로세스 [16]종료로 인해 버스 이름이 공개되면 버스가 알림을 보내기 때문에 서비스 프로세스 라이프사이클 추적에도 사용할 수 있습니다.

오브젝트 모델

D-Bus는 여러 구성 요소 지향 통신 시스템을 대체한다는 본래의 개념 때문에, 클라이언트와 서비스 사이의 통신의 의미를 표현하는 객체 모델을 이전 모델과 공유합니다.D-Bus 객체 모델에서 사용되는 용어는 일부 객체 지향 프로그래밍 언어에서 사용되는 용어와 유사합니다.그렇다고 해서 D-Bus가 OOP 언어로 제한되는 것은 아닙니다.실제로 가장 많이 사용되는 구현(libdbus)은 절차 프로그래밍 언어인 C로 작성됩니다.

D-Feet를 사용하여 D-Bus 버스 내의 기존 버스 이름, 객체, 인터페이스, 메서드 및 신호 참조

D-Bus에서 프로세스는 객체를 노출함으로써 서비스를 제공합니다.이러한 개체에는 호출 가능한 메서드와 개체가 방출할 [16]수 있는 신호가 있습니다.메서드와 신호는 집합적으로 오브젝트의 [5]멤버라고 불립니다.버스에 연결된 클라이언트는 메서드를 사용하거나 요청을 하거나 오브젝트에 [16]액션을 수행하도록 명령함으로써 오브젝트와 상호 작용할 수 있습니다.예를 들어 클라이언트는 현재 날짜와 시간을 반환하는 메서드를 사용하여 시간 서비스를 나타내는 개체를 쿼리할 수 있습니다.또한 클라이언트는 특정 이벤트(일반적으로 기본 서비스와 관련된)로 인해 객체의 상태가 변경되었을 때 객체가 발신하는 신호를 수신할 수도 있습니다.예를 들어 USB나 네트워크 드라이버 등의 하드웨어 디바이스를 관리하는 서비스가 "새로운 하드웨어 디바이스 추가" 이벤트를 알리는 경우가 있습니다.클라이언트는 특정 객체로부터 특정 신호를 수신하는 데 관심이 있음을 버스에 지시해야 합니다.D 버스 버스는 [6]등록된 관심을 가진 프로세스에만 신호를 전달하기 때문입니다.

D-Bus 버스에 연결된 프로세스는 D-Bus 객체를 원하는 수만큼 내보내도록 요청할 수 있습니다.각 개체는 개체 경로, 숫자, 문자 및 밑줄 문자열로 식별되며 슬래시 문자로 구분되어 접두사가 붙습니다. 이러한 문자열은 UNIX [5][16]파일 시스템 경로와 유사하기 때문에 그렇게 불립니다.개체 경로는 요청 프로세스에 의해 선택되며 버스 연결 컨텍스트에서 고유해야 합니다.유효한 개체 경로의 예는 다음과 같습니다./org/kde/kspread/sheets/3/cells/4/5단, 오브젝트 [6]경로 내에 계층을 형성하는 것은 강제되지 않으며 권장되지도 않습니다.[16]서비스 객체에 대한 특정 명명 규칙은 전적으로 해당 서비스 개발자에게 달려 있지만, 많은 개발자는 프로젝트의 예약된 도메인 이름을 접두사로 사용하여 이름 공간을 지정합니다(예: /org/kde).[16]

모든 객체는 내보낸 특정 버스 연결과 불가분하게 관련지어져 있으며, D-Bus 관점에서는 이러한 연결의 컨텍스트에만 존재합니다.따라서 특정 서비스를 사용할 수 있으려면 클라이언트는 원하는 서비스를 제공하는 객체 경로뿐만 아니라 서비스 프로세스가 [5]버스에 연결되어 있는 버스 이름도 지정해야 합니다.이것에 의해, 버스에 접속되어 있는 복수의 프로세스가, 같은 오브젝트 패스를 가지는 다른 오브젝트를 명확하게 export 할 수 있습니다.

인터페이스[16]객체와 함께 사용할 수 있는 멤버(메서드와 신호)를 지정합니다.이는 Java 언어 인터페이스 [16][6]표기법과 유사한 도트로 구분된 이름으로 식별되는 메서드(통과 및 반환 매개 변수 포함)와 신호(파라미터 포함)의 선언 세트입니다.유효한 인터페이스명의 예를 다음에 나타냅니다.org.freedesktop.Introspectable유사하지만 인터페이스 이름 및 버스 이름은 틀리지 않습니다.[6]D-Bus 오브젝트는 여러 인터페이스를 구현할 수 있지만 적어도1개의 인터페이스를 구현해야 합니다.이것에 의해 정의되는 모든 메서드와 신호를 지원할 수 있습니다.오브젝트에 의해 구현된 모든 인터페이스의 조합을 오브젝트타입이라고 부릅니다.[5][16]

오브젝트를 사용할 때 클라이언트프로세스에서는 멤버 이름 외에 멤버의 인터페이스 이름을 제공하는 것이 좋습니다.다만, 오브젝트에[5][16] 의해서 실장된 다른 인터페이스로부터 사용할 수 있는 중복된 멤버명으로 인해 애매한 부분이 있는 경우에만 필요합니다.그렇지 않으면 선택한 멤버가 정의되지 않거나 잘못되어 버립니다.한편, 송신된 신호는, 어느 인터페이스에 속하는지를 항상 나타내야 합니다.

D-Bus 사양에서는 오브젝트가 독자적인 인터페이스 [15]외에 실장하고 싶은 표준 인터페이스도 몇 가지 정의하고 있습니다.기술적으로는 선택 사항이지만 대부분의 D-Bus 서비스 개발자는 인스펙션[6]같은 중요한 추가 기능을 D-Bus 클라이언트에 제공하기 때문에 내보낸 개체에서 이를 지원합니다.표준 인터페이스는 다음과 같습니다.[15][6]

  • org.http://desktop.DBus.Peer:는 D-Bus 연결이 [6]활성 상태인지 테스트하는 방법을 제공합니다.
  • org.http://desktop.DBus.Introspectable: 클라이언트 프로세스가 런타임에 개체가 구현하는 [16][15]인터페이스, 메서드 및 신호에 대한 설명을 XML 형식으로 가져올 수 있는 인스펙션 메커니즘을 제공합니다.
  • org.http://desktop.DBus.Properties: D-Bus 오브젝트는 기본 네이티브오브젝트 속성 또는 속성을 표시하거나 존재하지 [15]않는 경우 시뮬레이트할 수 있습니다.
  • org.http://desktop.DBus.ObjectManager: D-Bus 서비스가 개체를 계층적으로 배열할 때, 이 인터페이스는 단일 메서드 [15]호출을 사용하여 경로 아래의 모든 하위 개체와 인터페이스 및 속성에 대해 개체를 쿼리할 수 있는 방법을 제공합니다.

D-Bus 사양은 org.freedesktop에 있는 /org/freedesktop/DBUS 개체를 사용하여 실행되는 관리 버스 작업('버스 서비스'라고 함)을 정의합니다.DBus 버스 [15]이름각 버스는 이 특별한 버스 이름을 자체적으로 예약하고 버스 이름과 객체 경로의 조합에 대해 특별히 수행된 요청을 관리합니다.버스에 의해 제공되는 관리 조작은 객체의 인터페이스 org.freedesktop에 의해 정의된 조작입니다.DBus. 이러한 작업은 [5]버스 상태에 대한 정보를 제공하거나 잘 알려진 버스 [15][6]이름의 추가 요청 및 해제를 관리하는 데 사용됩니다.

커뮤니케이션 모델

D-Bus는 일반적인 고급 프로세스 간 통신 시스템으로 생각되었습니다.이러한 목표를 달성하기 위해 D-Bus 통신은 "원시 바이트"[5][16]가 아닌 프로세스 의 메시지 교환에 기반합니다.D-Bus 메시지는 프로세스가 버스를 통해 연결된 다른 프로세스로 전송할 수 있는 고급 이산 항목입니다.메시지는 명확하게 정의된 구조(payload로 전송되는 데이터 유형도 정의됨)를 가지고 있기 때문에 버스는 메시지를 검증하고 잘못된 형식의 메시지를 거부할 수 있습니다.이 점에서 D-Bus는 기존의 IPC 메커니즘보다 RPC 메커니즘에 가깝고 독자적인 타입 정의 시스템과 독자적인 마샬링[5]있습니다.

D-Bus를 통해 메서드를 호출하기 위한 일대일 요청-응답 메시지 교환의 예.여기서 클라이언트프로세스는 org.example.foo라는 이름의 서비스 프로세스에서 /org/example/object1 객체의 SetFoo() 메서드를 호출합니다.:1.14)을(를)

버스는 클라이언트와 서비스[5] 프로세스 간에 메시지를 교환하는2가지 모드를 지원합니다.

  • 일대일 요구 응답:이것은 클라이언트가 객체의 메서드를 호출하는 방법입니다.클라이언트는 개체를 내보내는 서비스 프로세스에 메시지를 보내고 서비스는 클라이언트프로세스에 [16]메시지로 회신합니다.클라이언트가 보내는 메시지에는 객체의 경로, 호출된 메서드의 이름(및 해당 인터페이스의 이름) 및 객체의 선택된 인터페이스에서 정의된 입력 파라미터 값(있는 경우)이 포함되어야 합니다.응답 메시지는 객체의 메서드 호출에 의해 반환된 출력 파라미터 값 또는 오류[5][16]있는 경우 예외 정보를 포함하여 요청 결과를 전달합니다.
  • 게시/구독:이것은 오브젝트가 관계자에게 신호의 발생을 알리는 방법입니다.객체의 서비스 프로세스는 객체의 신호에 [16]등록된 연결된 클라이언트에만 버스가 전달된다는 메시지를 브로드캐스트합니다.메시지는 객체 경로, 신호의 이름, 신호가 속한 인터페이스 및 신호의 파라미터 값(있는 경우)을 전달합니다.통신은 단방향입니다.발신자는 [5][16]수신자의 ID도 숫자도 모르기 때문에, 클라이언트프로세스로부터의 원래의 메시지에 대한 응답 메시지는 없습니다.

모든 D-Bus 메시지는 헤더와 [16]본문으로 구성됩니다.헤더는 메시지 유형, 발신인 및 메시지를 수신인에게 전달하기 위해 필요한 정보(행선지 버스 이름, 객체 경로, 메서드 또는 신호 이름, 인터페이스 이름 등)를 식별하는 여러 필드에 의해 형성됩니다.[16][15]본문에는 리시버 프로세스가 해석하는 데이터 페이로드(input 인수나 output 인수 등)가 포함됩니다.모든 데이터는 와이어 형식이라고 불리는 잘 알려진 바이너리 형식으로 인코딩되며, 이는 정수와 부동소수점 숫자, 문자열, 복합 유형 [15]등 다양한 유형의 직렬화를 지원합니다. 이 형식은 마샬링이라고도 합니다.

D-Bus 사양은 와이어 프로토콜을 정의합니다. 즉, D-Bus 연결 내의 프로세스 간에 교환되는 D-Bus 메시지를 구축하는 방법입니다.단, 이러한 메시지를 전달하기 위한 기본 전송 방식은 정의되지 않습니다.

내부

대부분의 기존 D-Bus 구현은 참조 구현 아키텍처를 따릅니다.이 아키텍처는 다음 2개의 주요 [5]컴포넌트로 구성됩니다.

  • 두 프로세스 간에 메시지를 교환하기 위해 D-Bus 와이어 프로토콜을 구현하는 포인트 투 포인트 통신 라이브러리.참조 실장에서는 이 라이브러리는 libdbus입니다.다른 구현에서는 libdbus가 다른 상위 수준의 라이브러리, 언어 바인딩에 의해 랩핑되거나 동일한 [19]목적을 수행하는 다른 독립형 구현에 의해 완전히 대체될 수 있습니다.이 라이브러리는 두 프로세스 [16]간의 일대일 통신만 지원합니다.
  • D-Bus 메시지버스 데몬으로 동작하는 dbus-daemon 프로세스.버스에 연결된 모든 프로세스는 버스와의 D-Bus 연결을 유지합니다.
    버스 역할을 하고 나머지 프로세스가 임의의 D-Bus 포인트 투 포인트 통신 라이브러리를 사용하여 접속하는 특수한 데몬 프로세스.이 프로세스는 버스에 연결된 프로세스에서 다른 프로세스로 메시지를 라우팅하기 때문에 메시지버스 [18]데몬이라고도 불립니다.참조 실장에서는 이 역할은 dbus-daemon에 의해 수행되며, dbus-daemon 자체는 libdbus 위에 구축됩니다.메시지 버스 데몬의 또 다른 구현은 sd-bus 위에 구축된 dbus-broker입니다.
Process A and B have a one-to-one D-Bus connection between them over a Unix domain socket
프로세스 A와 B는 Unix 도메인소켓 상에서 libdbus를 사용하여1 대 1의 D-Bus 접속을 확립합니다.메시지를 [20]직접 주고받는 데 사용할 수 있습니다.이 시나리오에서는 버스 이름이 [16]필요하지 않습니다.
Process A and B have both a one-to-one D-Bus connection with a dbus-daemon process over a Unix domain socket
프로세스 A와 B는 모두 Unix 도메인소켓 경유 libdbus를 사용하여 dbus-daemon에 접속되어 있습니다.메시지 버스 프로세스로 전송되는 메시지를 교환할 수 있으며, 메시지 버스 프로세스는 메시지를 적절한 프로세스로 전달합니다.이 시나리오에서는, 행선지 프로세스를 식별하기 위해서 버스명이 필요합니다.

libdbus 라이브러리(또는 그와 동등한 라이브러리)는 내부적으로 네이티브 하위 수준의 IPC 메커니즘을 사용하여 D-Bus 접속 양 끝에 있는2개의 프로세스 간에 필요한 D-Bus 메시지를 전송합니다.D-Bus 사양에서는 어떤 IPC 트랜스포트 메커니즘을 사용할 수 있어야 하는지를 규정하지 않습니다.이것은, D-Bus가 서포트하는 트랜스포트 방법을 결정하는 통신 라이브러리이기 때문입니다.예를 들어 Linux libdbus와 같은 Unix와 유사한 운영 체제에서는 일반적으로 Unix 도메인 소켓을 기본 전송 방법으로 사용하지만 TCP [5][16]소켓도 지원합니다.

두 프로세스의 통신 라이브러리는 선택된 전송 방법과 통신에 사용되는 특정 채널에 대해 합의해야 합니다.이 정보는,[6][16] D-Bus 가 주소를 호출하는 것에 의해서 정의됩니다.Unix-domain 소켓은 파일 시스템 객체이므로 파일 이름으로 식별할 수 있으므로 유효한 주소는 다음과 같습니다.unix:path=/tmp/.hiddensocket두 프로세스 간에 D-Bus 연결을 확립하려면 두 프로세스 모두 각각의 통신 라이브러리에 동일한 주소를 전달해야 합니다.[5][15]주소는 쉼표로 구분된 형태로 통신 라이브러리에 추가 데이터를 제공할 수도 있습니다.key=value예를 들어,[6][15] 이를 지원하는 특정 유형의 연결에 인증 정보를 제공할 수 있습니다.

D-Bus 버스 구현에 dbus-daemon 등의 메시지버스 데몬을 사용하는 경우 버스에 접속하는 모든 프로세스가 버스주소를 알아야 합니다.이 주소는 프로세스가 중앙 메시지버스 [5][16]프로세스에 대한 D-Bus 접속을 확립할 수 있는 주소입니다.이 시나리오에서는 메시지버스 데몬이 버스주소를 선택하고 나머지 프로세스는 해당 값을 대응하는 libdbus 또는 동등한 라이브러리에 전달해야 합니다.dbus-daemon은 제공하는 버스인스턴스마다 다른 버스주소를 정의합니다.이러한 주소는 데몬의 구성 파일에 정의되어 있습니다.

2개의 프로세스가 D-Bus 접속을 사용하여 [20]D-Bus 접속 간에 직접 메시지를 교환할 수 있지만, 이것은 일반적으로 D-Bus를 사용하는 방법이 아닙니다.통상적인 방법은 항상 메시지버스 데몬(dbus-daemon)을 각 프로세스가 포인트 투 포인트 D-Bus 접속을 확립하는 통신의 중심 포인트로 사용하는 것입니다.프로세스(클라이언트 또는 서비스)가 D-Bus 메시지를 전송하면 메시지버스 프로세스는 첫 번째 인스턴스에서 메시지를 수신하여 적절한 수신자에게 전달합니다.메시지 버스 데몬은 수신자 [16]프로세스에 대한 D-Bus 연결을 통해 메시지를 반복함으로써 각 메시지를 수신처에 전달하는 허브 또는 라우터로 간주될 수 있습니다.수신자 프로세스는 메시지 헤더 [15]필드의 수신처 버스 이름 또는 신호 전파 [6]메시지의 경우 메시지 버스 데몬에 의해 유지되는 신호에 대한 구독 정보에 의해 결정됩니다.메시지 버스 데몬은 존재하지 않는 버스 [16]이름으로 메시지를 보낸 프로세스에 대한 오류 메시지 등 특정 조건에 대한 응답으로 자체 메시지를 생성할 수도 있습니다.

dbus-daemon은 D-Bus 자체에서 이미 제공되는 기능 세트를 추가 기능으로 개선합니다.예를 들어, 서비스 액티베이션에서는 필요에 따라 서비스를 자동으로 시작할 수 있습니다.이러한 서비스의 버스명에 대한 첫 번째 요구가 메시지버스 [5]데몬에 도착했을 때 입니다.이렇게 하면 시스템 초기화 또는 사용자 초기화 단계에서 서비스 프로세스를 시작할 필요도 없고 사용하지 않을 때 메모리나 기타 리소스를 소비할 필요도 없습니다.이 기능은 원래 setuid [21]도우미를 사용하여 구현되었지만, 현재는 systemd의 서비스 액티베이션 [citation needed]프레임워크에서도 제공할 수 있습니다.서비스 액티베이션은 서비스의 프로세스 라이프 사이클 관리를 용이하게 하는 중요한 기능입니다(데스크탑 컴포넌트의 기동 또는 [16]정지 등).

역사와 채용

D-버스는 2002년 대혼란 페닝턴, 알렉스 라슨(레드햇), 앤더스 칼슨에 [8]의해 시작되었다.API가 안정적이라고 생각되는 버전 1.0은 2006년 [22][23]11월에 출시되었습니다.

dbus-daemon은 최신 Linux 그래픽 데스크톱 환경에서 중요한 역할을 합니다.

KDE 버전 2와 3에서 사용되는 DCOP 시스템의 영향을 많이 받은 D-Bus는 KDE 4 [23][24]릴리스에서 DCOP를 대체했습니다.D-Bus 구현은 대부분의 POSIX 운영 체제를 지원하며 Windows용 포트가 있습니다.Qt 4에 의해 사용되었고 이후 GNOME에 의해 사용되었습니다. GNOME에서는 초기 Bonobo 메커니즘의 대부분 부분을 점차 대체했습니다.Xfce에서도 사용됩니다.

초기 도입자 중 하나는 (현재는 더 이상 사용되지 않는) 하드웨어 추상화 계층이었습니다.HAL은 [8]D-Bus를 사용하여 컴퓨터에 추가 또는 제거된 하드웨어에 대한 정보를 내보냈습니다.

D-Bus의 사용은 데스크톱 환경의 초기 범위를 넘어 꾸준히 확대되어 점점 더 많은 양의 시스템 서비스를 커버하고 있습니다.예를 들어 Network Manager 네트워크 데몬, BlueZ 블루투스 스택 및 PulseAudio 사운드서버는 D-Bus를 사용하여 서비스의 일부 또는 전부를 제공합니다.systemdsystemctl과 systemd 간의 통신에 D-Bus 와이어 프로토콜을 사용하며, logind[25]같은 기존 시스템 데몬을 D-Bus 서비스로 홍보하고 있습니다.D-Bus의 또 다른 헤비 유저는 Polkit입니다.Polkit의 정책 권한 데몬은 시스템버스에 [26]연결된 서비스로 구현됩니다.

실장

libdbus

D-Bus에는 여러 가지 구현이 있지만 가장 널리 사용되는 것은 규격을 설계한 동일한 freedesktop.org 프로젝트에 의해 개발된 참조 구현 libdbus입니다.그러나 libdbus는 애플리케이션 개발자에 의해 직접 사용되는 것이 아니라 D-Bus의 다른 구현(데스크탑 환경의 표준 라이브러리 또는 프로그래밍 언어 바인딩에 포함된 것 등)을 위한 참조 가이드로 사용되는 낮은 수준의 구현입니다.freedesktop.org 프로젝트 자체는 애플리케이션 작성자에게 "고수준의 바인딩 또는 구현 중 하나를 사용할 것"을 권장합니다.[27]가장 많이 사용되는 D-Bus 구현으로서 libdbus가 우세하기 때문에 "D-Bus"와 "libdbus"라는 용어가 서로 호환되게 사용되어 혼동을 초래했습니다.

GDBus

GDBus는[9] GLIB에 포함GIO 스트림을 기반으로 한 D-Bus의 구현으로 GTK+GNOME에서 사용되는 것을 목표로 하고 있습니다.GDBus는 libdbus의 래퍼가 아니라 D-Bus 사양 및 프로토콜의 [28]완전하고 독립적인 재실장입니다.GTK+3 기반의 MATE[29] Desktop과 Xfce(버전 4.14)도 GDBus를 사용합니다.

QtDBus

QtDBus는[10] 버전 4.2 이후 Qt 라이브러리에 포함된 D-Bus 구현입니다.이 구성 요소는 시스템에서 사용할 수 있는 D-Bus 서비스에 액세스하는 데 KDE 응용 프로그램, 라이브러리 및 구성 요소가 사용합니다.

sd버스

2013년 systemd 프로젝트는 코드를 [30]단순화하기 위해 libdbus를 다시 작성했지만, 전체 D-Bus 성능도 크게 향상되었습니다.예비 벤치마크에서 BMW는 Systemd의 D-Bus 라이브러리가 성능을 360%[31] 향상시켰다는 것을 발견했습니다.systemd 버전221에서는 sd-bus API가 [32]안정되었다고 선언되었습니다.

libnih-dbus

libnih 프로젝트는 D-Bus에 대한 C 지원의 경량 "표준 라이브러리"를 제공합니다.또한 교차 컴파일을 잘 지원합니다.

kdbus

kdbus 는 문자 디바이스 [33][34]드라이버로서 실장됩니다.프로세스 간의 모든 통신은 의 특수 문자 디바이스 노드를 통해 이루어집니다./dev/kdbus(devfs 참조).

kdbus는 D-Bus를 커널 매개 P2P(peer-to-peer) 프로세스 간 통신 메커니즘으로 재실장하는 것을 목표로 한 프로젝트입니다.성능 향상 외에도 kdbus는 네임스페이스 및 감사,[31][35] 커널 매개, 레이스 조건 종료, 부트 및 [36]셧다운 시(systemd에서 필요에 따라) D-Bus를 사용할 수 있는 기타 Linux 커널 기능으로부터 얻을 수 있는 이점이 있습니다.Linux 커널에 kdbus를 포함시키는 것은 논란이 [37]많았으며, 보다 일반적인 프로세스 [38]간 통신으로서 BUS1에 유리하게 폐기되었다.

zbus

zbus는 D-Bus의 기본 Rust 라이브러리입니다.서비스와의 커뮤니케이션과 서비스 실장을 매우 쉽고 간단하게 하는 매크로가 강점이다.

프로토콜:데이터베이스

프로토콜:DBus는 네이티브 Perl D-Bus 클라이언트입니다.

언어 바인딩

Java, C#, Ruby, Perl 의 D-Bus용 프로그래밍 언어 바인딩이 [39]개발되었습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "D-Bus 1.14.x changelog". Retrieved 30 April 2022.
  2. ^ "NEWS file for current branch". Retrieved 30 April 2022.
  3. ^ Havoc's 블로그 2007년7월
  4. ^ Ward, Brian (2004). "14: A brief survey of the Linux desktop". How Linux Works: What Every Superuser Should Know (2 ed.). San Francisco: No Starch Press (published 2014). p. 305. ISBN 9781593275679. Retrieved 2016-11-07. One of the most important developments to come out of the Linux desktop is the Desktop Bus (D-Bus), a message-passing system. D-Bus is important because it serves as an interprocess communication mechanism that allows desktop applications to talk to each other [...].
  5. ^ a b c d e f g h i j k l m n o p q r s t u Vermeulen, Jeroen (14 Jul 2013). "Introduction to D-Bus". FreeDesktop.org. Retrieved 22 October 2015.
  6. ^ a b c d e f g h i j k l m n o p q r s t Cocagne, Tom (August 2012). "DBus Overview". pythonhosted.org. Retrieved 22 October 2015.
  7. ^ Vermeulen, Jeroen (14 Jul 2013). "Introduction to D-Bus". FreeDesktop.org. Retrieved 3 October 2015. D-Bus [...] is designed for use as a unified middleware layer underneath the main free desktop environments.
  8. ^ a b c Palmieri, John (January 2005). "Get on D-BUS". Red Hat Magazine. Archived from the original on 23 October 2015. Retrieved 3 November 2015.
  9. ^ a b "gdbus". GNOME developer. Retrieved 4 January 2015.
  10. ^ a b "QtDBus module". Qt Project. Retrieved 1 June 2015.
  11. ^ "DBus-Java Documentation". FreeDesktop.org. Retrieved 4 January 2015.
  12. ^ Poettering, Lennart (19 June 2015). "The new sd-bus API of systemd". Retrieved 21 October 2015.
  13. ^ Pennington, Havoc; Wheeler, David; Walters, Colin. "D-Bus Tutorial". Retrieved 21 October 2015. For the within-desktop-session use case, the GNOME and KDE desktops have significant previous experience with different IPC solutions such as CORBA and DCOP. D-Bus is built on that experience and carefully tailored to meet the needs of these desktop projects in particular.
  14. ^ Vermeulen, Jeroen (14 Jul 2013). "Introduction to D-Bus". FreeDesktop.org. Retrieved 3 October 2015. D-Bus was first built to replace the CORBA-like component model underlying the GNOME desktop environment. Similar to DCOP (which is used by KDE), D-Bus is set to become a standard component of the major free desktop environments for GNU/Linux and other platforms.
  15. ^ a b c d e f g h i j k l m Pennington, Havoc; Carlsson, Anders; Larsson, Alexander; Herzberg, Sven; McVittie, Simon; Zeuthen, David. "D-Bus Specification". Freedesktop.org. Retrieved 22 October 2015.
  16. ^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai Pennington, Havoc; Wheeler, David; Walters, Colin. "D-Bus Tutorial". Retrieved 21 October 2015.
  17. ^ Poettering, Lennart (19 June 2015). "The new sd-bus API of systemd". Retrieved 21 October 2015. we are working on moving things to a true user bus, of which there is only one per user on a system, regardless how many times that user happens to log in
  18. ^ a b Love, Robert (5 January 2005). "Get on the D-BUS". Linux Journal. Retrieved 14 October 2014.
  19. ^ "What is D-Bus?". FreeDesktop.org. Retrieved 29 October 2015. There are also some reimplementations of the D-Bus protocol for languages such as C#, Java, and Ruby. These do not use the libdbus reference implementation
  20. ^ a b "What is D-Bus?". FreeDesktop.org. Retrieved 29 October 2015. is built on top of a general one-to-one message passing framework, which can be used by any two apps to communicate directly (without going through the message bus daemon)
  21. ^ "D-BUS System Activation". FreeDesktop.org. Retrieved 18 February 2016.
  22. ^ Palmieri, John (9 Nov 2006). "[announce] D-Bus 1.0.0 "Blue Bird" released". dbus (Mailing list).
  23. ^ a b Molkentin, Daniel (12 November 2006). "D-Bus 1.0 "Blue Bird" Released". KDE News. Retrieved 3 November 2015.
  24. ^ Seigo, Aaron. "Introduction To D-BUS". KDE TechBase. Retrieved 3 November 2015.
  25. ^ Poettering, Lennart (19 June 2015). "The new sd-bus API of systemd". Retrieved 21 October 2015. Since systemd's inception it has been the IPC system it exposes its interfaces on.
  26. ^ "Polkit reference manual". FreeDesktop.org. Retrieved 3 November 2015.
  27. ^ "What is D-Bus?". FreeDesktop.org. Retrieved 5 January 2015. The low-level implementation is not primarily designed for application authors to use. Rather, it is a basis for binding authors and a reference for reimplementations. If you are able to do so it is recommended that you use one of the higher level bindings or implementations.
  28. ^ "Migrating to GDBus". GNOME Developer. Retrieved 21 October 2015. dbus-glib uses the libdbus reference implementation, GDBus doesn't. Instead, it relies on GIO streams as transport layer, and has its own implementation for the D-Bus connection setup and authentication.
  29. ^ "MATE: Roadmap". Retrieved 31 January 2019.
  30. ^ Poettering, Lennart (20 Mar 2013). "[HEADSUP] libsystemd-bus + kdbus plans". systemd-devel (Mailing list).
  31. ^ a b Edge, Jake (30 May 2013). "ALS: Linux inter-process communication and kdbus". LWN.net. Retrieved 21 October 2015.
  32. ^ Poettering, Lennart (19 Jun 2015). "[ANNOUNCE] systemd v221". systemd-devel (Mailing list).
  33. ^ "The unveiling of kdbus". LWN.net. 2014-01-13.
  34. ^ "Documentation/kdbus.txt (from the initial patch set)". LWN.net. 2014-11-04.
  35. ^ Corbet, Jonathan (13 January 2014). "The unveiling of kdbus". LWN.net. Retrieved 11 April 2014.
  36. ^ Kroah-Hartman, Greg (13 Apr 2015). "[GIT PULL] kdbus for 4.1-rc1". linux-kernel (Mailing list).
  37. ^ Corbet, Jonathan (22 April 2015). "The kdbuswreck". LWN.net. Retrieved 29 June 2015.
  38. ^ "Keynote: A Fireside Chat with Greg Kroah-Hartman, Linux Foundation Fellow". YouTube. 18 October 2016. Archived from the original on 2021-12-21.
  39. ^ "D-Bus Bindings". FreeDesktop.org. Retrieved 5 January 2015.

외부 링크