xinit
来自 Wikipedia
xinit 通常用于启动窗口管理器或桌面环境。虽然您也可以使用 xinit 来运行没有窗口管理器的 GUI 应用程序,但许多图形应用程序期望使用符合 EWMH 标准的窗口管理器。显示管理器为您启动 Xorg,并且通常会读取 xprofile。
安装
安装 xorg-xinit 软件包。
配置
xinit 和 startx 接受一个可选的客户端程序参数,请参阅 #覆盖 xinitrc。如果您不提供,它们将查找 ~/.xinitrc
以作为 shell 脚本运行,从而启动客户端程序。
xinitrc
~/.xinitrc
对于运行依赖于 X 的程序以及在 X 服务器启动时设置环境变量非常方便。如果用户的 home 目录下存在该文件,startx 和 xinit 将会执行它。否则,startx 将运行默认的 /etc/X11/xinit/xinitrc
。
默认的 xinitrc 将启动一个基本环境,其中包含 Twm、xorg-xclock 和 Xterm (假设必要的软件包已安装)。因此,要启动不同的窗口管理器或桌面环境,首先在您的 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 服务器。startx 和 xinit 都会在 ~/.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
-keeptty
选项。有关详细信息,请参阅 Xorg#会话日志重定向。用法
要以普通用户身份运行 Xorg,请执行
$ startx
或者如果配置了 #xserverrc
$ xinit -- :1
-- :display_number
来指定显示器,其中 display_number
为 1
或更大。现在,您选择的窗口管理器(或桌面环境)应该可以正确启动。
要退出 X,请运行窗口管理器的退出功能(假设它有)。如果它缺少此功能,请运行
$ pkill -15 Xorg
$ 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。在登录时自动启动 X
确保 startx 已正确配置。
将以下内容放在您的登录 shell 初始化文件中(例如,Bash 的 ~/.bash_profile
或 Zsh 的 ~/.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#在登录时启动 X 和 Systemd/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#会话日志重定向。
在虚拟服务器中运行
可用于运行图形应用程序
- 无需显示其 GUI。
- 在测试用例中。
- 在没有运行 xorg-server 的系统中。
- 在在干净的 chroot 中构建时。
安装 xorg-server-xvfb,然后运行 xvfb-run command
。