xinit

来自 ArchWiki
(重定向自 Startx)

来自 维基百科

xinit 程序允许用户手动启动 Xorg 显示服务器。startx(1) 脚本是 xinit(1) 的前端。

xinit 通常用于启动窗口管理器桌面环境。虽然您也可以使用 xinit 运行没有窗口管理器的 GUI 应用程序,但许多图形应用程序期望使用 EWMH 兼容的窗口管理器。显示管理器为您启动 Xorg,并且通常会读取 xprofile

安装

安装 xorg-xinit 软件包。

配置

xinitstartx 接受可选的客户端程序参数,请参阅 #覆盖 xinitrc。如果您未提供,它们将查找 ~/.xinitrc 以作为 shell 脚本运行,从而启动客户端程序。

xinitrc

~/.xinitrc 方便在 X 服务器启动时运行依赖于 X 的程序并设置环境变量。如果用户主目录中存在该文件,startxxinit 将执行它。否则,startx 将运行默认的 /etc/X11/xinit/xinitrc

注意: Xinit 有其自身的默认行为,而不是执行该文件。有关详细信息,请参阅 xinit(1)

此默认 xinitrc 将启动一个基本环境,其中包含 Twmxorg-xclockXterm(假设已安装必要的软件包)。因此,要启动不同的窗口管理器或桌面环境,首先在您的主目录中创建默认 xinitrc 的副本

$ cp /etc/X11/xinit/xinitrc ~/.xinitrc

然后编辑该文件,并将默认程序替换为所需的命令。请记住,使用 exec 的命令之后的行将被忽略。例如,要在后台启动 xscreensaver,然后启动 openbox,请使用以下命令

~/.xinitrc
...
xscreensaver &
exec openbox-session
注意: 至少,请确保您的 ~/.xinitrc 文件中存在 /etc/X11/xinit/xinitrc 中的最后一个 if 代码块,以确保 /etc/X11/xinit/xinitrc.d 中的脚本被读取。

在窗口管理器之前启动的长时间运行的程序(例如屏幕保护程序和壁纸应用程序)必须自行 fork 或通过附加 & 符号在后台运行。否则,脚本将暂停并等待每个程序退出,然后再执行窗口管理器或桌面环境。请注意,某些程序不应被 fork,以避免竞争错误,例如 xrdb 的情况。前置 exec 将使用窗口管理器进程替换脚本进程,以便即使此进程 fork 到后台,X 也不会退出。

xserverrc

xserverrc 文件是一个 shell 脚本,负责启动 X 服务器。startxxinit 都会执行 ~/.xserverrc(如果存在),否则 startx 将使用 /etc/X11/xinit/xserverrc

有关所有命令行选项的列表,请参阅 Xserver(1)

传递虚拟终端号码

为了维护与 logind已验证会话,并防止通过切换终端绕过屏幕锁定器,Xorg 必须在登录发生的同一虚拟终端上启动[1]。为此,需要将当前虚拟终端的号码传递给 Xorg

如果您正在调用 startx,则无需执行更多操作 – 它包含逻辑来计算虚拟终端号码并将其传递给 Xorg

在其他情况下,例如,如果您正在运行 xinit,建议在 ~/.xserverrc 文件中指定 vt$XDG_VTNR

~/.xserverrc
#!/bin/sh

exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR
提示: 可以在 -nolisten tcp 之后添加 -nolisten local 以禁用 X11 的抽象套接字,以帮助隔离。有关这可能如何影响 X11 安全性的快速背景介绍
注意: 要重新启用将 X 会话的输出重定向到 Xorg 日志文件,请添加 -keeptty 选项。有关详细信息,请参阅 Xorg#会话日志重定向

用法

要以普通用户身份运行 Xorg,请执行

$ startx

或者,如果配置了 #xserverrc

$ xinit -- :1
注意: 当另一个 X 服务器已经启动时,xinit 不处理多个显示器。为此,您必须通过附加 -- :显示器号码 来指定显示器,其中 显示器号码1 或更大。

现在,您选择的窗口管理器(或桌面环境)应该可以正确启动。

要退出 X,请运行窗口管理器的退出功能(假设它具有该功能)。如果它缺少此功能,请运行

$ pkill -15 Xorg
注意: pkill 将杀死所有正在运行的 X 实例。要专门杀死当前虚拟终端上的窗口管理器,请运行
$ pkill -15 -t tty"$XDG_VTNR" Xorg

另请参阅 signal(7)

技巧与提示

覆盖 xinitrc

如果您有一个可用的 ~/.xinitrc,但只想尝试其他窗口管理器或桌面环境,则可以通过发出 startx,后跟窗口管理器的路径来运行它,例如

$ startx /usr/bin/i3

如果二进制文件接受参数,则需要引用它们以被识别为 startx 的第一个参数的一部分

$ startx "/usr/bin/application --key value"

请注意,需要完整路径。您还可以通过在双破折号 -- 符号后附加 #xserverrc 脚本的自定义选项

$ startx /usr/bin/enlightenment -- -br +bs -dpi 96

另请参阅 startx(1)

注意: 由于 /etc/X11/xinit/xinitrc.d/ 下的脚本被跳过,因此可能需要设置环境变量 DISPLAY。您可以通过执行 DISPLAY=:显示器号码 startx /usr/bin/i3 在所需的显示器上试用 i3
提示: 这可以用于启动常规 GUI 程序,但没有任何基本的窗口管理器功能。另请参阅 #在没有窗口管理器的情况下启动应用程序在单独的 X 显示器中运行程序

登录时自动启动 X

确保 startx 已正确配置

将以下内容放在您的登录 shell 初始化文件中(例如,Bash~/.bash_profileZsh~/.zprofile

if [ -z "$DISPLAY" ] && [ "$XDG_VTNR" = 1 ]; then
  exec startx
fi

如果要在一个以上的虚拟终端上使用图形登录,可以将 -eq 比较替换为类似 -le 3(对于 vt1 到 vt3)的比较。

检测虚拟终端的替代条件包括 "$(tty)" = "/dev/tty1",它不允许与 -le 进行比较,以及 "$(fgconsole 2>/dev/null || echo -1)" -eq 1,它在串行控制台中不起作用。

exec 命令确保用户在 X 服务器退出、崩溃或被攻击者杀死时注销。如果您想冒险并在 X 会话结束时保持登录状态,请删除 exec

另请参阅 Fish#登录时启动 XSystemd/User#无需显示管理器自动登录到 Xorg

提示: 此方法可以与自动登录到虚拟控制台结合使用。

在桌面环境/窗口管理器之间切换

如果您经常在不同的桌面环境或窗口管理器之间切换,则使用显示管理器或扩展 ~/.xinitrc 以使切换成为可能很方便。

以下示例显示了如何使用参数启动特定的桌面环境或窗口管理器

~/.xinitrc
...

# Here Xfce is kept as default
session=${1:-xfce}

case $session in
    i3|i3wm           ) exec i3;;
    kde               ) exec startplasma-x11;;
    xfce|xfce4        ) exec startxfce4;;
    # No known session, try to run it as command
    *                 ) exec $1;;
esac

要传递参数 session

$ xinit session

$ startx ~/.xinitrc session

在没有窗口管理器的情况下启动应用程序

可以仅启动特定的应用程序,而无需窗口管理器,尽管最有可能这仅对以全屏模式显示的单个应用程序有用。例如

~/.xinitrc
...

exec chromium

或者,可以从命令提示符直接调用二进制文件,如 #覆盖 xinitrc 中所述。

使用此方法,您需要通过每个应用程序自己的配置文件(如果可能)来设置每个应用程序的窗口几何形状。

提示: 这对于启动图形游戏很有用,在图形游戏中,排除合成器的开销可以帮助提高游戏的性能。

另请参阅 显示管理器#在没有窗口管理器的情况下启动应用程序

使用 startx 重定向输出

有关详细信息,请参阅 Xorg#会话日志重定向

在虚拟服务器中运行

本文或本节是移动到 Xorg 的候选内容。

注释:xinit 无关。(在 Talk:Xinit 中讨论)

用于运行图形应用程序很有用

  • 无需显示其 GUI。
  • 在测试用例中。
  • 在没有运行 xorg-server 的系统中。
  • 在干净的 chroot 中构建时。

安装 xorg-server-xvfb,然后运行 xvfb-run 命令