Your requirement

You have installed a Linux system under the /test subdirectory, or mounted the root partition of another Linux system. With the chroot /test command you can ʻswitch in’ as usual and call programs. But the start of graphical programs fails, even when you set DISPLAY to :0.

The problem

Local programs communicate with your computer’s X server via a Unix socket in the /tmp/.X11-unix directory. In your chroot environment there is no access to this socket.

The solution

With a mount command you show the of the ʻouter’ computer’s /tmp/.X11-unix directory in the chroot cage:

root@linux# mkdir -p /test/tmp/.X11-unix
root@linux# mount --bind /tmp/.X11-unix /test/tmp/.X11-unix

They also allow access to the display for all local processes:

user@linux> xhost + local:

After calling chroot /test, set the DISPLAY variable in the inner system to :0, and you can then start graphical programs:

root@linux# chroot /test
root@linux# export DISPLAY=:0
root@linux# xterm

By the way: for security reasons a TCP connection via localhost is switched off by default in most distributions, otherwise instead of the above trick you could take the route via localhost. Enter xhost + localhost outside, and export DISPLAY=localhost:0 inside.

Linux knowledge

These articles were written by the founder of Checkmk many years ago.
They are still valid though and thus we keep them on our website.
Mathias has since then developed a monitoring software called Checkmk

Find out more