xinit
摘自 Wikipedia:
xinit 通常用于启动窗口管理器或桌面环境。虽然您也可以用 xinit 在没有窗口管理器的情况下运行 GUI 应用程序,但许多图形应用程序期待一个 EWMH 兼容的窗口管理器。显示管理器一般都依据 xprofile 为您启动 Xorg。
安装[编辑 | 编辑源代码]
安装 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
中的脚本有源可循。在窗口管理器之前启动的长期运行的程序,如屏保和墙纸程序,必须自己分叉或通过附加 &
符号在后台运行。否则,在执行窗口管理器或桌面环境之前,脚本会停止运行并等待每个程序退出。请注意,有些程序反而不应该被分叉,以避免出现竞争性错误,如 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) 中的所有命令行选项列表。
另外,如果您想让X显示在一个独立的控制台,而不是调用服务器的控制台,您可以通过使用 /usr/lib/systemd/systemd-multi-seat-x
提供的X服务器包装器实现。为方便起见,可以通过修改 ~/.xserverrc
设置 "xinit "和 "startx "使用该包装器。
-keeptty
选项,重新启用将X会话的输出重定向至Xorg日志文件的功能。详见 Xorg#重定向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 是正确的配置。
在您的 login 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_(简体中文)#登录_fish_时自动起动_X 和 Systemd_(简体中文)/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会话日志了解详情。