xinit (简体中文)

From ArchWiki
Revision as of 09:06, 15 June 2012 by Kynikos.bot (talk | contribs) (rm temporary i18n template)
Jump to navigation Jump to search

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-05-24,点击这里可以查看翻译后英文页面的改动。

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

# 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

$ xinit

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

如果自动挂载有问题,请先安装 consolekit,然后修改 ~/.xinitrc,将 startxfce4 替换为 窗口管理器桌面环境

exec ck-launch-session startxfce4

这将保证各种环境变量设置正确,启动干净的 ConsoleKit 会话。ConsoleKit 是跟踪系统中多个用户、会话的框架。提供了一个软件根据用户、会话的变化而进行相应调整的机制。与 D-Bus 和其他工具一起工作。

文件示例

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

~/.xinitrc
#!/bin/sh

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

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

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

下面示例可以作为执行各种窗口管理器的模板,只要取消要使用窗口管理器前的注释,例如Openbox (简体中文):

~/.xinitrc
#!/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

推荐使用 exec 作为前缀,以替换当前的进程,但是如果所有其他窗口管理器都被注释掉,则不需要加 exec。尽可能使用完整路径,可以通过type 命令获得:{ic|type startkde}}。

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

$ cp /etc/skel/.xinitrc ~/ 

文件配置

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

在上面例子中,cairo-compmgrxscreensaverxsetrootsh 都是后台运行(&后缀)。否则,脚本会等待每个进程结束才会执行 openbox-session。同时,openbox-session 不是后台运行,这样保证 openbox 不退出,脚本就不退出。如果收到执行 startx 脚本,结束脚本将会关闭 X,退回 /etc/inittab 启动的终端。

如果从 /etc/inittab 启动脚本,设置为 respawn 而不是 once~/.xinitrc 会重新执行。这样就能不重启计算机就能重启 X。

下面介绍如何配置多桌面环境的 ~/.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 [[ $1 == "fluxbox" ]]
then
  exec startfluxbox
elif [[ $1 == "spectrwm" ]]
then
  exec spectrwm
else
  echo "Choose a window manager"
fi

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

随系统启动方式

你也可以选择在启动时启动窗口管理器和桌面系统,仅仅使用~/.xinitrcGRUB即可,不要使用显示管理器。这个方法归功于Arch不使用任何特殊的runlevel系统。下面的这个~/.xinitrc脚本检查并依据 runlevel 来分别启动OpenboxGNOME:

rl=$(runlevel | grep -o [0-6])
case $rl in
	4) exec gnome-session;;
	5) exec openbox-session;;
esac

要选择不同的 runlevels,在 GRUB 里复制一个启动项目并修改内核参数即可。在内核参数该句的最后加上 runlevel。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

最后,你需要确定 ~/.xinitrc 文件会在选定的runlevel被运行。使用startx中的指导,编辑inittab在需要的 runlevel startx,从而来执行你的~/.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 不同产生的差异产生于~/.xinitrc 文件。当我们想使得inittab文件区分的更明显一点的话,这样做会比较合适,因为当我们想在inittab文件里使得启动设置很多样的话,里面的行会紧密的堆在一起。

使用技巧

PolicyKit 和 ConsoleKit

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

exec ck-launch-session gnome-session

SLiM 现在已经支持 consolekit 会话。

注意: 需要安装 polkitconsolekit

如果是从 /etc/skel/.xinitrc 获取 ~/.xinitrc,最上面会有一个导入 /etc/X11/xinit/xinitrc.d/ 中脚本的代码,会导入 /etc/X11/xinit/xinitrc.d/30-bus,这个脚本会在 ConsoleKit 启动前启动 dbus:这会导致 Bug FS#25031,因为 dbus 需要再 ConsoleKit 之后 启动,否则会在挂载时出现权限问题。

临时解决方法是编辑 ~/.xinitrc,将对应的代码修改为:

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

这样 dbus 会在 ConsoleKit 后启动,详情请阅读您使用的 Window ManagerDesktop Environment

先启动窗口管理器

如果要在其他应用程序前启动窗口管理器:

#!/bin/bash

openbox & wmpid=$!

urxvtd -q -f -o &
xscreensaver -no-splash &
fbpanel &

wait $wmpid

第一行会将 openbox 作为后台进程启动,然后将进程 id ($!) 保存到 wmpid。最后一行会等待保存的进程 id wmpid 结束。

参见