xinit
来自 Wikipedia
xinit 通常用于启动 窗口管理器或 桌面环境。虽然你也可以使用 xinit 在没有窗口管理器的情况下运行 GUI 应用程序,但许多图形应用程序期望一个符合 EWMH 标准的窗口管理器。 显示管理器会为你启动 Xorg,并且通常会加载 xprofile。
安装
安装 xorg-xinit 包。
配置
xinit 和 startx 接受一个可选的客户端程序参数,请参见 #覆盖 xinitrc。如果你不提供参数,它们会查找 ~/.xinitrc 并将其作为 shell 脚本运行来启动客户端程序。
xinitrc
~/.xinitrc 文件非常方便,可以在 X 服务启动时运行依赖于 X 的程序并设置环境变量。如果该文件存在于用户的家目录中,startx 和 xinit 就会执行它。否则,startx 将运行默认的 /etc/X11/xinit/xinitrc。
这个默认的 xinitrc 将启动一个基本环境,包括 Twm、xorg-xclock 和 Xterm(假设已安装必要的包)。因此,要启动不同的窗口管理器或桌面环境,首先在你的家目录中创建一个默认 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 存在,startx 和 xinit 都会执行它;否则,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#Session log redirection。用法
要以普通用户身份运行 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" -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。
在虚拟服务器中运行
用于运行图形应用程序
- 而不显示其 GUI。
- 在测试用例中。
- 在没有运行 xorg-server 的系统内。
- 在 干净 chroot 中构建时。
安装 xorg-server-xvfb,然后运行 xvfb-run command。