xinit

来自 Arch Linux 中文维基

摘自 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#重定向Xorg会话日志。}}

用法[编辑 | 编辑源代码]

要以普通用户身份运行 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_(简体中文)#登录_fish_时自动起动_XSystemd_(简体中文)/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 中描述的那样,直接从命令提示符中调用二进制。

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

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

另请参见显示管理器#没有窗口管理启动应用程序

使用 startx 进行输出重定向[编辑 | 编辑源代码]

参见Xorg#重定向Xorg会话日志了解详情。