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 응용 프로그램의 권한을 높입니다. 이는 sudo
GUI 세계와 같습니다. gnome에서 관리자 비밀번호를 묻는 메시지가 표시될 때 전체 화면이 가려지는 경우 이것이 Polkit의 기능입니다. .terminator
--no-dbus
terminator
노력 에서 pkexec ls
. 이는 ls
높은 권한으로 실행됩니다. 이 옵션이 있는 경우와 없는 경우에 차이가 있는지 확인하세요 --no-dbus
. 내 창 관리자(i3)에 polkit 에이전트가 없으므로 이 에이전트를 테스트할 수 없습니다.
나는 대부분 dbus의 시스템 측면을 알고 있으므로 나머지 대답은 여기에서 나옵니다.
그것 없이는 실행할 수 없는 앱이 있습니까
dbus
?
예. 가져가다 systemctl
. systemctl status
문의사항이 "org.freedesktop.systemd1"
귀하에게 발행되어 제시될 것입니다. systemctl start
dbus 메소드가 호출되고 단위가 매개변수로 메소드에 전달됩니다. systemd
전화에 응답하고 조치를 취하세요.
시스템 단위(예: foo.service)의 상태 변경에 대한 응답으로 조치를 취하려면 org.freedesktop.DBus.Properties
path /org/freedesktop/systemd1/unit/foo_2eservice
및 member 를 사용하여 인터페이스의 파일 설명자를 얻을 수 있습니다 PropertiesChanged
. 해당 FD에 하나를 설정 inotify
하면 갑자기 서비스 시작, 중지, 실패 등에 반응할 수 있는 방법이 생깁니다.
ssh.service
systemd 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 프롬프트일 수도 있습니다. 적어도 이론적으로 이 접근 방식은 더 유연하고 더 세분화된 권한을 허용하며 sudo
setuid 바이너리가 필요 없이 작동합니다(예:). 이는 안전 기능으로 간주될 수 있습니다.
물론 추상화로 인해 약간의 복잡성이 발생합니다(적어도 프로그램의 종속성 측면에서는). 그러나 이를 (현명하게) 사용하는 프로그램이 많아질수록 부담이 줄어듭니다. 당신이 D-Bus와 현재 개발을 좋아하는지 여부는 말할 수 없습니다. 그러나 오늘날 컴퓨팅의 더 복잡한 요구 사항으로 인해 최신 운영 체제는 커널 외부에서 많은 중요한 서비스를 제공하는 경향이 있습니다(이제 다시 과거 커널 콘텐츠를 마이크로커널 외부로 이동). 따라서 "간단한" 터미널을 "그냥" 원한다면 이 모든 것이 "부풀어 오른" 것으로 간주될 수 있지만 업계 수요에는 그럴 만한 이유가 있으며 점점 더 많은 개발자가 버스의 D-장점을 주목하고 있습니다. 이것은 오늘날 쉘의 오래된 파이프를 대체합니다(시스템 인터페이스가 아니라 실제로 D-Bus 사용 pipe()
등).
답변3
전통적인 Unix에서는 일반적으로 실행 중인 프로그램 간에 통신이 거의 없습니다. 각 프로그램은 완전히 별개의 주소 공간에서 실행되며 커널과만 상호 작용합니다. 이 모델은 간단하고 강력하지만 데스크톱 환경에서는 액세스 권한이 대부분 너무 낮고 세분화된 액세스 제어를 구현하는 것이 많은 경우 너무 복잡합니다.
커널에 의한 향상된 액세스 제어의 예는 파일 시스템입니다. 권한이 없는 프로그램은 커널에 쓰기 요청을 보낼 수 있으며, 이 쓰기 요청은 프로그램 간의 격리를 위반하지 않고 하드 디스크에 대한 쓰기 요청으로 변환됩니다. 그러나 이는 상당히 복잡한 계층이며 사용자가 USB 스틱을 연결하려는 최신 데스크탑에 비해 컨트롤이 아직 충분히 세부적이지 않습니다.
사운드 카드 액세스와 같은 다른 기능의 경우 커널은 간단한 액세스 모델만 구현합니다. 프로그램이 사운드 카드에 액세스하면 사운드를 재생 및 녹음하고 믹서 컨트롤을 작동할 수 있지만 해당 액세스를 취소할 수 있는 메커니즘은 없습니다. 프로그램 종료를 제외하고.
데스크톱 환경에서는 더 나은 모델을 원합니다. 브라우저는 사용자에게 요청한 후에만 마이크와 웹캠을 사용할 수 있어야 하며, 실행 중인 모든 프로그램은 사용자가 로그아웃할 때 마이크 액세스 권한을 잃어야 합니다. 그러나 사용자가 밤새 계산을 실행하려는 경우 , 이것은 여전히 가능해야 합니다.
X 윈도우 시스템은 사용자 프로그램에서 액세스 제어를 구현하는 좋은 선례입니다. 윈도우 렌더링은 표시할 최종 화면 내용을 계산하기 위해 다른 프로그램에 요청을 보내는 방식으로 수행됩니다. 요청이 화면 내용의 시각적 변경으로 변환되는지 여부는 현재 액세스 제어 설정에 따라 다릅니다. 창을 앞으로 가져오면 프로그램에 화면 공간 영역에 대한 쓰기 권한이 부여되고, 뒤로 보내면 해당 액세스가 취소됩니다.
이제 데스크탑 환경은 이러한 중개 프로그램을 많이 제공하므로 각 기능마다 통신 프로토콜과 프로그램 핸들을 여는 방법이 필요합니다.
dbus는 프로그램이 특정 기능에 대한 액세스 제어를 제공하는 프로그램에 대한 연결을 요청할 수 있는 공통 프로토콜 및 프록시 서비스를 제공합니다. 에이전트는 대상 프로그램이 이미 실행 중인 경우에만 요청을 전달하고, 아직 실행 중이 아닌 경우 에이전트는 요청 시 프로그램을 시작합니다(시작 방법을 알고 있는 경우).
Windows에서 이에 상응하는 것은 COM/DCOM과 레지스트리의 조합입니다.
답변4
- 활성화합니다숨겨진이것은 깨져야 합니다
dbus
. - 나도고유하게 변경
machine-id
dbus
시작할 때마다 생성됨rc.local
(devuan은 시작할 때마다 이를 생성합니다.)
모든 것이 여전히 XFCE에서 작동하는 것 같습니다(gnome과 같은 일부 데스크탑은더 많이 의존dbus
). 나는 다음을 통해 응용 프로그램을 실행합니다.화재 감옥따라서 소위 보안 이점을 잃는 것은 dbus
실제로 문제가 되지 않습니다.
dbus
다음 Linux 배포판은 & 없이도 잘 실행되는 것으로 보입니다 systemd
.
몇 가지 사소한 문제가 있지만 충분히 유능하다면 쉽게 해결할 수 있습니다.