Difference between revisions of "Xinit (简体中文)"

From ArchWiki
Jump to: navigation, search
m (在启动的时候自动启用X: beautify title)
(Update translation.)
Line 17: Line 17:
 
{{Related|Xresources}}
 
{{Related|Xresources}}
 
{{Related articles end}}
 
{{Related articles end}}
{{TranslationStatus (简体中文)|xinit|2016-08-04|442881}}
+
{{TranslationStatus (简体中文)|xinit|2018-05-10|516945}}
{{ic|~/.xinitrc}} 文件是 {{ic|xinit}} 和它的前端 {{ic|startx}} 第一次启动时会读取的脚本。通常用在启动 X 时执行[[window manager (简体中文)|窗口管理器]] 和其他程序,例如启动守护进程和设置环境变量。{{ic|xinit}}程序用来启动[[Xorg|X窗口系统]],是不使用[[display manager|显示管理器]]时的第一个客户端。
+
摘自 [[Wikipedia:xinit|Wikipedia]]:
 +
:用户可以通过 '''xinit''' 程序手动启动 [[Xorg]] 显示服务器,{{man|1|startx}} 脚本是 {{man|1|xinit}} 的前端。
  
{{ic|~/.xinitrc}} 一个主要功能是根据单个用户的设置决定 {{ic|/usr/bin/startx}} {{ic|/usr/bin/xinit}} 程序启动的窗口系统。{{ic|~/.xinitrc}} 中还可以加入许多系统定制选项。大部分显示管理器也会在 xinit 前读取相似的 [[xprofile]] 文件。
+
''xinit'' 和 ''startx'' 可以带一个可选的客户端程序参数,如果未提供这个参数,它们会从 {{ic|~/.xinitrc}} 确认要启动的客户端。所以 {{ic|xinit /usr/bin/foo}} 等价于在 {{ic|~/.xinitrc}} 中设置 {{ic|exec foo}} 并执行 {{ic|xinit}}
 +
 
 +
 +
iis handy to run programs depending on X and set environment variables on X server startup. . 
 +
 
 +
''xinit'' 通常用在启动 X 时执行[[window manager (简体中文)|窗口管理器]] 或 [[desktop environment|桌面环境]]。虽然可以使用 ''xinit'' 在无窗口管理器的情况下启动图形程序,大部分图形程序都需要一个兼容 [[Wikipedia:Extended Window Manager Hints|EWMH]] 的窗口管理器。{{ic|~/.xinitrc}} 可以启动依赖 X 的程序,并在 X 启动时设置环境变量。[[Display manager|显示管理器]] 启动 [[Xorg]] 并读取 [[xprofile]]
  
 
== 安装 ==
 
== 安装 ==
[[Install|安装]] 软件包 {{Pkg|xorg-xinit}}. 此软件包提供了 ''xinit''、''startx''和默认的 xinitrc 文件。
+
[[Install|安装]] 软件包 {{Pkg|xorg-xinit}}
  
 
== 配置 ==
 
== 配置 ==
 
=== xserverrc ===
 
 
{{ic|xserverrc}} 文件是一个启动 X server 的 shell 脚本。如果存在 {{ic|~/.xserverrc}} ,''startx'' 和 ''xinit'' 都会执行这个文件。如果文件不存在,''startx'' 会使用 {{ic|/etc/X11/xinit/xserverrc}}.
 
 
为了维护  {{ic|logind}} 的 [[General troubleshooting#Session permissions|authenticated session 会话]],避免切换终端时跳过屏幕锁, 必须找用户登录的虚拟终端启动 [[Xorg]]。[http://blog.falconindy.com/articles/back-to-basics-with-x-and-systemd.html] 所以建议在 {{ic|~/.xserverrc}} 中指定 {{ic|vt$XDG_VTNR}}:
 
 
{{hc|~/.xserverrc|
 
#!/bin/sh
 
exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR
 
}}
 
 
如果要让 X 在其他的终端启动,可以使用 {{ic|/usr/lib/systemd/systemd-multi-seat-x}} 提供的 X server 包裹程序。修改 {{ic|~/.xserverrc}},可以让 ''xinit'' 和''startx'' 都使用这个包裹程序.
 
  
 
=== xinitrc ===
 
=== xinitrc ===
Line 50: Line 43:
 
然后编辑 {{ic|~/.xinitrc}} ,例如要使用 [[Openbox]],修改为:
 
然后编辑 {{ic|~/.xinitrc}} ,例如要使用 [[Openbox]],修改为:
 
{{bc|
 
{{bc|
#!/bin/sh
 
#
 
# ~/.xinitrc
 
#
 
# Executed by startx (run your window manager from here)
 
 
...
 
...
 +
xscreensaver '''&'''
 +
xsetroot -cursor_name left_ptr '''&'''
 +
'''exec''' openbox-session
 +
}}
 +
 +
{{ic|~/.xinitrc}} 中应该只有 '''一个''' 未注释掉的 {{ic|exec}} 行,而且 exec 行必须位于配置文件的末尾。exec 后面的所有命令只有窗口退出后才会被执行。在窗口管理器前启动的命令,例如屏保和壁纸程序,必须自行 fork 后台进程或用{{ic|&}}在后台启动, 否则启动程序会等待它们退出才会启动窗口管理器或桌面环境。使用 {{ic|exec}} 作为前缀会替换当前的进程,这样进程进入后台时 X 不会退出。
  
if [ -d /etc/X11/xinit/xinitrc.d ] ; then
+
某些程序,比如 [[xrdb]],不应该被 fork. 使用 {{ic|exec}} 前缀时,程序将会用窗口管理器进程替换脚本进程,所以即使进程进入后台 X 也不会退出。
    for f in /etc/X11/xinit/xinitrc.d/'''?*.sh''' ; do
+
 
        [ -x "$f" ] && . "$f"
+
=== xserverrc ===
    done
+
 
    unset f
+
{{ic|xserverrc}} 文件是一个启动 X server 的 shell 脚本。如果存在 {{ic|~/.xserverrc}} ,''startx'' 和 ''xinit'' 都会执行这个文件。如果文件不存在,''startx'' 会使用 {{ic|/etc/X11/xinit/xserverrc}}.
fi
 
  
# exec gnome-session
+
为了维护  {{ic|logind}} 的 [[General troubleshooting#Session permissions|authenticated session 会话]],避免切换终端时跳过屏幕锁, 必须找用户登录的虚拟终端启动 [[Xorg]]。[http://blog.falconindy.com/articles/back-to-basics-with-x-and-systemd.html] 所以建议在 {{ic|~/.xserverrc}} 中指定 {{ic|vt$XDG_VTNR}}:
# exec startkde
 
# exec startxfce4
 
# exec wmaker
 
# exec icewm
 
# exec blackbox
 
# exec fluxbox
 
# exec openbox-session
 
# ...or the Window Manager of your choice
 
  
## some applications that should be run in the background
+
{{hc|~/.xserverrc|
xscreensaver '''&'''
+
#!/bin/sh
xsetroot -cursor_name left_ptr '''&'''
+
exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR
'''exec''' openbox-session
 
 
}}
 
}}
  
{{ic|~/.xinitrc}} 中应该只有 '''一个''' 未注释掉的 {{ic|exec}} 行,而且 exec 行必须位于配置文件的末尾。exec 后面的所有命令只有窗口退出后才会被执行。在窗口管理器前启动的命令应该用 '''&''' 在后台启动, 否则启动程序会等待它们退出。使用 {{ic|exec}} 作为前缀会替换当前的进程,这样进程进入后台时 X 不会退出。
+
如果要让 X 在其他的终端启动,可以使用 {{ic|/usr/lib/systemd/systemd-multi-seat-x}} 提供的 X server 包裹程序。修改 {{ic|~/.xserverrc}},可以让 ''xinit'' ''startx'' 都使用这个包裹程序.
  
 
== 使用 ==
 
== 使用 ==
Line 100: Line 84:
  
 
{{Note|''pkill'' 会杀死所有 X 实例,如果仅希望杀死当前虚拟终端的窗口管理器,运行:
 
{{Note|''pkill'' 会杀死所有 X 实例,如果仅希望杀死当前虚拟终端的窗口管理器,运行:
 
 
  $ pkill -15 -t tty"$XDG_VTNR" Xorg
 
  $ pkill -15 -t tty"$XDG_VTNR" Xorg
 
{{ic|xprop}} 是软件包 {{Pkg|xorg-xprop}}提供的。
 
 
}}
 
}}
  
Line 117: Line 98:
  
 
{{bc|1=<nowiki>
 
{{bc|1=<nowiki>
[ -z "$DISPLAY" -a "$(fgconsole)" -eq 1 ] && exec startx
+
if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
 +
  exec startx
 +
fi
 
</nowiki>}}
 
</nowiki>}}
  
Line 131: Line 114:
  
 
参阅 [[Fish#Start X at login]] 和 [[Systemd/User#Automatic login into Xorg without display manager]].
 
参阅 [[Fish#Start X at login]] 和 [[Systemd/User#Automatic login into Xorg without display manager]].
 
=== 自动登录到虚拟终端 ===
 
  
 
可以和 [[automatic login to virtual console|自动登录到虚拟终端]]一起使用.
 
可以和 [[automatic login to virtual console|自动登录到虚拟终端]]一起使用.
Line 143: Line 124:
 
  $ startx /full/path/to/window-manager
 
  $ startx /full/path/to/window-manager
  
Note that the full path is '''required'''. Optionally, you can also specify custom options for [[#xserverrc]] script by appending them after {{ic|--}}, e.g.:
+
必须使用完整 '''required'''. 还有一个选项是为 [[#xserverrc]] 提供额外参数,加在 {{ic|--}} 后面,例如:
  
 
   $ startx /usr/bin/enlightenment -- -br +bs -dpi 96
 
   $ startx /usr/bin/enlightenment -- -br +bs -dpi 96
Line 149: Line 130:
 
参阅  {{man|1|startx}}.
 
参阅  {{man|1|startx}}.
  
=== Making a DE/WM choice ===
+
=== Switching between desktop environments/window managers ===
  
If you are frequently switching between different DEs/WMs, it is recommended to either use a [[Display manager]] or add code to {{ic|.xinitrc}}. The code described next consists of a simple few lines, which will take the argument and load the desired desktop environment or window manager.
+
If you are frequently switching between different desktop environments or window managers, it is convenient to either use a [[display manager]] or expand {{ic|.xinitrc}} to make the switching possible.
  
The following example {{ic|~/.xinitrc}} shows how to start a particular DE/WM with an argument:
+
The following example {{ic|~/.xinitrc}} shows how to start a particular desktop environment or window manager with an argument:
  
 
{{hc|~/.xinitrc|<nowiki>
 
{{hc|~/.xinitrc|<nowiki>
Line 162: Line 143:
  
 
case $session in
 
case $session in
    awesome          ) exec awesome;;
 
    bspwm            ) exec bspwm;;
 
    catwm            ) exec catwm;;
 
    cinnamon          ) exec cinnamon-session;;
 
    dwm              ) exec dwm;;
 
    enlightenment    ) exec enlightenment_start;;
 
    ede              ) exec startede;;
 
    fluxbox          ) exec startfluxbox;;
 
    gnome            ) exec gnome-session;;
 
    gnome-classic    ) exec gnome-session --session=gnome-classic;;
 
 
     i3|i3wm          ) exec i3;;
 
     i3|i3wm          ) exec i3;;
    icewm            ) exec icewm-session;;
 
    jwm              ) exec jwm;;
 
 
     kde              ) exec startkde;;
 
     kde              ) exec startkde;;
    mate              ) exec mate-session;;
 
    monster|monsterwm ) exec monsterwm;;
 
    notion            ) exec notion;;
 
    openbox          ) exec openbox-session;;
 
    unity            ) exec unity;;
 
 
     xfce|xfce4        ) exec startxfce4;;
 
     xfce|xfce4        ) exec startxfce4;;
    xmonad            ) exec xmonad;;
 
 
     # No known session, try to run it as command
 
     # No known session, try to run it as command
     *) exec $1;;
+
     *                 ) exec $1;;
 
esac
 
esac
 
</nowiki>}}
 
</nowiki>}}
  
After that, you can easily start a particular DE/WM by passing an argument, e.g.:
+
To pass the argument ''session'':
  
  $ xinit
+
  $ xinit ''session''
$ xinit gnome
 
$ xinit kde
 
$ xinit wmaker
 
  
 
or
 
or
  
$ startx
+
  $ startx ~/.xinitrc ''session''
  $ startx ~/.xinitrc gnome
 
$ startx ~/.xinitrc kde
 
$ startx ~/.xinitrc wmaker
 
  
 
=== 不启动窗口管理器,直接启动程序 ===
 
=== 不启动窗口管理器,直接启动程序 ===
Line 217: Line 174:
  
 
See also [[Display manager#Starting applications without a window manager]].
 
See also [[Display manager#Starting applications without a window manager]].
 +
 +
=== Output redirection using startx ===
 +
 +
See [[Xorg#Broken redirection]] for details.

Revision as of 06:58, 10 May 2018

翻译状态: 本文是英文页面 xinit翻译,最后翻译时间:2018-05-10,点击这里可以查看翻译后英文页面的改动。

摘自 Wikipedia:

用户可以通过 xinit 程序手动启动 Xorg 显示服务器,startx(1) 脚本是 xinit(1) 的前端。

xinitstartx 可以带一个可选的客户端程序参数,如果未提供这个参数,它们会从 ~/.xinitrc 确认要启动的客户端。所以 xinit /usr/bin/foo 等价于在 ~/.xinitrc 中设置 exec foo 并执行 xinit


iis handy to run programs depending on X and set environment variables on X server startup. .

xinit 通常用在启动 X 时执行窗口管理器桌面环境。虽然可以使用 xinit 在无窗口管理器的情况下启动图形程序,大部分图形程序都需要一个兼容 EWMH 的窗口管理器。~/.xinitrc 可以启动依赖 X 的程序,并在 X 启动时设置环境变量。显示管理器 启动 Xorg 并读取 xprofile

安装

安装 软件包 xorg-xinit

配置

xinitrc

如果用户主目录中存在 .xinitrcstartxxinit 会执行此文件。如果不存在,startx 会执行默认的 /etc/X11/xinit/xinitrc。这个文件默认启动 TwmXterm. xinit 的默认行为不一样,请参阅 xinit(1)。要设置窗口管理器或桌面环境,先通过复制创建默认文件:

$ cp /etc/X11/xinit/xinitrc ~/.xinitrc

根据示例文件修改可以保留一些默认行为,例如会引用 /etc/X11/xinit/xinitrc.d 中以 .sh 结尾的脚本。

然后编辑 ~/.xinitrc ,例如要使用 Openbox,修改为:

...
xscreensaver &
xsetroot -cursor_name left_ptr &
exec openbox-session

~/.xinitrc 中应该只有 一个 未注释掉的 exec 行,而且 exec 行必须位于配置文件的末尾。exec 后面的所有命令只有窗口退出后才会被执行。在窗口管理器前启动的命令,例如屏保和壁纸程序,必须自行 fork 后台进程或用&在后台启动, 否则启动程序会等待它们退出才会启动窗口管理器或桌面环境。使用 exec 作为前缀会替换当前的进程,这样进程进入后台时 X 不会退出。

某些程序,比如 xrdb,不应该被 fork. 使用 exec 前缀时,程序将会用窗口管理器进程替换脚本进程,所以即使进程进入后台 X 也不会退出。

xserverrc

xserverrc 文件是一个启动 X server 的 shell 脚本。如果存在 ~/.xserverrcstartxxinit 都会执行这个文件。如果文件不存在,startx 会使用 /etc/X11/xinit/xserverrc.

为了维护 logindauthenticated session 会话,避免切换终端时跳过屏幕锁, 必须找用户登录的虚拟终端启动 Xorg[1] 所以建议在 ~/.xserverrc 中指定 vt$XDG_VTNR:

~/.xserverrc
	
#!/bin/sh
exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR

如果要让 X 在其他的终端启动,可以使用 /usr/lib/systemd/systemd-multi-seat-x 提供的 X server 包裹程序。修改 ~/.xserverrc,可以让 xinitstartx 都使用这个包裹程序.

使用

现在以普通用户启动 X:

 $ startx

或者

$ xinit -- :1
Note: xinit 无法在其它 X server 启动时处理多个显示,要使用多显示,需要通过 -- :display_number 指定,display_number 是 1 或更高的数值。

选择的窗口管理器或桌面环境就应该正常启动了.

要退出 X, 运行窗口管理器的退出功能,如果窗口管理器未提供此功能,可以运行:

$ pkill -15 Xorg
Note: pkill 会杀死所有 X 实例,如果仅希望杀死当前虚拟终端的窗口管理器,运行:
$ pkill -15 -t tty"$XDG_VTNR" Xorg

在启动时自动启用 X

先确保 startx 已经配置好了。

注意: 这种方式将在登陆 tty 启动 X,只有这样才能保持登录会话。

如果使用Bash, 编辑 ~/.bash_profile,加入如下内容. 如果文件不存在,从 /etc/skel/.bash_profile 复制一个框架版本。

如果使用 zsh,则编辑 ~/.zprofile.

if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
  exec startx
fi
注意:
  • 如果想在多个 VT 上使用图形登陆,可以将-eq 1修改为-le 3 (vt1 到 vt3)
  • 如果希望在 X 会话终止时保持登入状态,删除 exec.
  • 此方法与automatic login to virtual console一起可以实现自动登陆。
  • 如果 X 被关闭,用户将自动退出。要避免这个问题,删除 exec
  • 要将 X 会话的输出重定向到一个文件,请创建一个别名alias:
alias startx='startx &> ~/.xlog'

参阅 Fish#Start X at loginSystemd/User#Automatic login into Xorg without display manager.

可以和 自动登录到虚拟终端一起使用.

提示和技巧

从命令行覆盖 xinitrc

如果你有一个可用的 ~/.xinitrc, 件,只想尝试下其他的窗口管理器/桌面环境,你可从命令行给 startx 完整路径

$ startx /full/path/to/window-manager

必须使用完整 required. 还有一个选项是为 #xserverrc 提供额外参数,加在 -- 后面,例如:

 $ startx /usr/bin/enlightenment -- -br +bs -dpi 96

参阅 startx(1).

Switching between desktop environments/window managers

If you are frequently switching between different desktop environments or window managers, it is convenient to either use a display manager or expand .xinitrc to make the switching possible.

The following example ~/.xinitrc shows how to start a particular desktop environment or window manager with an argument:

~/.xinitrc
...

# Here Xfce is kept as default
session=${1:-xfce}

case $session in
    i3|i3wm           ) exec i3;;
    kde               ) exec startkde;;
    xfce|xfce4        ) exec startxfce4;;
    # No known session, try to run it as command
    *                 ) exec $1;;
esac

To pass the argument session:

$ xinit session

or

$ startx ~/.xinitrc session

不启动窗口管理器,直接启动程序

It is possible to start only specific applications without a window manager, although most likely this is only useful with a single application shown in full-screen mode. For example:

~/.xinitrc
...

exec chromium

With this method you need to set each application window's geometry through its own configuration files, if possible at all.

Tip: This method can be useful to launch graphical games, especially on systems where excluding the memory or CPU usage of a window manager or desktop environment, and possible accessory applications, can help improve the game's execution performance.

See also Display manager#Starting applications without a window manager.

Output redirection using startx

See Xorg#Broken redirection for details.