Xephyr 使用方法

Xephyr is a X server that runs as a small window within your current X session.

Xephyr 是一个 Xnest 的替代产品,因为 Xnest 不提供现代 X server 的一些高级特性,比如图形加速的支持。简而言之,Xephyr 是一个 X server,但是 它执行在一个存在的 X server 里面,这个可以用来做很多事情,比如需要通 过 XDMCP 连接到另外一台主机,那么不需要另外打开一个新的 X server;又 比如正在写一个 window manager,那么在一个 X server 里面打开的 X server 里面调试,将会比直接在现有的 X server 里面替换现有的 window manager 方便很多。对于热衷于更换自己的 window manager 的狂热爱好 者,Xephyr 提供了绝佳的试验环境。右图是我在 arch 下的 gnome-desktop 中的 Xephyr,其中开了个 awesome。

Xephyr 是一个替代的 Xnest 嵌套 X 服务器的方案。这些方案都提供了嵌套的X显示到一个窗口父的X服务器,而不是直接绘制到一个硬屏绘图,两者以不同的方式完成这一方案。Xnest 代理 X 请求到父服务器(实际上不是执行的操作本身),而 Xephyr 行为则对每个请求和汲取到的 X 图像,然后将其显示在父服务器上的一个窗口 。 这意味着,Xephyr 可以处理父服务器无法处理请求。例如,它可以提供渲染扩展,使客户能够快速显示消除锯齿的文本父显示即使没有渲染扩展。

运行 -help 获得帮助,基本的使用方式是 Xephyr :n -options。这里 :n 是 DISPLAY 的值,Xephyr 本身是一个 X client,也是一个 X server,它是 client 通过环境变量 DISPLAY 设置显示的 X server,这里的 :n 指定的是它 作为 X server 的序号,也就是说 X client 可以通过 -display 或者更改环境变量。我们这里简单介绍一些其他的参数,如 -query 和 -indirect 可以用 来向打开了 XDMCP 的主机发送连接请求,-screen 指定屏幕大小,-fullscreen 全屏。

简单说,Xephyr 作用就是在我们屏幕上开一个窗口(或全屏),当一个虚拟的屏幕使用,并可以指定这个虚拟屏幕的代号为 :n 。以后我们打开的图形界面的程序,直接打开的就是在真实屏幕上运行的,而用以下方式打开就会到新开的虚拟屏幕中运行了:

Xephyr :n -options
DISPLAY=:n command

我们关心的参数是:

-screen 1024x768x24/-fullscreen : 屏幕大小色深/全屏
-dpi 96 :dpi值
:n :虚拟屏幕代号
-name [name] :屏幕名称
-title [title] :屏幕标题
-noreset :不加此选项,最后一个图形界面的程序关闭后,窗口自动关闭。加上则需要手工关闭。
-reset -terminate : 最后的X客户端被关闭时,Xephyr自动关闭。注:并不总是工作
-host-cursor :加上以后光标不会被虚拟屏幕里面的程序改变,即鼠标光标是固定样式的,但光标移动速度比较快。不加则光标会改变,但有时反应迟钝。
-keybd :设置键盘类型
2> /dev/null :redirects error messages.

一般 linux 要显示窗口和图形界面需要3层:Xserver(图形驱动)、WM(窗口管理器)和 soft(图形界面软件)。并且两个 WM 不能并存,如果新启动起来一个 WM,个必然会替代掉先前启动的那一个 WM。 但是 Xephyr 在 Xserver(图形驱动)和 WM(窗口管理器)中间加上了一层,让后来启动起来的 WM 看不见 Xserver,而把对应的 Xephyr 当成 Xserver,就不会替代掉前面启动的 WM。所以我们启动多少 Xephyr,就可以对应启动多少 WM(只要你的机器撑得住)。

咋一看,这好像是一种虚拟机,其实这和虚拟机是有很大区别的:我们在 Xephyr 内的程序和在 Xephyr 外的程序其实都是实实在在的进程。

示例:

Xephyr :1 -host-cursor -screen 800x600x24 -dpi 96 -ac -noreset -name awesome -title awesome 2> /dev/null &
DISPLAY=:1 exec awesome 2> /dev/null &

右图这是我在 Gentoo Awesome下开启的一个 Xephyr,其中再开启个 awesome。

注意:直接 killall fcitx 的话,会将 Xephyr 中的 fcitx 与主 WM 中的 fcitx 一起 kill 掉。这是其不同于虚拟机之处。