2019/01/11

D-Bus(Desktop Bus)

D-Bus?

D-Bus은 Desktop Bus의 약자로 사용 목적은 어플리케이션 간의 IPC(Inter-Process Communication) 또는  RPC 프로토콜 을 제공하는 메시지 버스 시스템이다.
즉, 로컬 컴퓨터에서 통신하기 위한 목적이 강하다.
원래는 KDE의 DCOP에서 영향을 받아서 지금의 D-Bus가 생겨났음.
리눅스에서는 이전에 CORBA를 많이 사용했는데 지금은 D-Bus로 대체되었음.

자세히 D-Bus를 보니 Corba의 이벤트 서비스와 비슷한 느낌이다.
Corba event site: http://www1.erlang.org/documentation/doc-4.7.3/lib/orber-2.0/doc/html/ch_event_service.html

예를 들어 장비의 하드웨어 정보가 변경되면 HAL 데몬이 시그널을 발생하고 D-Bus를 통해서 해당 처리하는 어플리케이션의 객체로 전달된다는 것이다.

메세지 버스 시스템을 이용해 어플리케이션끼리 대화를 하는 간단한 방법이다.
칩셋에서 내부적인 통신뿐만 아니라 D-Bus는 상호적인 Life cycle 도와준다.
또한, 간단하고 신뢰성있는 single instance단위의 어플리케이션과 데몬을 코딩할수있게 만들어주며, 관련서비스가 실행되어야 할때 데몬과 어플리케이션이 실행될수있도록 도와준다.

구조
3 계층 구성.
라이브러리 libdbus가 최하위에 있고 메시지 전달하는 역활을 수행
메시지 버스 데몬 libdbus위에 구성되며 여러 어플리케이션과 접속하여 메시지를 처리한다. 발생/가입 패러다임을 사용.
특정 어플리케이션 프레임워크를 위한 포장된 라이브러리(wrapper library).

사용하는 곳이 어플리케이션 간, 데스크탑 세션와 운영체제 간에 주로 사용한다.
실제 사용하는 것을 보면 어플리케이션의 특정 객체로 메시지를 보내는 것으로 큰 그림에서는 CORBA와 비슷하다.
이는 주로 로컬에서 작동하는 것이 문제이다.
이는  unix domain socket를 사용하고 있기 때문이다.
이 부분은 원격 D-Bus(DBusRemote)로서 계획되고 있지만, 아직은 완벽하지는 않다.
현재 TCP/IP도 가능한 것 같지만 사용에 있어서 검증되지 않았다는 것 같다.
그리고 SSH forwarding, Proxy daemon, D-Bus over X에서 사용될 가능성이 있다.

즉, 아직까지 원격에서 사용하기에는 부적합하다. 나중에는 가능할지도..

간단한 용법

전체적인 흐름을 보면,
프로그램이 서비스를 제공하기 위해 등록을 한다.
이 등록은 데몬(dbus-daemon)에서 수행한다.
클라이언트 프로그램은 서비스를 확인하고 가입을 한다.
시스템에서 이벤트(사용자 로그인, 하드웨어 변경)가 발생하면 데몬이 이를 감지하고 해당 이벤트에 가입된 클라이언트 프로그램으로 메시지를 전달한다.

메시지가 원하는 목적 객체로 가기 위해서 D-Bus는 디렉토리 구조와 비슷한 명명 규칙을 사용한다.
이는 읽기쉬운 형태로 되어 있어서 보기 편하다.
예를 들어 /org/kde/kspread/sheets/3/cells/4/5로 되어 있다.
이는 프로그램 내에 특정 객체의 특정 객체를 표시한다.
물론 내부용으로 사용되는 명명법도 있다. 예를 들어 /com/mycompany/c5yo817y0c1y1c5b도 가능하다.

추가로

D-Bus는 최하위 libdbus와는 별개로 D-Bus 프로토콜을 만족하는 다른 구현 라이브러리가 있다고하니 참고하면 좋을 것 같다.
libdbus로 사용하기에는 작업이 많아지고 고려할 것이 많아지는 단점이 있다.
Windows용으로도 포팅되어 있지만, 아직 베타 상태라서 바로 사용하기에는 어려움이 있다.
이름은 winDBus로 되어 있다.
릴리즈된 일자도 한참이어있는데 아직 현재(2010.03)까지 갱신이 안되는 것을 보면, 작업이 더딘것 같다.

결론
CORBA를 보던 중에 D-Bus가 눈에 들어왔지만,
아직까지 원격에 대한 지원이 미미하여 사용하는데 문제가 많이 발생할 것 같다.
사실 CORBA는 무겁고, 기능이 워낙 많다보니 필요없는 것도 많아서 경량화된 목적으로 사용하기 부적합 할 수도 있다.
그래서 CORBA에서도 임베디드 목적의 CORBA가 나오고 있기는 하다.
그러나 크기는 크다. 최근 속도도 괜찮고 가볍다고 하는 omniORB를 사용했는데 실재 빌드해서 나온 바이너리가 의외로 크며, 부수적으로 설치해야할 라이브러리도 많았다.
그렇다고 해서 정적으로 빌드해서 전체 크기를 줄인다고 해도 다른 어플에서도 사용하기에 그 크기는 더 커질 것이다.
그냥 대충 봐도 기본적으로 5MB가 된다.
임베디드에서는 쉽게 넘어갈 크기는 아니다.
물론 일반 데스크탑 용이면 문제는 없다. 그렇다고 해서 D-Bus도 직업 확인해보지 않아서 어떻게 될지는 모르겠다. 선택은 자신의 몫이다.
마지막으로 라이센스는 GPL 또는 AFL(Academic Free License)이다.

libdbus:
 두 응용프로그램 간의 연결 및 메세지 교환을 할 수 있도록 한다.

message bus daemon 실행 파일:
 libdbus를 기반으로 하여 제작되었으며 여러개의 응용프로그램에서 연결이 가능하다.
 데몬은 응용프로그램으로부터 메세지를 전송받아 다른 응용프로그램으로 전송한다.

wrapper library or binding:
 libdbus-glib, libdbus-qt 등 특정 어플리케이션 프레임워크 혹은 파이썬과 같은 언어에 wrapping/binding 가능하다.
 D-Bus 프로그래밍을 쉽게 할 수 있도록 도와준다.
 즉 libdbus는 high-level binding을 위해 low-level backend로 다루어진다고 볼 수 있다.
 많은 libdbus api가 binding을 위해 만들어졌다.

 libdbus는 오직 one-to-one 연결만 지원하지만 라우터 역할을 하는 message bus daemon과 message를 이용한다면 제약을 극복할 수 있다.

댓글 없음:

댓글 쓰기