xinit

来自 ArchWiki
(重定向自 .xinitrc

来自 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