xinit (简体中文) - ArchWiki

Jump to content

相关文章

- Display manager (简体中文)
- Start X at Login (简体中文)
- Xorg_(简体中文)
- Xprofile_(简体中文)
- Xresources

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

摘自 Wikipedia:

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

xinit 通常用于启动 窗口管理器 或 桌面环境。虽然您也可以用 xinit 在没有窗口管理器的情况下运行 GUI 应用程序，但许多图形应用程序期待一个 EWMH 兼容的窗口管理器。显示管理器 一般都依据 xprofile 为您启动 Xorg。

## 安装

安装 xorg-xinit 包。

## 配置

xinit 和 startx 需要一个可选的客户端程序参数，见 #覆盖 xinitrc 。 如果您没有提供参数，它们会寻找 `~/.xinitrc`，作为一个shell脚本运行，以启动客户程序。

### xinitrc

`~/.xinitrc` 可以方便地在X服务器启动时运行依赖于X的程序并设置环境变量。如果它存在于用户的主目录中，startx 和 xinit 会执行它。否则 startx 将运行默认的`/etc/X11/xinit/xinitrc`。

注意： xinit 有自己的默认行为，而不是执行该文件。详见 xinit(1)。

这个默认的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) 中的所有命令行选项列表。

提示： `-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_number` 为 `1` 或以上。

您选择的窗口管理器（或桌面环境）现在应该可以正确启动了。

要退出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_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 中描述的那样，直接从命令提示符中调用二进制。

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

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

另请参见 Display_manager_(简体中文)#没有窗口管理启动应用程序。

### 使用 startx 进行输出重定向

参见 Xorg_(简体中文)#重定向Xorg会话日志 了解详情。

Categories:

- Desktop environments (简体中文)
- Xorg commands (简体中文)