Невозможно использовать `systemctl --user` из-за" Не удалось получить соединение по шине D: разрешение запрещено "

Я пытаюсь настроить службы уровня пользователя, используя этот ответ на аналогичный вопрос. Я создал необходимые файлы и перезагрузился.

Я делаю успехи, потому что теперь я получаю сообщение "Не удалось получить соединение по шине D: разрешение отклонено", когда это было "Не удалось получить соединение по шине D: соединение отклонено", но я озадачен, потому что не знаю, какой объект он пытается получить доступ (файл? сокет?) и поэтому не может даже проверить текущие разрешения. Есть идеи?

Пока я добавил:

loginctl enable-linger userservice

/usr/lib/systemd/user/dbus.service (-rw-r - r-- root root)

[Unit]
Description=D-Bus User Message Bus
Requires=dbus.socket

[Service]
ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig

[Install]
Also=dbus.socket

/usr/lib/systemd/user/dbus.socket (-rw-r - r-- root root)

[Unit]
Description=D-Bus User Message Bus Socket

[Socket]
ListenStream=%t/bus
ExecStartPost=-/bin/systemctl --user set-environment DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus

[Install]
WantedBy=sockets.target
Also=dbus.service

/home/userservice/.config/systemd/user/userservice.service

[Unit]
Description=Test user-level service

[Service]
Type=dbus
BusName=com.wtf.service
ExecStart=/home/userservice/userservice.py
Restart=on-failure

[Install]
WantedBy=default.target

Не добавлено ни одной ссылки в другом месте...

Чтобы это не получилось:

systemctl --user status

Изменить 2018-10-25:

добавленной export XDG_RUNTIME_DIR=/run/user/$(id -u) в .bashrc, Переменная установлена, и теперь я получаю: Failed to get D-us connection: no such file or directory, Странно, ни man systemctl ни systemctl --help упомянуть --user вариант, хотя оба упоминают --system и укажите, что это по умолчанию (так, каковы другие варианты).

Используя RHEL 7.4 (с systemd 219 как сообщается systemctl --version) с SELinux.

4 ответа

Я заметил, что сервер tableau использует службы --user systemd - у них даже есть примечание об этом в своих документах:https://help.tableau.com/current/server-linux/en-us/systemd_user_service_error.htm

Пользовательская служба systemd используется не так часто, как обычный менеджер процессов systemd. Red Hat отключила пользовательскую службу systemd в RHEL 7 (и, следовательно, во всех дистрибутивах RHEL, таких как CentOS, Oracle Linux 7, Amazon Linux 2). Однако RedHat заверил Tableau, что запуск пользовательской службы systemd поддерживается до тех пор, пока служба будет повторно включена.

Как они это делают (пример с идентификатором пользователя 29575)

# cat /etc/systemd/system/user@29575.service
[Unit]
Description=User Manager for UID %i
After=systemd-user-sessions.service
# These are present in the RHEL8 version of this file except that the unit is Requires, not Wants.
# It's listed as Wants here so that if this file is used in a RHEL7 settings, it will not fail.
# If a user upgrades from RHEL7 to RHEL8, this unit file will continue to work until it's
# deleted the next time they upgrade Tableau Server itself.
After=user-runtime-dir@%i.service
Wants=user-runtime-dir@%i.service

[Service]
LimitNOFILE=infinity
LimitNPROC=infinity
User=%i
PAMName=systemd-user
Type=notify
# PermissionsStartOnly is deprecated and will be removed in future versions of systemd
# This is required for all systemd versions prior to version 231
PermissionsStartOnly=true
ExecStartPre=/bin/loginctl enable-linger %i
ExecStart=-/lib/systemd/systemd --user
Slice=user-%i.slice
KillMode=mixed
Delegate=yes
TasksMax=infinity
Restart=always
RestartSec=15

[Install]
WantedBy=default.target

После создания этого файла:

systemctl daemon-reload
systemctl enable user@29575.service
systemctl start user@29575.service

И вам нужно будет установить XDG_RUNTIME_DIR в env этого пользователя через bashrc или аналогичный:

[ -z "${XDG_RUNTIME_DIR}" ] && export XDG_RUNTIME_DIR=/run/user/$(id -ru)

Я тестировал последнюю версию RHEL 7.8, и она работает, как ожидалось, после этого я могу запустить "systemctl --user status" как мой пользователь.

Так что существует давняя проблема, когда XDG_RUNTIME_DIR Переменная окружения не устанавливается должным образом или вообще не отображается, когда пользователи входят в систему, и, следовательно, не может получить доступ к D-Bus пользователя. Это происходит, когда пользователь входит в систему с помощью другого метода, отличного от локальной графической консоли.

Вы можете обойти это, добавив к пользователю $HOME/.bashrc:

export XDG_RUNTIME_DIR=/run/user/$(id -u)

Затем выйдите и вернитесь.

Вы должны знать, как работает PAM.

Если вы войдете в систему, используя любой из

  1. графическая сессия
  2. войти в терминал (имя пользователя и пароль)
  3. сш

затем будет вызван механизм PAM, и это установит все необходимые перехватчики для использованияsystemctl; если вы переключите пользователя, используяsudoилиsu, этого не произойдет.

Это сделано намеренно, см. https://github.com/systemd/systemd/issues/7451#issuecomment-346787237 .

Что странно, это на самом деле/etc/pam.d/suвключает/etc/pam.d/common-sessionкоторый содержит вызовpam_systemdно это не получается, действительно/var/log/auth.logговорит:

pam_systemd(su:session): невозможно создать сеанс: сеанс уже запущен.

В настоящее время хорошим способом является использованиеsshподключиться к той же машине, но под именем другого пользователя, что-то вродеssh user@localhost.

systemd 248 (выпущен в марте 2021 г.) представил синтаксис

systemctl --user -M username@ status

(эта команда должна быть запущена от имени пользователя root)

Например

      [myuser@laptop ~]$ sudo systemctl --user -M testuser@ status
● testuser@
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Thu 2022-11-03 22:59:10 CET; 164ms ago
   CGroup: /user.slice/user-1492.slice/user@1492.service
           ├─init.scope
           │ ├─ 21922 /usr/lib/systemd/systemd --user
           │ └─ 21929 "(sd-pam)"
           └─session.slice
             └─dbus-broker.service
               ├─ 21950 /usr/bin/dbus-broker-launch --scope user
               └─ 21951 dbus-broker --log 4 --controller 9 --machine-id fa369ab69fcf4e54ad8a274517ea5096 --max-bytes 100000000000000 --max-fds 25000000000000 --max-matches 5000000000

Альтернативно вы также можете открыть новый интерактивный сеанс входа в систему.

      [myuser@laptop ~]$ sudo machinectl shell testuser@
Connected to the local host. Press ^] three times within 1s to exit session.
[testuser@laptop ~]$ systemctl --user status
● laptop
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Thu 2022-11-03 22:56:50 CET; 57s ago
   CGroup: /user.slice/user-1492.slice/user@1492.service
           └─init.scope
             ├─ 21799 /usr/lib/systemd/systemd --user
             └─ 21806 "(sd-pam)"

«sudo -u username -i» не создает сеанс входа в систему

su — это « не инструмент для открытия совершенно нового сеанса входа в систему » ​​согласно https://github.com/systemd/systemd/issues/7451#issuecomment-346787237 (я предполагаю, что sudo связан с su. Просто запускаю sudo, чтобы стать другим пользователь не запустит демон systemd этого пользователя)

Я опробовал несколько примеров на Fedora 36 с systemd 250:

Пример «sudo -u имя пользователя -i»

      [myuser@laptop ~]$ sudo useradd test1
[myuser@laptop ~]$ sudo -u test1 -i
[test1@laptop ~]$ pgrep -u $USER -l
25217 bash
[test1@laptop ~]$ env | grep XDG
XDG_DATA_DIRS=/home/test1/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
[test1@laptop ~]$ 

Пример «имя пользователя оболочки sudo Machinectl@»

      [myuser@laptop ~]$ sudo useradd test2
[myuser@laptop ~]$ sudo machinectl shell test2@
Connected to the local host. Press ^] three times within 1s to exit session.
[test2@laptop ~]$ pgrep -u $USER -l
25086 bash
25091 systemd
25100 (sd-pam)
25115 (sd-pam)
[test2@laptop ~]$ env | grep XDG
XDG_SESSION_TYPE=tty
XDG_SESSION_CLASS=user
XDG_SESSION_ID=51
XDG_RUNTIME_DIR=/run/user/1494
XDG_DATA_DIRS=/home/test2/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/
[test2@laptop ~]$ ls -l $XDG_RUNTIME_DIR/bus
srw-rw-rw-. 1 test2 test2 0 Nov  4 08:42 /run/user/1494/bus
[test2@laptop ~]$ 

Ссылка:

Соответствующие строки из примечаний к выпуску systemd 248: https://github.com/systemd/systemd/blob/6c83054c0133eb53245e479d71589dceff76cf74/NEWS#L2796-L2800

Другие вопросы по тегам