xinit (简体中文)

From ArchWiki

翻译状态:本文是 xinit翻译。上次翻译日期:2022-09-04。如果英文版本有所更改,则您可以帮助同步翻译。

摘自 Wikipedia:

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

xinit 通常用于启动 窗口管理器桌面环境。虽然你也可以用 xinit 来运行没有窗口管理器的GUI应用程序,但许多图形应用程序希望有一个 EWMH 兼容的窗口管理器。显示管理器 一般都依据 xprofile 为你启动 Xorg

安装

安装 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 中的脚本有源可循。

在窗口管理器之前启动的长期运行的程序,如屏保和墙纸程序,必须自己分叉或通过附加 & 符号在后台运行。否则,在执行窗口管理器或桌面环境之前,脚本会停止运行并等待每个程序退出。请注意,有些程序反而不应该被分叉,以避免出现竞争性错误,如 xrdb 的情况。在 exec 前缀会将脚本进程替换为窗口管理器进程,这样,即使该进程分叉到后台,X也不会退出。

xserverrc

xserverrc 文件是一个负责启动X服务器的shell脚本。startx "和 "xinit "都会执行 ~/.xserverrc,如果它存在的话,"startx "会使用 /etc/X11/xinit/xserverrc

为了保持 logind认证会话,并防止通过切换终端绕过屏幕锁定器,Xorg必须在发生登录的同一虚拟终端上启动[1]。因此建议在 vt$XDG_VTNR文件中指定 ~/.xserverrc

~/.xserverrc
}文件:
#!/bin/sh

exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR

参见 Xserver(1) 中的所有命令行选项列表。

提示: -nolisten local 可以加在 -nolisten tcp 之后,以禁用X11的抽象套接字,帮助隔离。 关于这对X11安全的潜在影响,有一个 快速背景

另外,如果你想让X显示在一个独立的控制台,而不是调用服务器的控制台,你可以通过使用 /usr/lib/systemd/systemd-multi-seat-x 提供的X服务器包装器实现。为方便起见,可以通过修改 ~/.xserverrc 设置 "xinit "和 "startx "使用该包装器。

-keeptty选项,重新启用将X会话的输出重定向至Xorg日志文件的功能。详见 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程序,但没有任何基本的窗口管理器功能。参见 #在没有窗口管理器的情况下启动应用程序在独立的X显示屏中运行程序

登录时自动启动 X

确保startx是正确的 配置

在你的 login shell 初始化文件(例如,Bash~/.bash_profileZsh~/.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 loginSystemd/User#Automatic login into Xorg without display manager

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

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

如果你经常在不同的桌面环境或窗口管理器之间切换,使用 显示管理器 或扩展 ~/.xinitrc 来实现切换是很方便的。

下面的例子展示了如何用一个参数来启动一个特定的桌面环境或窗口管理器。

~/.xinitrc
...

# 这里 Xfce 保持默认
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 了解详情。