Linux 데스크톱에서 D-Bus 문제

발행: (2025년 12월 16일 오전 04:07 GMT+9)
8 min read

Source: Hacker News

D‑Bus란 무엇인가?

모두가 D‑Bus에 대해 들어봤지만, 실제로 무엇인지 아시나요?

D‑Bus의 아이디어는 간단합니다: 애플리케이션, 서비스 및 기타 것들이 메서드나 속성을 버스라는 한 곳에 노출하도록 하여 다른 앱이 이를 찾아 사용할 수 있게 하는 것입니다.

예를 들어, 날씨 모니터링 서비스가 버스에 날씨 API를 노출할 수 있습니다. 그러면 어떤 애플리케이션이든 그 서비스를 발견하고 사용할 수 있게 되며, 각 앱이 별도로 날씨 제공자와 통신 로직을 구현할 필요가 없습니다.

무엇이 잘못됐는가?

D‑Bus는 관대하고, 조직되지 않으며, 관용적인 버스입니다. 이러한 특성은 근본적인 개념적 문제를 야기합니다:

  • 버스에 있는 객체는 원하는 것을 자유롭게 등록할 수 있습니다.
  • 객체는 원하는 방식으로, 원하는 시점에, 원하는 것을 호출할 수 있습니다.
  • 프로토콜은 벤더‑특정 검증되지 않은 쓰레기를 허용하고 심지어 장려합니다.

실제로 이는 **“쓰레기 입력, 쓰레기 출력.”**이라는 결과를 낳습니다.

D‑Bus 표준

Part 1

앱은 서로 통신해야 하지만, 문서는 흩어져 있거나 미완성, 혹은 읽기 어려운 경우가 많으며, 많은 클라이언트가 이를 무시합니다.

기존(종종 혼란스러운) 문서의 몇 가지 예시:

Image 1
Image 2
Image 3

표준은 엉망이며, 구현자는 자주 이를 따르지 않습니다.

Part 2

명세가 존재하더라도 강제력이 거의 없습니다. 임의의 데이터를 가진 익명 호출이 흔합니다.

스토리: xdg‑desktop‑portal‑hyprland를 작성하면서 포털 문서를 따라 필요한 D‑Bus 프로토콜을 구현했습니다. 구현은 정상적으로 동작했지만, “복원 토큰”(spec‑compliant 메커니즘)을 추가했을 때 이를 사용하는 애플리케이션이 없었습니다. 모두가 자체 문서가 없는 변형을 만들어 사용했으며, 저는 결국 KDE 구현을 그대로 복사해야 했습니다.

명세는 SelectSourcesStartrestore_token 속성을 광고하지만, 실제로는 어떤 앱도 이를 사용하지 않고 대신 restore_data 필드를 사용합니다.

Part 3

많은 프로토콜이 variant(a{sv} – 문자열‑variant 쌍의 배열) 에 의존합니다. 이렇게 느슨하게 타입이 지정된 데이터를 허용하면 앱이 무작위 정보를 보내고 상대편이 해석하기를 기대하게 되며, 이는 X atom과 유사한 반복적인 실패를 초래합니다.

Part 4

권한 관리가 사실상 없습니다. 모든 사용자가 모든 것을 볼 수 있고 어떤 메서드든 호출할 수 있습니다. “거부”라는 보편적인 개념이 없으며, 각 프로토콜이 자체 오류 처리를 정의해야 합니다. 이러한 보안 부재가 Flatpak 앱이 세션 버스를 볼 수 없는 주요 이유입니다.

Part 5

kwallet이나 gnome‑keyring 같은 비밀 저장소는 비밀번호로 잠금을 해제하고 디스크에 데이터를 암호화합니다. 하지만 잠금이 해제되면 버스에 있는 모든 애플리케이션이 사용자 인식 없이 저장된 모든 비밀을 읽을 수 있습니다.

이제는 충분합니다

저는 D‑Bus에 지쳤습니다. 세션(그리고 이후 시스템) 버스가 제 생태계에 유용할 수는 있지만, 현재 D‑Bus의 상태는 견딜 수 없습니다.

따라서 저는 D‑Bus의 여러 문제적 설계 선택을 피하면서, 처음부터 새로운 버스를 만들고 있습니다.

XKCD 927

새 시스템을 구현할 때 이 XKCD 만화를 인용하는 사람이 많지만, 상황은 다릅니다. Wayland에서는 X11을 떠나면 X11 세션을 Wayland 세션과 동시에 실행할 수 없습니다. 그러나 D‑Bus와 유사한 세션 버스를 여러 개(두 개, 세 개, 그 이상) 동시에 실행할 수 있습니다. 프록시 클라이언트가 이들 사이를 번역하면 점진적인 마이그레이션이 가능해집니다.

Wire

제가 먼저 집중한 구성 요소는 **hyprwire*이며, 이는 hyprlauncher, hyprpaper 등 Hypr 도구들을 위한 와이어 프로토콜입니다.

와이어 프로토콜의 주요 강점:

  • 일관성: 타입과 메시지 인수가 강제됩니다; a{sv}나 “뭐든 보내라” 같은 것이 없습니다.
  • 단순성: 빠르고 직관적이며 복잡한 구조체 타입이 없습니다.
  • 속도: 빠른 핸드쉐이크와 프로토콜 교환; 연결이 신속하게 설정됩니다.

Hyprwire는 이미 hyprpaper, hyprlauncher, 그리고 hyprctl의 일부에서 IPC 용도로 사용되고 있습니다.

Bus

버스 자체는 **hyprtavern**라고 합니다. 이는 D‑Bus를 직접 대체하는 것은 아니지만 비슷한 목적을 수행합니다.

  • 애플리케이션은 버스에 객체를 등록하고, 해당 객체가 정의한 프로토콜과 핵심 속성을 노출합니다.
  • 다른 애플리케이션은 버스에 연결해 이러한 객체들을 발견할 수 있습니다.

이 모델에서 hyprtavern은 선술집과 같습니다: 각 앱은 다른 앱이 등록한 객체와 상호작용할 수 있는 클라이언트가 됩니다.

Back to Blog

관련 글

더 보기 »

D-Bus는 Linux 데스크톱에 대한 치욕이다

D-Bus란 무엇인가? 모두가 D-Bus에 대해 들어봤지만, 실제로 그것이 무엇인지 궁금하다. D-Bus의 아이디어는 꽤 간단하다: 애플리케이션, 서비스 및 기타 요소들이 메소드를 노출하도록 하는 것이다.

결정론은 지능의 반대가 아니다

소개 현대 시스템에서는 종종 비결정성을 기능으로 취급합니다. 무언가가 예측할 수 없게 행동하면 우리는 그것을 “emergent” 또는 “complex”라고 라벨링합니다. 그…