[docker] 安裝 dbus === ###### tags: `docker` ###### tags: `docker`, `container`, `pod`, `dbus`, `安裝`, `啟動`, `重啟` <br> [TOC] <br> ## 困境:容器/Pod 沒有 systemd ``` $ sudo sssctl domain-status ldapdomain Unable to connect to system bus! ``` <br> ## 安裝 dbus ```bash # 安裝 dbus apt update apt install -y dbus # 啟動 system bus(容器沒有 systemd,所以手動起 daemon) mkdir -p /var/run/dbus # 跑在前景 dbus-daemon --system --nofork --print-address ``` - 確認 `/var/run` 是否是 `/run` 的 symlink(多數發行版是): ```bash $ ls -ld /var/run lrwxrwxrwx 1 root root 4 Aug 5 10:07 /var/run -> /run ``` <br> ## 重啟 dbus ### 避免「刪目錄」重啟 bus 的方式 > 以 SSSD 服務為例 不要在 SSSD 正在跑時 `rm -rf /var/run/dbus`。這會把還在使用的 socket 移除,IFP 需要時間偵測並重連。 ``` $ dbus-daemon --system --nofork --print-address unix:path=/run/dbus/system_bus_socket,guid=1de0268b52f50cdf86a27eb768d5f31f dbus-daemon[4514]: [system] Activating service name='org.freedesktop.sssd.infopipe' requested by ':1.0' (uid=0 pid=4515 comm="sssctl domain-status ldapdomain" label="docker-default (enforce)") (using servicehelper) dbus-daemon[4514]: [system] Activated service 'org.freedesktop.sssd.infopipe' failed: Invalid configuration (missing or empty <user>?) ``` - 沒有 `User=`(或路徑不對)時,**D-Bus 代啟 IFP 會失敗**,就會看到那串「`missing or empty <user>?`」訊息。 --- ### 正確啟動順序(讓 IFP 立即掛到 bus) > 目標:先把 **system bus** 啟好,再讓 **SSSD(含 IFP)** 起來註冊到 bus > 之後就算你真的要重啟 bus,也記得**順手重啟 IFP responder**,避免卡在「能連 bus 但 IFP 尚未重註冊」的空窗期。 - **Terminal-1** - 先中斷 sssctl 執行,等 dbus ready 再啟動 ```bash <CTRL> + C ``` - **Terminal-2**:先把 **system bus** 啟好 ```bash # 刪除 socket,並重建 rm -rf /var/run/dbus mkdir -p /var/run/dbus # 重啟 system bus dbus-daemon --system --nofork --print-address ``` - 重啟 sssctl 執行 讓 **SSSD(含 IFP)** 起來註冊到 bus - **Terminal-3** ```bash # 現在就能查 domain 狀態了 sudo sssctl domain-status ldapdomain ``` --- ### 重啟失敗 - Troubleshooting ``` dbus-daemon[4587]: Failed to start message bus: \ The pid file "/run/dbus/pid" exists, \ if the message bus is not running, remove this file ``` - 忘記刪除 socket 檔案 - 執行 ``` rm -rf /var/run/dbus ``` <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}