xinit

来自 ArchWiki
(重定向自 在登录时启动 X

来自 Wikipedia

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

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

安装

安装 xorg-xinit 软件包。

配置

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

xinitrc

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

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

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

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

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

~/.xinitrc
...
xscreensaver &
exec openbox-session
注意: 至少,请确保 /etc/X11/xinit/xinitrc 中的最后一个 if 代码块存在于您的 ~/.xinitrc 文件中,以确保 /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 不处理多个显示器。为此,您必须通过附加 -- :display_number 来指定显示器,其中 display_number1 或更大。

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

要退出 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=:display_number 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 中讨论)

可用于运行图形应用程序

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