为什么“su - user”之后没有创建 $XDG_RUNTIME_DIR (/run/user/$UID) 目录?:
administrateur@localhost:~$ su - test
Password:
test@localhost:~$ systemctl --user
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)
test@localhost:~$ ls /run/user/$UID
ls: cannot access '/run/user/1004': No such file or directory
test@localhost:~$ groups
test
test@localhost:~$
logout
administrateur@localhost:~$
EDIT0:执行操作会将目录sudo loginctl enable-linger test
保留/run/user/$UID
在那里,但是XDG_RUNTIME_DIR
变量仍然未定义:
administrateur@localhost:~$ sudo loginctl enable-linger test
administrateur@localhost:~$ sudo su - test
test@localhost:~$ ls /run/user/$UID/bus
/run/user/1004/bus
test@localhost:~$ echo $XDG_RUNTIME_DIR
test@localhost:~$
logout
administrateur@localhost:~$
答案1
因为它的存在(以及您尝试访问的实际“systemd --user”进程的存在)与至少一个 systemd-logind 相关登录会话,并且不允许直接从现有会话中创建新会话,无论是通过su
还是其他工具。
machinectl shell test@
将从服务中生成一个 shell(类似于从“agetty”服务中生成常规登录的方式),并且其 PAM 配置包括 pam_systemd,因此它将创建自己的会话。
使用将用户标记为“停留模式”loginctl enable-linger test
将导致 systemd-logind 在启动时创建运行时目录(并启动用户的“systemd --user”实例)并永久保留它,无论会话数是多少。
从 systemd v239 或更高版本开始,还可以通过以下方式手动启动用户的服务管理器user@<uid>.service
- 运行时目录将自动设置为依赖项(在早期版本中,它与 logind 的内部结构相关)。