如何从控制台运行 xinit 时创建新的登录会话?

如何从控制台运行 xinit 时创建新的登录会话?

我的当前系统启动到控制台,我不想使用显示管理器。

更新到 之后Ubuntu 13.10,我意识到ConsoleKit不再用于管理用户登录,而是systemd-logind使用 服务。

.xinitrc的 Ubuntu 13.04 配置如下:

exec ck-launch-session startxfce4

ck-launch-session使我能够安装磁盘或关闭/重启/挂起电脑。

我可以找到有关如何启用这些功能的唯一文档是在Arch Linux 文档

用户应首先设置 systemd-logind 来管理其会话。如果 systemd 作为系统 init 守护程序运行,则此操作已发生。

接下来,用户必须通过将以下内容放入其中来启动 systemd ~/.xinitrc/usr/lib/systemd/systemd --user

用户应该从他们的 中删除任何ck-launch-session或实例,因为这些命令是不需要的。dbus-launch~/.xinitrc

但是,由于 Ubuntu 使用的是upstart而不是systemd,因此我无法在我的配置上执行此操作。

我尝试做类似的事情,因此我将其放入我的.xinitrc

export DESKTOP_SESSION=xfce
init --user

xfce 会话启动了,但我仍然无法挂载硬盘或重新启动、关闭和挂起我的电脑。这实际上与startxfce4直接调用相同。

如果我使用参数启动 X 服务器vt01,其中01是当前 的 ID tty,则一切正常,但CTRL+C如果出现挂起情况,我无法使用诸如 之类的东西来终止服务器。是的,有诸如调用 之类的解决方法killall xinit,但这并不能解决问题。

我认为如果我在新的 tty 中启动 X 服务器,则不允许关闭,因为logind没有创建新会话。阅读登录文档,我意识到我可能需要在启动 X 服务器时创建一个新会话,并且当我在 X 服务器中时该会话应该被标记为活动状态。可以使用以下命令检查这一点:

loginctl show-session $XDG_SESSION_ID | grep Active

logind 文档中的以下一行令我感到困惑:

创建会话()释放会话()可用于打开或关闭登录会话。这些调用绝不应由客户端直接调用。创建/关闭会话完全由 PAM 及其 pam_systemd 模块负责。

所以我的问题是如何让 PAM 在启动 X 服务器时创建一个新的登录会话?

答案1

我花了一整晚的时间研究我的 Ubuntu 控制台启动 + Openbox 设置,我和你的情况一样。systemd 在 Ubuntu 13.10 中没有得到充分使用,但它确实取代了 ConsoleKit,正如你所说。我已经到了 loginctl 并想扯掉我的头发,然后我发现http://blog.falconindy.com/articles/back-to-basics-with-x-and-systemd.html非常有效。

我的 .xinitrc 如下 -

exec dbus-launch --sh-syntax --exit-with-session openbox-session

我使用了上面链接中的帮助程序脚本,并将 startx 别名为“exec path/to/the/helper/script”。效果很好,nm-applet 也运行正常。

PS 如果上面的链接消失,这里是替代startx的帮助脚本。

#!/bin/bash
TTY=${TTY:-$(tty)}
TTY=${TTY#/dev/}

if [[ $TTY != tty* ]]; then
  printf '==> ERROR: invalid TTY\n' >&2
  exit 1
fi

printf -v vt 'vt%02d' "${TTY#tty}"

xinit -- "$vt" "$@"

相关内容