D-Bus는 실제로 어떤 용도로 사용되나요?

D-Bus는 실제로 어떤 용도로 사용되나요?

dbus"애플리케이션이 서로 대화할 수 있는 쉬운 방법"을 제공해야 합니다.

그러나 나는 그것이 실제로 무엇을 하는지 아직도 확신하지 못한다. 나는 그것이 유용하다고 본 적이 없으며 명령줄에서 터미네이터를 시작할 때와 같이 dbus특정 구성 요소에 오류가 발생했다는 경고만 보았습니다 dbus(오류를 볼 수 있도록).

Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files

NO_AT_BRIDGE=1에 추가하여 위의 오류를 제거했습니다 /etc/environment. 나는 그것이 무엇을 하는지 모른다.

거의 모든 GUI 응용 프로그램은 에서 작동하는 것 같습니다 dbus. 일부는 dbus, 즉 다음과 같이 실행을 허용합니다.

terminator --no-dbus

행동도 다르지 않은 것 같아요. 무엇이 작동을 멈추고 언제 terminator작동하지 않기 시작 해야 합니까 dbus?

또한, 어떤 것이 작동을 멈췄는지 확인하기 위해 다양한 dbus 구성 요소를 비활성화해 보았습니다.

나는 /etc/X11/Xsession.d/95dbus_update-activation-env단지 무슨 일이 일어나는지 보기 위해 삭제했습니다. 여기에는 다음 코드가 포함되어 있습니다.

if [ -n "$DBUS_SESSION_BUS_ADDRESS" ] && [ -x "/usr/bin/dbus-update-activation-environment" ]; then
  # subshell so we can unset environment variables
  (
    # unset login-session-specifics
    unset XDG_SEAT
    unset XDG_SESSION_ID
    unset XDG_VTNR

    # tell dbus-daemon --session to put the Xsession's environment in activated services' environments
    dbus-update-activation-environment --verbose --all
  )
fi

내가 아는 한 모든 것이 동일합니다. 위 스크립트의 목적은 무엇입니까?

어떤 상황에서 내 애플리케이션이 서로 통신하는 것이 유용합니까 dbus?

그것 없이는 실행할 수 없는 앱이 있습니까 dbus?

내 시스템은 Debian Buster이고 일반 오픈박스 환경을 사용하고 있습니다(Gnome이나 KDE와 같은 데스크톱 환경 없음).

답변1

dbus말씀하신 대로 애플리케이션 간 양방향 통신이 가능합니다.


당신이 언급한 구체적인 예의 경우 terminator. ~에서터미네이터 매뉴얼 페이지, 우리는 다음을 살펴봅니다:

--new-tab
    If this is specified and Terminator is already running, DBus 
    will be used to spawn a new tab in the first Terminator window.

따라서 다른 터미널(konsole, xterm, gnome-terminal)에서 이 작업을 수행하는 경우:

$ terminator &
$ terminator --new-tab &

첫 번째 명령이 새 창을 여는 것을 볼 수 있습니다. 두 번째 명령은 첫 번째 창에서 새 탭을 엽니다. 이는 dbus를 사용하여 첫 번째 프로세스를 찾고 새 탭을 열도록 요청한 다음 종료하는 두 번째 프로세스에 의해 수행됩니다.

다른 터미널에서 이 작업을 수행하는 경우:

$ terminator --no-dbus &
$ terminator --new-tab &

첫 번째 명령이 새 창을 여는 것을 볼 수 있습니다. 두 번째 명령은 첫 번째 창에 대한 dbus를 찾을 수 없으므로 새 창을 시작합니다. 이것을 테스트하기 위해 터미네이터를 설치했는데 사실입니다.

또한 폴킷(polkit)도 영향을 받을 것으로 생각됩니다. Polkit은 dbus를 사용하여 GUI 응용 프로그램의 권한을 높입니다. 이는 sudoGUI 세계와 같습니다. gnome에서 관리자 비밀번호를 묻는 메시지가 표시될 때 전체 화면이 가려지는 경우 이것이 Polkit의 기능입니다. .terminator--no-dbusterminator노력 에서 pkexec ls. 이는 ls높은 권한으로 실행됩니다. 이 옵션이 있는 경우와 없는 경우에 차이가 있는지 확인하세요 --no-dbus. 내 창 관리자(i3)에 polkit 에이전트가 없으므로 이 에이전트를 테스트할 수 없습니다.


나는 대부분 dbus의 시스템 측면을 알고 있으므로 나머지 대답은 여기에서 나옵니다.

그것 없이는 실행할 수 없는 앱이 있습니까 dbus?

예. 가져가다 systemctl. systemctl status문의사항이 "org.freedesktop.systemd1"귀하에게 발행되어 제시될 것입니다. systemctl startdbus 메소드가 호출되고 단위가 매개변수로 메소드에 전달됩니다. systemd전화에 응답하고 조치를 취하세요.

시스템 단위(예: foo.service)의 상태 변경에 대한 응답으로 조치를 취하려면 org.freedesktop.DBus.Propertiespath /org/freedesktop/systemd1/unit/foo_2eservice및 member 를 사용하여 인터페이스의 파일 설명자를 얻을 수 있습니다 PropertiesChanged. 해당 FD에 하나를 설정 inotify하면 갑자기 서비스 시작, 중지, 실패 등에 반응할 수 있는 방법이 생깁니다.

ssh.servicesystemd dbus의 특정 장치(예:)에서 사용 가능한 항목을 보려면 다음을 시도하십시오.

busctl introspect \
    org.freedesktop.systemd1 \
    /org/freedesktop/systemd1/unit/ssh_2eservice
NAME                                TYPE      SIGNATURE       RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable interface -               -                                        -
.Introspect                         method    -               s                                        -
org.freedesktop.DBus.Peer           interface -               -                                        -
.GetMachineId                       method    -               s                                        -
.Ping                               method    -               -                                        -
org.freedesktop.DBus.Properties     interface -               -                                        -
.Get                                method    ss              v                                        -
.GetAll                             method    s               a{sv}                                    -
.Set                                method    ssv             -                                        -
.PropertiesChanged                  signal    sa{sv}as        -                                        -
org.freedesktop.systemd1.Service    interface -               -                                        -
.AttachProcesses                    method    sau             -                                        -
.GetProcesses                       method    -               a(sus)                                   -
.AllowedCPUs                        property  ay              0                                        -
.AllowedMemoryNodes                 property  ay              0                                        -
.AmbientCapabilities                property  t               0                                        const
.AppArmorProfile                    property  (bs)            false ""                                 const
.BindPaths                          property  a(ssbt)         0                                        const
.BindReadOnlyPaths                  property  a(ssbt)         0                                        const
.BlockIOAccounting                  property  b               false                                    -
.BlockIODeviceWeight                property  a(st)           0                                        -
.BlockIOReadBandwidth               property  a(st)           0                                        -
.BlockIOWeight                      property  t               18446744073709551615                     -
.BlockIOWriteBandwidth              property  a(st)           0                                        -
.BusName                            property  s               ""                                       const
.CPUAccounting                      property  b               false                                    -
.CPUAffinity                        property  ay              0                                        const
.CPUAffinityFromNUMA                property  b               false                                    const
.CPUQuotaPerSecUSec                 property  t               18446744073709551615                     -
.CPUQuotaPeriodUSec                 property  t               18446744073709551615                     -
.CPUSchedulingPolicy                property  i               0                                        const
.CPUSchedulingPriority              property  i               0                                        const
.CPUSchedulingResetOnFork           property  b               false                                    const
.CPUShares                          property  t               18446744073709551615                     -
.CPUUsageNSec                       property  t               18446744073709551615                     -
.CPUWeight                          property  t               18446744073709551615                     -
.CacheDirectory                     property  as              0                                        const
.CacheDirectoryMode                 property  u               493                                      const
.CapabilityBoundingSet              property  t               18446744073709551615                     const
.CleanResult                        property  s               "success"                                emits-change
.ConfigurationDirectory             property  as              0                                        const
.ConfigurationDirectoryMode         property  u               493                                      const
.ControlGroup                       property  s               "/system.slice/ssh.service"              -
.ControlPID                         property  u               0                                        emits-change
.CoredumpFilter                     property  t               51                                       const
.DefaultMemoryLow                   property  t               0                                        -
.DefaultMemoryMin                   property  t               0                                        -
.Delegate                           property  b               false                                    -
.DelegateControllers                property  as              0                                        -
.DeviceAllow                        property  a(ss)           0                                        -
.DevicePolicy                       property  s               "auto"                                   -
.DisableControllers                 property  as              0                                        -
.DynamicUser                        property  b               false                                    const
.EffectiveCPUs                      property  ay              0                                        -
.EffectiveMemoryNodes               property  ay              0                                        -
.Environment                        property  as              0                                        const
.EnvironmentFiles                   property  a(sb)           1 "/etc/default/ssh" true                const
.ExecCondition                      property  a(sasbttttuii)  0                                        emits-invalidation
.ExecConditionEx                    property  a(sasasttttuii) 0                                        emits-invalidation
.ExecMainCode                       property  i               0                                        emits-change
.ExecMainExitTimestamp              property  t               0                                        emits-change
.ExecMainExitTimestampMonotonic     property  t               0                                        emits-change
.ExecMainPID                        property  u               835                                      emits-change
.ExecMainStartTimestamp             property  t               1597235861087584                         emits-change
.ExecMainStartTimestampMonotonic    property  t               5386565                                  emits-change
.ExecMainStatus                     property  i               0                                        emits-change
.ExecReload                         property  a(sasbttttuii)  2 "/usr/sbin/sshd" 2 "/usr/sbin/sshd" "… emits-invalidation
.ExecReloadEx                       property  a(sasasttttuii) 2 "/usr/sbin/sshd" 2 "/usr/sbin/sshd" "… emits-invalidation
.ExecStart                          property  a(sasbttttuii)  1 "/usr/sbin/sshd" 3 "/usr/sbin/sshd" "… emits-invalidation
.ExecStartEx                        property  a(sasasttttuii) 1 "/usr/sbin/sshd" 3 "/usr/sbin/sshd" "… emits-invalidation
.ExecStartPost                      property  a(sasbttttuii)  0                                        emits-invalidation
.ExecStartPostEx                    property  a(sasasttttuii) 0                                        emits-invalidation
.ExecStartPre                       property  a(sasbttttuii)  1 "/usr/sbin/sshd" 2 "/usr/sbin/sshd" "… emits-invalidation
.ExecStartPreEx                     property  a(sasasttttuii) 1 "/usr/sbin/sshd" 2 "/usr/sbin/sshd" "… emits-invalidation
.ExecStop                           property  a(sasbttttuii)  0                                        emits-invalidation
.ExecStopEx                         property  a(sasasttttuii) 0                                        emits-invalidation
.ExecStopPost                       property  a(sasbttttuii)  0                                        emits-invalidation
.ExecStopPostEx                     property  a(sasasttttuii) 0                                        emits-invalidation
.FileDescriptorStoreMax             property  u               0                                        const
.FinalKillSignal                    property  i               9                                        const
.GID                                property  u               4294967295                               emits-change
.Group                              property  s               ""                                       const
.GuessMainPID                       property  b               true                                     const
.IOAccounting                       property  b               false                                    -
.IODeviceLatencyTargetUSec          property  a(st)           0                                        -
.IODeviceWeight                     property  a(st)           0                                        -
.IOReadBandwidthMax                 property  a(st)           0                                        -
.IOReadBytes                        property  t               18446744073709551615                     -
.IOReadIOPSMax                      property  a(st)           0                                        -
.IOReadOperations                   property  t               18446744073709551615                     -
.IOSchedulingClass                  property  i               0                                        const
.IOSchedulingPriority               property  i               0                                        const
.IOWeight                           property  t               18446744073709551615                     -
.IOWriteBandwidthMax                property  a(st)           0                                        -
.IOWriteBytes                       property  t               18446744073709551615                     -
.IOWriteIOPSMax                     property  a(st)           0                                        -
.IOWriteOperations                  property  t               18446744073709551615                     -
.IPAccounting                       property  b               false                                    -
.IPAddressAllow                     property  a(iayu)         0                                        -
.IPAddressDeny                      property  a(iayu)         0                                        -
.IPEgressBytes                      property  t               18446744073709551615                     -
.IPEgressFilterPath                 property  as              0                                        -
.IPEgressPackets                    property  t               18446744073709551615                     -
.IPIngressBytes                     property  t               18446744073709551615                     -
.IPIngressFilterPath                property  as              0                                        -
.IPIngressPackets                   property  t               18446744073709551615                     -
.IgnoreSIGPIPE                      property  b               true                                     const
.InaccessiblePaths                  property  as              0                                        const
...skipping...
.CollectMode                        property  s               "inactive"                               const
.ConditionResult                    property  b               true                                     emits-change
.ConditionTimestamp                 property  t               1597235861034899                         emits-change
.ConditionTimestampMonotonic        property  t               5333881                                  emits-change
.Conditions                         property  a(sbbsi)        1 "ConditionPathExists" false true "/et… emits-invalidation
.ConflictedBy                       property  as              0                                        const
.Conflicts                          property  as              1 "shutdown.target"                      const
.ConsistsOf                         property  as              0                                        const
.DefaultDependencies                property  b               true                                     const
.Description                        property  s               "OpenBSD Secure Shell server"            const
.Documentation                      property  as              2 "man:sshd(8)" "man:sshd_config(5)"     const
.DropInPaths                        property  as              0                                        const
.FailureAction                      property  s               "none"                                   const
.FailureActionExitStatus            property  i               -1                                       const
.Following                          property  s               ""                                       -
.FragmentPath                       property  s               "/lib/systemd/system/ssh.service"        const
.FreezerState                       property  s               "running"                                emits-change
.Id                                 property  s               "ssh.service"                            const
.IgnoreOnIsolate                    property  b               false                                    const
.InactiveEnterTimestamp             property  t               0                                        emits-change
.InactiveEnterTimestampMonotonic    property  t               0                                        emits-change
.InactiveExitTimestamp              property  t               1597235861039525                         emits-change
.InactiveExitTimestampMonotonic     property  t               5338505                                  emits-change
.InvocationID                       property  ay              16 90 215 118 165 228 162 72 57 179 144… emits-change
.Job                                property  (uo)            0 "/"                                    emits-change
.JobRunningTimeoutUSec              property  t               18446744073709551615                     const
.JobTimeoutAction                   property  s               "none"                                   const
.JobTimeoutRebootArgument           property  s               ""                                       const
.JobTimeoutUSec                     property  t               18446744073709551615                     const
.JoinsNamespaceOf                   property  as              0                                        const
.LoadError                          property  (ss)            "" ""                                    const
.LoadState                          property  s               "loaded"                                 const
.Names                              property  as              2 "ssh.service" "sshd.service"           const
.NeedDaemonReload                   property  b               false                                    const
.OnFailure                          property  as              0                                        const
.OnFailureJobMode                   property  s               "replace"                                const
.PartOf                             property  as              0                                        const
.Perpetual                          property  b               false                                    const
.PropagatesReloadTo                 property  as              0                                        const
.RebootArgument                     property  s               ""                                       const
.Refs                               property  as              0                                        -
.RefuseManualStart                  property  b               false                                    const
.RefuseManualStop                   property  b               false                                    const
.ReloadPropagatedFrom               property  as              0                                        const
.RequiredBy                         property  as              0                                        const
.Requires                           property  as              3 "system.slice" "-.mount" "sysinit.tar… const
.RequiresMountsFor                  property  as              1 "/run/sshd"                            const
.Requisite                          property  as              0                                        const
.RequisiteOf                        property  as              0                                        const
.SourcePath                         property  s               ""                                       const
.StartLimitAction                   property  s               "none"                                   const
.StartLimitBurst                    property  u               5                                        const
.StartLimitIntervalUSec             property  t               10000000                                 const
.StateChangeTimestamp               property  t               1597235861208937                         emits-change
.StateChangeTimestampMonotonic      property  t               5507917                                  emits-change
.StopWhenUnneeded                   property  b               false                                    const
.SubState                           property  s               "running"                                emits-change
.SuccessAction                      property  s               "none"                                   const
.SuccessActionExitStatus            property  i               -1                                       const
.Transient                          property  b               false                                    const
.TriggeredBy                        property  as              0                                        const
.Triggers                           property  as              0                                        const
.UnitFilePreset                     property  s               "enabled"                                -
.UnitFileState                      property  s               "enabled"                                -
.WantedBy                           property  as              1 "multi-user.target"                    const
.Wants                              property  as              0                                        const

dbus 인터페이스의 기능이 매우 강력하다는 것을 알 수 있습니다.

여러분은 다음과 같이 질문할 수 있습니다. 왜 이러한 애플리케이션은 소켓이나 파일을 통해 통신하지 않습니까?

DBus는 공통 인터페이스를 제공합니다. 대화 중인 애플리케이션에 따라 메서드를 호출하거나 속성을 확인하기 위해 다른 논리를 사용할 필요가 없습니다. 경로 이름만 알면 됩니다.

systemd이것이 제가 가장 잘 이해하는 것이기 때문에 이것을 예로 사용하고 있지만 대부분의 데스크탑에는 dbus가 많이 사용됩니다. 인증부터 디스플레이 설정까지 모든 것이 dbus에서 작동합니다.

답변2

@Stewart는 이미 D-Bus에 대해 매우 심층적인 답변을 제공했지만 D-Bus 디자인에 대한 몇 가지 높은 수준의 생각을 포함하여 수정하고 싶습니다.

UNIX 및 Linux 시스템에서 IPC(프로세스 간 통신)의 "전통적인" 방식은 소켓을 직접 사용합니다. 예를 들어 프로세스 A는 소켓을 열고 /var/run/a.socket프로세스 B는 소켓을 읽고 씁니다. 이는 서로 통신하도록 설계된 긴밀하게 짜여진 프로그램에 적합합니다.

그러나 두 프로그램의 프로세스 간 통신을 원할 수 있으며 프로그램 A가 작성될 때 프로그램 B가 존재하지도 않습니다. D-Bus는 통신 및 서비스 검색 프로토콜을 제공하여 이 문제를 해결하려고 시도합니다. 이렇게 하면 A가 작성되고 프로세스 B가 인터페이스 b를 구현할 때 인터페이스 b만 존재하면 됩니다.

따라서 D-Bus를 IPC "관리자"로 설명할 수 있습니다.

역사적으로 명령줄 인터페이스(CLI) 도구도 일반적으로 IPC 관리자(셸)를 사용하여 파이프를 통해 임의의 프로그램과 통신했습니다. 이 접근 방식의 문제점은 데이터 검증, 표준화된 프로토콜 등을 제공하지 않는다는 것입니다. 따라서 고급 사용자만 사용할 수 있습니다. 일반적으로 GUI 도구는 이 작업을 "보이지 않게" 수행해야 합니다. 그러나 점점 더 많은 CLI 도구가 D-Bus 를 거의 sudo(1). systemctl poweroff폴킷 제공업체에 따라 이는 GUI 프롬프트일 수도 있습니다. 적어도 이론적으로 이 접근 방식은 더 유연하고 더 세분화된 권한을 허용하며 sudosetuid 바이너리가 필요 없이 작동합니다(예:). 이는 안전 기능으로 간주될 수 있습니다.

물론 추상화로 인해 약간의 복잡성이 발생합니다(적어도 프로그램의 종속성 측면에서는). 그러나 이를 (현명하게) 사용하는 프로그램이 많아질수록 부담이 줄어듭니다. 당신이 D-Bus와 현재 개발을 좋아하는지 여부는 말할 수 없습니다. 그러나 오늘날 컴퓨팅의 더 복잡한 요구 사항으로 인해 최신 운영 체제는 커널 외부에서 많은 중요한 서비스를 제공하는 경향이 있습니다(이제 다시 과거 커널 콘텐츠를 마이크로커널 외부로 이동). 따라서 "간단한" 터미널을 "그냥" 원한다면 이 모든 것이 "부풀어 오른" 것으로 간주될 수 있지만 업계 수요에는 그럴 만한 이유가 있으며 점점 더 많은 개발자가 버스의 D-장점을 주목하고 있습니다. 이것은 오늘날 쉘의 오래된 파이프를 대체합니다(시스템 인터페이스가 아니라 실제로 D-Bus 사용 pipe()등).

답변3

전통적인 Unix에서는 일반적으로 실행 중인 프로그램 간에 통신이 거의 없습니다. 각 프로그램은 완전히 별개의 주소 공간에서 실행되며 커널과만 상호 작용합니다. 이 모델은 간단하고 강력하지만 데스크톱 환경에서는 액세스 권한이 대부분 너무 낮고 세분화된 액세스 제어를 구현하는 것이 많은 경우 너무 복잡합니다.

커널에 의한 향상된 액세스 제어의 예는 파일 시스템입니다. 권한이 없는 프로그램은 커널에 쓰기 요청을 보낼 수 있으며, 이 쓰기 요청은 프로그램 간의 격리를 위반하지 않고 하드 디스크에 대한 쓰기 요청으로 변환됩니다. 그러나 이는 상당히 복잡한 계층이며 사용자가 USB 스틱을 연결하려는 최신 데스크탑에 비해 컨트롤이 아직 충분히 세부적이지 않습니다.

사운드 카드 액세스와 같은 다른 기능의 경우 커널은 간단한 액세스 모델만 구현합니다. 프로그램이 사운드 카드에 액세스하면 사운드를 재생 및 녹음하고 믹서 컨트롤을 작동할 수 있지만 해당 액세스를 취소할 수 있는 메커니즘은 없습니다. 프로그램 종료를 제외하고.

데스크톱 환경에서는 더 나은 모델을 원합니다. 브라우저는 사용자에게 요청한 후에만 마이크와 웹캠을 사용할 수 있어야 하며, 실행 중인 모든 프로그램은 사용자가 로그아웃할 때 마이크 액세스 권한을 잃어야 합니다. 그러나 사용자가 밤새 계산을 실행하려는 경우 , 이것은 여전히 ​​가능해야 합니다.

X 윈도우 시스템은 사용자 프로그램에서 액세스 제어를 구현하는 좋은 선례입니다. 윈도우 렌더링은 표시할 최종 화면 내용을 계산하기 위해 다른 프로그램에 요청을 보내는 방식으로 수행됩니다. 요청이 화면 내용의 시각적 변경으로 변환되는지 여부는 현재 액세스 제어 설정에 따라 다릅니다. 창을 앞으로 가져오면 프로그램에 화면 공간 영역에 대한 쓰기 권한이 부여되고, 뒤로 보내면 해당 액세스가 취소됩니다.

이제 데스크탑 환경은 이러한 중개 프로그램을 많이 제공하므로 각 기능마다 통신 프로토콜과 프로그램 핸들을 여는 방법이 필요합니다.

dbus는 프로그램이 특정 기능에 대한 액세스 제어를 제공하는 프로그램에 대한 연결을 요청할 수 있는 공통 프로토콜 및 프록시 서비스를 제공합니다. 에이전트는 대상 프로그램이 이미 실행 중인 경우에만 요청을 전달하고, 아직 실행 중이 아닌 경우 에이전트는 요청 시 프로그램을 시작합니다(시작 방법을 알고 있는 경우).

Windows에서 이에 상응하는 것은 COM/DCOM과 레지스트리의 조합입니다.

답변4

모든 것이 여전히 XFCE에서 작동하는 것 같습니다(gnome과 같은 일부 데스크탑은더 많이 의존dbus). 나는 다음을 통해 응용 프로그램을 실행합니다.화재 감옥따라서 소위 보안 이점을 잃는 것은 dbus실제로 문제가 되지 않습니다.

dbus다음 Linux 배포판은 & 없이도 잘 실행되는 것으로 보입니다 systemd.

몇 가지 사소한 문제가 있지만 충분히 유능하다면 쉽게 해결할 수 있습니다.

관련 정보