我有 Debian、Sid(如果有的话),我想从控制台启动 X,而不是使用显示管理器,但是当我输入时,startx <RET>
我收到以下消息
xinit: connection to X server lost
如果我以root身份登录,或者如果我使用sudo
,我就能够启动X,所以我怀疑权限是问题的根源。
我应该怎么做才能让普通用户能够启动 X(可能通过)startx
?
我对一个简单的解决方案感兴趣,可能实现了操纵权限,但有其他缺点,并且对一个可能更复杂的解决方案感兴趣,也许是像某种代理一样非图形显示管理器,或者其他什么…
答案1
.xauthority 和 .ICEauthority 文件可能由 root 用户拥有。尝试移除它们,或者为了不破坏某些东西,将它们移开:
sudo mv ~/.Xauthority ~/.bak.Xauthority
sudo mv ~/.ICEauthority ~/.bak.ICEauthority
建议在非 X 环境中执行此操作,方法是使用 Ctrl + Alt + F2 切换到虚拟终端。
答案2
从这个问题(“以 root 以外的用户身份启动 X”) 和这个答案,即引用本文,我想出了以下解决方案
sudo chown $USER /dev/tty8
sudo chmod o+rw /dev/input/*
startx -- vt8 -retro -sharevts -logfile ~/.local/X.log &
Xorg服务器已启动正确(?)但是,尽管存在所有可能的安全问题,但仍会出现许多其他问题,例如,
X
在 Chrome 搜索框中输入的一些内容最终会出现在与少量垃圾一起启动的控制台中,- 我无法使用通常的CtrlAltn顺序切换到另一个终端
- 显示管理器自动提供的一些客户端不再存在,最烦人的是,无论是什么拦截了Multi Key组合字符的使用并将其放置在总线上(???),Chrome都会看到它,否则会忽略X的组合序列(非常烦人,因为我使用美国 kbd 布局,但我喜欢写作,例如 Barbora Krejčíková,无需复制和粘贴)。
我想听到(可能是在评论中)有关上述问题的可能解决方案。
答案3
多年来,默认情况下这已经成为可能。你的系统上的某些东西已经成功了不再可能真正的问题不是“用什么机制让它发挥作用”,而是“如何让现有机制发挥作用”再次”。
有两种不同的机制允许非特权的 startx 使用:
以前(systemd 之前),X 服务器
/usr/bin/Xorg
曾经是 setuid root。这是传统的机制,尤其是当 Xorg 仍然用来进行直接 PCI 访问时。现在Xorg本身不是setuid,但附带了一个setuid启动器“Xorg.wrap”,它可以检测是否应该保留root权限。现在系统登录daemon自动给前台tty对应的用户授予权限。这部分早于 systemd,因为 udev + ConsoleKit 甚至在此之前就已经用于将“前台”用户添加到各种 /dev ACL 中;然而,systemd-logind 另外充当 Xorg 的代理来访问 /dev/input,而无需直接拥有那里的权限。
在不使用 systemd 的发行版上,埃洛金德守护进程也可以做同样的事情。在想要不惜一切代价避免 systemd 的发行版上,坐可以使用守护进程(尽管据我所知 Xorg 尚不支持不同的 API)。
由于 Debian 主要使用 systemd,因此您应该运行 systemd-logind,并且您的 PAM 配置应该调用 pam_systemd.so 来向守护进程注册控制台登录。当您在控制台登录时,loginctl session-status
应将您报告为“seat0”上的活动用户,并getfacl /dev/snd/pcm*
应将您列为对音频设备具有读写访问权限。
(注:你实际上必须以正确的用户身份登录。以 root 身份登录并使用su -l <myuser>
明确不算– 如果您只执行此操作,则会话仍归 root 所有;使用“su”时不会转移设备访问权限。)
当一切正常时,Xorg将能够通过/dev/dri直接打开GPU,并通过D-Bus与systemd-logind对话以打开/dev/input中的设备;您应该在 Xorg.0.log 中看到这一点。 (这使用系统总线,而不是会话总线 – 即 dbus.service 而不是 dbus-launch。)
请注意,使用 systemd-logind 或 elogind,您应该在同一前台 VT 上启动 Xorg,直接在基于文本的登录之上 –不是在专用 VT 上。这意味着使用vt$(fgconsole)
而不是vt8
(尽管 Debian 的 startx 默认情况下做正确的事情)。
在一些在某些情况下(例如,当使用专有的 nVidia GPU 驱动程序而没有内核模式设置支持时),systemd-logind 的 ACL 和代理可能不够,您仍然需要使用 setuid Xorg。可以/etc/X11/Xwrapper.config
按照中所述启用此功能Xorg.wrap(1)。