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

From ArchWiki
Jump to navigation Jump to search
(rm temporary i18n template)
(update translation.)
Line 1: Line 1:
 
[[Category:Desktop environments (简体中文)]]
 
[[Category:Desktop environments (简体中文)]]
 
[[Category:X Server (简体中文)]]
 
[[Category:X Server (简体中文)]]
[[Category:简体中文]]
 
 
{{Lowercase title}}
 
{{Lowercase title}}
 
[[el:Xinitrc]]
 
[[el:Xinitrc]]
Line 14: Line 13:
 
{{Article summary wiki|Start X at boot (简体中文)}}
 
{{Article summary wiki|Start X at boot (简体中文)}}
 
{{Article summary wiki|Xorg (简体中文)}}
 
{{Article summary wiki|Xorg (简体中文)}}
{{Article summary wiki|xprofile (简体中文)}}
+
{{Article summary wiki|xprofile}}
 
{{Article summary end}} {{Lowercase title}}
 
{{Article summary end}} {{Lowercase title}}
{{TranslationStatus (简体中文)|Xinitrc|2012-05-24|202630}}
+
{{TranslationStatus (简体中文)|Xinitrc|2012-10-24|231090}}
{{ic|~/.xinitrc}} 文件是 {{ic|xinit}} 和 {{ic|startx}} 第一次启动时会读取的脚本。通常用在启动 X 时执行[[window manager (简体中文)|窗口管理器]] 和其他程序,例如启动守护进程和设置环境变量。{{ic|xinit}}程序用来启动[[Xorg|X窗口系统]],是不能直接从{{ic|/etc/init}}启动 X 或者使用多窗口的系统中的第一个客户端。所以 {{ic|~/.xinitrc}} 通常与[[Start_X_at_boot##/etc/inittab|直接从inittab运行startx脚本]]结合使用,是启动 X 的简单方法。
+
{{ic|~/.xinitrc}} 文件是 {{ic|xinit}} 和 {{ic|startx}} 第一次启动时会读取的脚本。通常用在启动 X 时执行[[window manager (简体中文)|窗口管理器]] 和其他程序,例如启动守护进程和设置环境变量。{{ic|xinit}}程序用来启动[[Xorg|X窗口系统]],是不能直接从{{ic|/etc/init}}启动 X 或者使用多窗口的系统中的第一个客户端。
  
 
{{ic|~/.xinitrc}} 一个主要功能是根据单个用户的设置决定 {{ic|/usr/bin/startx}} 或 {{ic|/usr/bin/xinit}} 程序启动的窗口系统。{{ic|~/.xinitrc}} 中还可以加入许多系统定制选项。
 
{{ic|~/.xinitrc}} 一个主要功能是根据单个用户的设置决定 {{ic|/usr/bin/startx}} 或 {{ic|/usr/bin/xinit}} 程序启动的窗口系统。{{ic|~/.xinitrc}} 中还可以加入许多系统定制选项。
Line 37: Line 36:
 
#
 
#
 
# Executed by startx (run your window manager from here)
 
# Executed by startx (run your window manager from here)
 +
if [ -d /etc/X11/xinit/xinitrc.d ]; then
 +
  for f in /etc/X11/xinit/xinitrc.d/*; do
 +
    [ -x "$f" ] && . "$f"
 +
  done
 +
  unset f
 +
fi
  
 
# exec gnome-session
 
# exec gnome-session
Line 53: Line 58:
  
 
现在可以启动 X 了,作为普通用户,而不是 root 用户,执行:
 
现在可以启动 X 了,作为普通用户,而不是 root 用户,执行:
$ startx
+
  $ startx -- vt$XDG_VTNR
  
+
{{Note|You need to make sure X will always start on the same tty where you logged in, to preserve your logind (or consolekit) session. This can be done either by include {{ic|exec /usr/bin/X -nolisten tcp vt$XDG_VTNR "$@"}} in {{ic|~/.xserverrc}} or using {{ic|startx -- vt$XDG_VTNR}}.}}
$ xinit
 
  
 
将会显示桌面,可以测试键盘及其布局,看看鼠标是否正常工作。
 
将会显示桌面,可以测试键盘及其布局,看看鼠标是否正常工作。
 
如果自动挂载有问题,请先安装 {{Pkg|consolekit}},然后修改 {{ic|~/.xinitrc}},将 {{ic|startxfce4}} 替换为 [[Window_Manager (简体中文)|窗口管理器]] 或 [[Desktop_Environment (简体中文)|桌面环境]]。
 
exec ck-launch-session startxfce4
 
 
这将保证各种环境变量设置正确,启动干净的 [[ConsoleKit]] 会话。ConsoleKit 是跟踪系统中多个用户、会话的框架。提供了一个软件根据用户、会话的变化而进行相应调整的机制。与 [[D-Bus (简体中文)|D-Bus]] 和其他工具一起工作。
 
  
 
== 文件示例 ==
 
== 文件示例 ==
Line 71: Line 70:
 
|<nowiki>
 
|<nowiki>
 
#!/bin/sh
 
#!/bin/sh
 +
 +
if [ -d /etc/X11/xinit/xinitrc.d ]; then
 +
  for f in /etc/X11/xinit/xinitrc.d/*; do
 +
    [ -x "$f" ] && . "$f"
 +
  done
 +
  unset f
 +
fi
  
 
xrdb -merge ~/.Xresources        # 更新 x 资源数据库
 
xrdb -merge ~/.Xresources        # 更新 x 资源数据库
Line 82: Line 88:
 
</nowiki>}}
 
</nowiki>}}
  
下面示例可以作为执行各种窗口管理器的模板,只要取消要使用窗口管理器前的注释,例如[[Openbox (简体中文)]]:
+
推荐使用 {{ic|exec}} 作为前缀,以替换当前的进程,这样脚本退出时 X 不会退出。
 
 
{{hc
 
|~/.xinitrc
 
|<nowiki>
 
#!/bin/sh
 
#
 
# ~/.xinitrc
 
#
 
# Executed by startx (run your window manager from here)
 
#
 
# exec ion
 
# exec jwm
 
# exec wmaker
 
# exec startkde
 
# exec icewm
 
# exec pekwm
 
# exec blackbox
 
# exec /usr/bin/ratpoison
 
# exec gnome-session
 
# exec startfluxbox
 
# exec startxfce4
 
# exec xfce4-session
 
exec openbox-session
 
# exec startlxde
 
</nowiki>}}
 
 
 
推荐使用 {{ic|exec}} 作为前缀,以替换当前的进程,但是如果所有其他窗口管理器都被注释掉,则不需要加 exec。尽可能使用完整路径,可以通过{{ic|type}} 命令获得:{ic|type startkde}}。
 
  
 
此外 {{Pkg|xorg-xinit}} 还提供了另外一个示例:{{ic|/etc/skel/.xinitrc}}。复制到主目录就能使用。
 
此外 {{Pkg|xorg-xinit}} 还提供了另外一个示例:{{ic|/etc/skel/.xinitrc}}。复制到主目录就能使用。
Line 118: Line 97:
 
如果未使用窗口管理器,请记得 X 会话的生命周期与 {{ic|~/.xinitrc}} 同步。只要脚本退出, X 就会关闭。所有窗口管理器的退出和 X 的退出应该同步。可以通过在脚本最后运行窗口管理器实现。
 
如果未使用窗口管理器,请记得 X 会话的生命周期与 {{ic|~/.xinitrc}} 同步。只要脚本退出, X 就会关闭。所有窗口管理器的退出和 X 的退出应该同步。可以通过在脚本最后运行窗口管理器实现。
  
在上面例子中,{{ic|cairo-compmgr}}、{{ic|xscreensaver}}、{{ic|xsetroot}} 和 {{ic|sh}} 都是后台运行({{ic|&}}后缀)。否则,脚本会等待每个进程结束才会执行 {{ic|openbox-session}}。同时,{{ic|openbox-session}} 不是后台运行,这样保证 openbox 不退出,脚本就不退出。如果收到执行 {{ic|startx}} 脚本,结束脚本将会关闭 X,退回 {{ic|/etc/inittab}} 启动的终端。
+
在上面例子中,{{ic|cairo-compmgr}}、{{ic|xscreensaver}}、{{ic|xsetroot}} 和 {{ic|sh}} 都是后台运行({{ic|&}}后缀)。否则,脚本会等待每个进程结束才会执行 {{ic|openbox-session}}。同时,{{ic|openbox-session}} 不是后台运行,这样保证 openbox 不退出,脚本就不退出。
 
 
如果从 {{ic|/etc/inittab}} 启动脚本,设置为 {{ic|respawn}} 而不是 {{ic|once}},{{ic|~/.xinitrc}} 会重新执行。这样就能不重启计算机就能重启 X。
 
  
 
下面介绍如何配置多桌面环境的 {{ic|~/.xinitrc}} 。
 
下面介绍如何配置多桌面环境的 {{ic|~/.xinitrc}} 。
Line 143: Line 120:
 
#
 
#
 
# Executed by startx (run your window manager from here)
 
# Executed by startx (run your window manager from here)
 +
 +
if [ -d /etc/X11/xinit/xinitrc.d ]; then
 +
  for f in /etc/X11/xinit/xinitrc.d/*; do
 +
    [ -x "$f" ] && . "$f"
 +
  done
 +
  unset f
 +
fi
  
 
if [[ $1 == "fluxbox" ]]
 
if [[ $1 == "fluxbox" ]]
Line 158: Line 142:
  
 
=== 随系统启动方式 ===
 
=== 随系统启动方式 ===
你也可以选择在启动时启动窗口管理器和桌面系统,仅仅使用{{ic|~/.xinitrc}} 和 [[GRUB]]即可,不要使用显示管理器。这个方法归功于Arch不使用任何特殊的runlevel系统。下面的这个{{ic|~/.xinitrc}}脚本检查并依据 runlevel 来分别启动[[Openbox]]和 [[GNOME]]:
+
参阅 [[Start X at Login]].
 
 
rl=$(runlevel | grep -o [0-6])
 
case $rl in
 
4) exec gnome-session;;
 
5) exec openbox-session;;
 
esac
 
 
 
要选择不同的 runlevels,在 GRUB 里复制一个启动项目并修改内核参数即可。在内核参数该句的最后加上 runlevel。{{ic|inittab}}所设置的默认 runlevel 5 会被所添加的runlevel所取代。以下的例子添加了runlevel 4:
 
 
 
title  Arch Linux GNOME
 
root  (hd0,2)
 
kernel /boot/vmlinuz-linux root=/dev/sda1 ro 4
 
initrd /boot/initramfs-linux.img
 
 
 
最后,你需要确定 {{ic|~/.xinitrc}} 文件会在选定的runlevel被运行。使用[[Start X at boot#/etc/inittab|startx]]中的指导,编辑{{ic|inittab}}在需要的 runlevel {{ic|startx}},从而来执行你的{{ic|~/.xinitrc}}脚本:
 
 
 
x:45:once:/bin/su PREFERED_USER -l -c "/bin/bash --login -c startx >/dev/null 2>&1"
 
 
 
注意“45”是指在runlevel 4 和 5 该句命令都适用,而最终执行后runlevel 4 和 5 不同产生的差异产生于{{ic|~/.xinitrc}} 文件。当我们想使得inittab文件区分的更明显一点的话,这样做会比较合适,因为当我们想在{{ic|inittab}}文件里使得启动设置很多样的话,里面的行会紧密的堆在一起。
 
  
 
==使用技巧==
 
==使用技巧==
=== PolicyKit 和 ConsoleKit ===
+
=== PolicyKit ===
许多桌面环境需要 [[PolicyKit]] 和 [[ConsoleKit]],否则会报错。常见问题是无法从桌面系统关机或重启,无 root 权限无法挂载 USB 设备、光驱等。大部分现代显示管理器会自动启动 PolicyKit 和 ConsoleKit。只是用 {{ic|~/.xinitrc}} 时,需要运行:
+
许多桌面环境需要 [[PolicyKit]],否则会报错。常见问题是无法从桌面系统关机或重启,无 root 权限无法挂载 USB 设备、光驱等。大部分现代显示管理器会自动启动 PolicyKit。只是用 {{ic|~/.xinitrc}} 时,需要在登录的 TTY 启动 X:
 
 
exec ck-launch-session gnome-session
 
 
 
[[SLiM (简体中文)|SLiM]] 现在已经支持 consolekit 会话。
 
 
   
 
   
{{注意|需要安装 {{pkg|polkit}} 和 {{pkg|consolekit}}。}}
+
{{注意|需要安装 {{pkg|polkit}}}}
 
 
如果是从 {{ic|/etc/skel/.xinitrc}} 获取 {{ic|~/.xinitrc}},最上面会有一个导入 {{ic|/etc/X11/xinit/xinitrc.d/}} 中脚本的代码,会导入 {{ic|/etc/X11/xinit/xinitrc.d/30-bus}},这个脚本会在 ConsoleKit 启动前启动 dbus:这会导致 Bug {{bug|25031}},因为 dbus 需要再 ConsoleKit '''之后''' 启动,否则会在挂载时出现权限问题。
 
 
 
临时解决方法是编辑 {{ic|~/.xinitrc}},将对应的代码修改为:
 
 
 
{{bc|<nowiki>if [ -d /etc/X11/xinit/xinitrc.d ]; then
 
  for f in /etc/X11/xinit/xinitrc.d/*; do
 
    # Do not launch dbus before ConsoleKit (FS#25031)
 
    #[ -x "$f" ] && . "$f"
 
    [ "$f" -ne "/etc/X11/xinit/xinitrc.d/30-dbus" ] && [ -x "$f" ] && . "$f"
 
  done
 
  unset f
 
fi</nowiki>}}
 
 
 
这样 dbus 会在 ConsoleKit 后启动,详情请阅读您使用的 [[Window Manager]] 或 [[Desktop Environment]]。
 
 
 
=== 先启动窗口管理器 ===
 
 
 
如果要在其他应用程序前启动窗口管理器:
 
 
 
#!/bin/bash
 
 
openbox & wmpid=$!
 
 
urxvtd -q -f -o &
 
xscreensaver -no-splash &
 
fbpanel &
 
 
wait $wmpid
 
 
 
第一行会将 openbox 作为后台进程启动,然后将进程 id ({{ic|$!}}) 保存到 {{ic|wmpid}}。最后一行会等待保存的进程 id {{ic|wmpid}} 结束。
 
 
 
== 参见 ==
 
* [http://www.slackbook.org/html/x-window-system-xinitrc.html slackbook.org]
 
* [http://fluxbox-wiki.org/index.php?title=.xinitrc Fluxbox维基的.xinitrc条目]
 

Revision as of 06:15, 24 October 2012

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end

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

~/.xinitrc 文件是 xinitstartx 第一次启动时会读取的脚本。通常用在启动 X 时执行窗口管理器 和其他程序,例如启动守护进程和设置环境变量。xinit程序用来启动X窗口系统,是不能直接从/etc/init启动 X 或者使用多窗口的系统中的第一个客户端。

~/.xinitrc 一个主要功能是根据单个用户的设置决定 /usr/bin/startx/usr/bin/xinit 程序启动的窗口系统。~/.xinitrc 中还可以加入许多系统定制选项。

开始

/etc/skel/ 为新创建用户提供了合理的默认配置文件和目录(skelskeleton 的简写,包含了用户主目录的基本结构)。 xorg-xinit 软件包会在 /etc/skel 中加入 .xinitrc 文件。

注意: ~/.xinitrc 是所谓的 '点' (.) 文件。*nix 系统中以点 (.) 开头的文件是隐藏文件,不会在普通 ls 命令中显示。点文件可以通过 ls -a 显示。'rc' 指 Run Commands,意味着它是一个配置文件。因为它控制了一个程序的运行,所以也可以认为是 "Run Control"。

将示例 /etc/skel/.xinitrc 文件复制到主目录:

$ cp /etc/skel/.xinitrc ~/

然后编辑 ~/.xinitrc ,取消对应 桌面 前的注释。例如要使用 Xterm,修改为:

#!/bin/sh
#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)
if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

# exec gnome-session
# exec startkde
# exec startxfce4
# exec wmaker
# exec icewm
# exec blackbox
# exec fluxbox
# exec openbox-session
# ...or the Window Manager of your choice
exec xterm
注意: ~/.xinitrc 中应该只有 一个 未注释掉的 exec 行,否则仅第一个会被执行。

现在可以启动 X 了,作为普通用户,而不是 root 用户,执行:

 $ startx -- vt$XDG_VTNR
Note: You need to make sure X will always start on the same tty where you logged in, to preserve your logind (or consolekit) session. This can be done either by include exec /usr/bin/X -nolisten tcp vt$XDG_VTNR "$@" in ~/.xserverrc or using startx -- vt$XDG_VTNR.

将会显示桌面,可以测试键盘及其布局,看看鼠标是否正常工作。

文件示例

下面是一个简单的 ~/.xinitrc 文件示例,包含简单的启动程序:

~/.xinitrc
#!/bin/sh

if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

xrdb -merge ~/.Xresources         # 更新 x 资源数据库

xscreensaver -no-splash &         # 启动屏保 
xsetroot -cursor_name left_ptr &  # 设置光标图标
sh ~/.fehbg &                     # 设置背景图

exec openbox-session              # 启动窗口管理器

推荐使用 exec 作为前缀,以替换当前的进程,这样脚本退出时 X 不会退出。

此外 xorg-xinit 还提供了另外一个示例:/etc/skel/.xinitrc。复制到主目录就能使用。

$ cp /etc/skel/.xinitrc ~/ 

文件配置

如果未使用窗口管理器,请记得 X 会话的生命周期与 ~/.xinitrc 同步。只要脚本退出, X 就会关闭。所有窗口管理器的退出和 X 的退出应该同步。可以通过在脚本最后运行窗口管理器实现。

在上面例子中,cairo-compmgrxscreensaverxsetrootsh 都是后台运行(&后缀)。否则,脚本会等待每个进程结束才会执行 openbox-session。同时,openbox-session 不是后台运行,这样保证 openbox 不退出,脚本就不退出。

下面介绍如何配置多桌面环境的 ~/.xinitrc

命令行方式

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

xinit /full/path/to/window-manager

必须使用完整路径。此外你可以选择在--后面传递 X 服务器参数,例如

xinit /usr/bin/enlightenment -- -br +bs -dpi 96

下面~/.xinitrc 例子可以用参数启动给定窗口管理器:

~/.xinitrc
#!/bin/sh
#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)

if [ -d /etc/X11/xinit/xinitrc.d ]; then
  for f in /etc/X11/xinit/xinitrc.d/*; do
    [ -x "$f" ] && . "$f"
  done
  unset f
fi

if [[ $1 == "fluxbox" ]]
then
  exec startfluxbox
elif [[ $1 == "spectrwm" ]]
then
  exec spectrwm
else
  echo "Choose a window manager"
fi

用这个例子可以通过命令 xinit fluxboxxinit spectrwm 启动 fluxbox 或 spectrwm。

随系统启动方式

参阅 Start X at Login.

使用技巧

PolicyKit

许多桌面环境需要 PolicyKit,否则会报错。常见问题是无法从桌面系统关机或重启,无 root 权限无法挂载 USB 设备、光驱等。大部分现代显示管理器会自动启动 PolicyKit。只是用 ~/.xinitrc 时,需要在登录的 TTY 启动 X:

注意: 需要安装 polkit