I was searching for a way to establish a multi-seat setup for my laptop display and a monitor using a single graphics card when i came across Xephyr. (Thanks to bodhi.zazen’s post in ubuntuforums )
In this post, I have used Arch Linux with openbox running on my Lenovo Z560. The process should, however, work with all Linux Distros.
KDE session nested inside an openbox session through Xephyr
What is Xephyr?
From the Xephyr manual page
Xephyr – X server outputting to a window on a pre-existing X display
Xephyr is a kdrive server that outputs to a window on a pre-existing “host” X display.
In simple words, Xephyr allows you to nest X server within a X server. You can always create a new X server with startx — :1 , but what it actually does is create a new parallel X server in a new tty, which means only one X instance is handled at a time and you need to perform a Control, Alt, and Function combination each time you need to switch between X instances which is quite frustrating and inconvenient. Here is where Xephyr differs. It creates a new instance of X server within the current X server. The new X server behaves like any other application window. You can execute applications, as well as full Desktop sessions in the nested X server.
Advantages? Well, it is quite cool! Other than that, you can use it for conveniently testing out different Desktop Environments and window managers without any disruption to the current X session. You can also use it to forward X sessions via ssh without VNC. Although you can forward X applications using ssh without anything else, imagine forwarding multiple applications or a whole Desktop session.
Xephyr should be available on your Distro’s repository. Install it from there. Arch Linux users can install it from
$ sudo pacman -Syy xorg-server-xephyr
or download and compile it from http://www.freedesktop.org/wiki/Software/Xephyr
$ Xephyr -ac -screen 800x600 -reset :1 &
-ac : Disables access control restrictions and allows to forward the session
-screen : sets the resolution of the new X session. Set it according to your need.
:1 : This specifies that the new X session is display number “1“. Your current Display is most probably “0“
-reset: Resets the X server when the last X client is closed.
The Xephyr should start and you will get a blank new window.
The $DISPLAY environment variable tells the X client to which X server it should send its output to. Thus, $DISPLAY controls in which X server an X application pops up. As you must have figured it out, by default, $DISPLAY is set to “:0“.
Now, set the $DISPLAY to “:1” so that you can send output to the Xephyr window.
Then shoot up any X application and it will get displayed in the new X Server.
$ xterm &
$ chromium &
Running Applications inside Xephyr window
Running Desktop Sessions
Time for some cool stuffs.
Running complete Desktop sessions is also possible in the new server. After setting the $DISPLAY to “:1″, run the command which shoots up the Desktop Session. eg. for awesome window manager, it would be awesome -c ~/.config/awesome/rc.lua.new
For KDE, dbus-launcher /usr/bin/startkde worked for me. The process is similar and simple for most other Desktop Environments and Window manager.
Here is a snapshot of my main openbox session in which an awesome (window manager) session is nested, in which in turn is a nested KDE4 session.
A KDE within an Awesome within an Openbox :p
Forwarding the nested X session
One advantage of running nested X sessions using Xephyr is the ease and flexibility of forwarding the new X session.
Start the ssh daemon on the server machine. On Arch Linux, do this by
$ sudo rc.d start sshd
In this example, i will use the same machine as client and server. Start the new X server with Xephyr just as the above examples
$ Xephyr -ac -screen 800x600 -reset :1 &
Time to forward a X application (here, xterm) to the server,
$ ssh -XfC -c blowfish nimesh@localhost xterm
The usage is
ssh -XfC -c blowfish user@server application
I had a problem in forwarding the X session where i would get the following error
X11 forwarding request failed on channel 0
xterm: Xt error: Can’t open display:
xterm: DISPLAY is not set
This is caused when ipv6 is enabled but there are no ipv6 interfaces. I solved this by adding the following lines in /etc/ssh/sshd_config
As i said in the first lines of this post, my next aim is to use Xephyr to configure multi-seat using only one graphics card. Will post about it later.
Anyways, any corrections, feedback, queries, etc, feel free to comment.