跳转至内容

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 的程序并设置环境变量。如果该文件存在于用户的家目录中,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
注意 至少要确保 /etc/X11/xinit/xinitrc 文件中的最后一个 if 块在你的 ~/.xinitrc 文件中存在,以确保加载了 /etc/X11/xinit/xinitrc.d 中的脚本。

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

xserverrc

xserverrc 文件是一个负责启动 X 服务器的 shell 脚本。如果 ~/.xserverrc 存在,startxxinit 都会执行它;否则,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#Session log redirection

用法

要以普通用户身份运行 Xorg,请发出以下命令:

$ startx

或者,如果 #xserverrc 已配置

$ xinit -- :1
注意 xinit 不处理多个显示器,当另一个 X 服务器已启动时。为此,您必须通过追加 -- :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 程序,但没有任何基本的窗口管理器功能。另请参见 #在没有窗口管理器的情况下启动应用程序Running program in separate X display

登录时自动启动 X

确保 startx 已正确 配置

将以下内容放在你的 登录 shell 初始化文件中(例如,对于 Bash~/.bash_profile,对于 Zsh~/.zprofile):

if [ -z "$DISPLAY" ] && [ "$XDG_VTNR" -eq 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#Start X at login

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

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

如果你经常在不同的桌面环境或窗口管理器之间切换,使用 显示管理器 或扩展 ~/.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 中描述的方式,直接从命令行调用该二进制文件。

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

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

另请参见 Display manager#Starting applications without a window manager

使用 startx 进行输出重定向

详情请参见 Xorg#Session log redirection

在虚拟服务器中运行

本文档或此章节可移至 Xorg

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

用于运行图形应用程序

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

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