dbus-daemon --session 给出循环包含错误

Posted

技术标签:

【中文标题】dbus-daemon --session 给出循环包含错误【英文标题】:dbus-daemon --session gives circular inclusion error 【发布时间】:2019-03-14 11:42:29 【问题描述】:

我有一个嵌入式目标和 dbus-daemon 成功运行系统总线。我试图让会话总线也运行,但是当我尝试时出现此错误,

usr/bin/dbus-daemon --session &

[/etc/dbus-1]# /usr/bin/dbus-daemon --session &
[/etc/dbus-1]# Failed to start message bus: Circular inclusion of file '/etc/dbus-1/session.conf'

dbus-daemon 的版本是 1.10.22,我包括我的 /etc/dbus-1/session.conf。目标上只有一个 root 用户,这就是我正在运行的。我自然会认为我的 session.conf 文件中有问题,但“循环包含”似乎暗示该文件之外的某些东西出了问题。

我的调试尝试涉及查看 d-bus 源代码,但到目前为止我还没有得到任何结果。


<!-- This configuration file controls the per-user-login-session message bus.
     Add a session-local.conf and edit that rather than changing this 
     file directly. -->

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <!-- Our well-known bus type, don't change this -->
  <type>session</type>

  <!-- If we fork, keep the user's original umask to avoid affecting
       the behavior of child processes. -->
  <keep_umask/>

  <listen>unix:path=/var/run/dbus/session_bus_socket</listen>

  <!-- On Unix systems, the most secure authentication mechanism is
  EXTERNAL, which uses credential-passing over Unix sockets.

  This authentication mechanism is not available on Windows,
  is not suitable for use with the tcp: or nonce-tcp: transports,
  and will not work on obscure flavours of Unix that do not have
  a supported credentials-passing mechanism. On those platforms/transports,
  comment out the <auth> element to allow fallback to DBUS_COOKIE_SHA1. -->
  <auth>EXTERNAL</auth>

  <standard_session_servicedirs />

  <policy context="default">
    <!-- Allow everything to be sent -->
    <allow send_destination="*" eavesdrop="true"/>
    <!-- Allow everything to be received -->
    <allow eavesdrop="true"/>
    <!-- Allow anyone to own anything -->
    <allow own="*"/>
  </policy>

  <!-- Include legacy configuration location -->
  <include ignore_missing="yes">/etc/dbus-1/session.conf</include>

  <!-- Config files are placed here that among other things, 
       further restrict the above policy for specific services. -->
  <includedir>session.d</includedir>

  <includedir>/etc/dbus-1/session.d</includedir>

  <!-- This is included last so local configuration can override what's 
       in this standard file -->
  <include ignore_missing="yes">/etc/dbus-1/session-local.conf</include>

  <include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>

  <!-- For the session bus, override the default relatively-low limits 
       with essentially infinite limits, since the bus is just running 
       as the user anyway, using up bus resources is not something we need 
       to worry about. In some cases, we do set the limits lower than 
       "all available memory" if exceeding the limit is almost certainly a bug, 
       having the bus enforce a limit is nicer than a huge memory leak. But the 
       intent is that these limits should never be hit. -->

  <!-- the memory limits are 1G instead of say 4G because they can't exceed 32-bit signed int max -->
  <limit name="max_incoming_bytes">1000000000</limit>
  <limit name="max_incoming_unix_fds">250000000</limit>
  <limit name="max_outgoing_bytes">1000000000</limit>
  <limit name="max_outgoing_unix_fds">250000000</limit>
  <limit name="max_message_size">1000000000</limit>
  <!-- We do not override max_message_unix_fds here since the in-kernel
       limit is also relatively low -->
  <limit name="service_start_timeout">120000</limit>  
  <limit name="auth_timeout">240000</limit>
  <limit name="pending_fd_timeout">150000</limit>
  <limit name="max_completed_connections">100000</limit>  
  <limit name="max_incomplete_connections">10000</limit>
  <limit name="max_connections_per_user">100000</limit>
  <limit name="max_pending_service_starts">10000</limit>
  <limit name="max_names_per_connection">50000</limit>
  <limit name="max_match_rules_per_connection">50000</limit>
  <limit name="max_replies_per_connection">50000</limit>

</busconfig>

【问题讨论】:

如果没有其他用户并且这是一个嵌入式设备,我想可能会被问到的一个问题是“为什么要使用会话总线”。有效的问题。我的印象是会话总线更宽松,使得添加新接口比在系统总线上更容易 - 即它不需要像系统总线那样通过 .conf 文件设置策略. 【参考方案1】:

循环包含问题是您在/etc/dbus-1/session.conf 中包含/etc/dbus-1/session.conf 引起的。删除行:

<!-- Include legacy configuration location -->
<include ignore_missing="yes">/etc/dbus-1/session.conf</include>

【讨论】:

哦,废话!我以为我已经对文件本身进行了 grep 以提及“会话”。我完全错过了那条线。谢谢

以上是关于dbus-daemon --session 给出循环包含错误的主要内容,如果未能解决你的问题,请参考以下文章

Dbus PHP 无法在没有 $DISPLAY for X11 的情况下启动 dbus-daemon

如何使用 Python 在自定义 dbus 上导出对象?

编译原理—基本块划分,循环流图

在 Docker 容器中运行 dbus-daemon

Troubleshooting - job不退出 - 如何找出誰启动了dbus-daemon(或调用了dbus-launch)

Linux - 残留的dbus-daemon或dbus-launch,如何避免或如何清理?