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,我使用的是普通的 openbox 環境(沒有任何桌面環境,例如 Gnome 或 KDE)
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 代理,所以我無法測試這個代理。我主要從 systemd 的角度了解 dbus,所以這就是我其餘答案的來源。
有沒有應用程序無法執行
dbus
?是的。拿
systemctl
。systemctl status
將向 發出查詢"org.freedesktop.systemd1"
,並將其呈現給您。systemctl start
將呼叫 dbus 方法並將單元作為參數傳遞給該方法。systemd
接收呼叫並執行操作。
org.freedesktop.DBus.Properties
如果您想對 systemd 單元(即 foo.service)的狀態變化做出響應,您可以使用 path/org/freedesktop/systemd1/unit/foo_2eservice
和 member獲取介面的文件描述符PropertiesChanged
。在該 FD 上設置一個inotify
,你突然有辦法對服務的啟動、停止、失敗等做出反應。如果您想查看 systemd dbus 上特定單元(即
ssh.service
)的可用內容,請嘗試以下命令: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 上可用。