Before we start, this method works by sending whatever on the display to a VNC client, so it can’t handle multiuser login. Yet it’s an open-source solution and works great on a headless server.

Install

I strongly recommend using a desktop environment or window manager that has no animation effects. Animation is just too bandwidth consuming. I’m using lightdm as display manager and i3 as window manager. No desktop environment present.

Assuming you have done setting up your graphics. Now install TigerVNC (ArchWiki):

# pacman -S tigervnc

If you are using Debian or Ubuntu,

# apt install tigervnc-standalone-server tigervnc-scraping-server

In general, install the packages that provide executable tigervncpasswd and x0tigervncserver.

Configuration & Run

Create the ~/.vnc/passwd for client authentication:

$ vncpasswd

Run x0vncserver from your desktop session (for correct display number and X authentication):

$ x0vncserver -rfbauth=~/.vnc/passwd -NeverShared -PollingCycle=75

Try to connect to server’s 5900 port with your VNC client, the connection should be successful.

Tap Ctrl+C to terminate the x0vncserver you just run. Now get the display number of your desktop by querying the DISPLAY environment variable of your desktop session:

$ echo $DISPLAY
:2

Now you should be able to run x0vncserver from any terminal (SSH, etc):

$ x0vncserver -Display=:2 -rfbauth=~/.vnc/passwd -NeverShared -PollingCycle=75

Problems Encountered

Headless Box?

You may have found that if no monitor is connected to the server, the resolution of X server would be something like 1024×768 or 720×574, so would the VNC session. The solution is to use xrandr to change the frame buffer resolution right after Xorg launches. My Xorg is launched by lightdm, so firstly modify the session-setup-script parameter in the /etc/lightdm/lightdm.conf:

session-setup-script=/etc/lightdm/sessionsetup.sh

Then create /etc/lightdm/sessionsetup.sh:

#!/bin/bash
xrandr --fb WWWWxHHH

Change WWWWxHHH to the resolution you want. Then add executable permission to /etc/lightdm/sessionsetup.sh:

# chmod +x /etc/lightdm/sessionsetup.sh

No protocol specified?

I’ve received “No protocol specified” error message which prevented me from launching x0vncserver. This might be related to an X server authentication problem. Running x0vncserver from desktop session should solve it.