Running desktop on remote server
Usually you would use the ssh terminal when working on a remote linux server. But there can be times when you need to run a gui app on the server and keep it running for quite some time.
Recently I had to do something similar and therefore I setup an Ubuntu server with desktop and accessed it via VNC.
The idea is simple. Install any desktop environment of your choice on the server. In this tutorial we shall be using Xfce, as it has a light footprint compared to the larger ones like Gnome and KDE.
Then use vnc server to launch the desktop environment and create an X display session that we shall access from our local desktop machine through a vnc client.
Install Desktop environment and VNC server
Xfce is a lightweight desktop and ideal for usage on a remote server. First install the xfce packages and tightvnc server. It would be a good idea to update the package cache before doing the actual install.
sudo apt-get update sudo apt-get install xfce4 xfce4-goodies tightvncserver
Note that this will only install the packages and not start anything. We shall be starting the vncserver with specific settings on our own, later in this guide.
If the dpkg process exits unexpectedly, you may have to run the following command -
# sudo dpkg --configure -a
Create a new user for vnc
The next thing to do is create a unix user that will be used during the vnc sessions. The username can be anything. Use the adduser command.
# adduser mike Adding user `mike' ... Adding new group `mike' (1001) ... Adding new user `mike' (1001) with group `mike' ... Creating home directory `/home/mike' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for mike Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] #
The vncserver shall launch the desktop environment with this unix user. Which means, that you shall be this user when working on the remote desktop
Setup the "vnc password" for the user
The vnc server maintains a separate password that is used to login to the vnc server via vnc clients. This password is different from the unix user password. It is configured using the vncpasswd command.
First switch to user "mike" that was created in the previous step and setup the vnc server password.
# su - mike
Next use the vncpasswd command
$ vncpasswd Using password file /home/mike/.vnc/passwd VNC directory /home/mike/.vnc does not exist, creating. Password: Verify: Would you like to enter a view-only password (y/n)? mike@bunty:~$
Note that the passwd file did not exist and was created for the first time in this step.
If you have already run the vncserver command previously, then it would have created the files. When you run vncserver for the first time, it creates a default startup script
$ vncserver You will require a password to access your desktops. Password: Password too short enlightened@desktop:~$ vncserver You will require a password to access your desktops. Password: Verify: Would you like to enter a view-only password (y/n)? n New 'X' desktop is desktop:1 Creating default startup script /home/enlightened/.vnc/xstartup Starting applications specified in /home/enlightened/.vnc/xstartup Log file is /home/enlightened/.vnc/desktop:1.log
However, we dont need to run the vncserver command. It shall be launched automatically using startup scripts.
Create the xstartup script
The next important file is the xstartup script. It contains instructions on which X apps to start. The desktop environment is the X application that we have to start.
First take a backup of the file if it already exists
mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
Now edit it using nano
vnc@server:~$ nano .vnc/xstartup
Note - This is inside the home directory of the user vnc, that is /home/mike/.vnc/xstartup
Enter the following lines in the xstartup script
#!/bin/bash xrdb $HOME/.Xresources startxfce4 &
The startxfce4 command will launch the xfce desktop. Save the file and close it.
Make the xstartup file executable. This is necessary so that vncserver can execute this file.
$ chmod +x ~/.vnc/xstartup
Create vnc service file
The next step is to create a vnc service file so that we can start vnc server using the service command and don't have to run the vncserver command every time.
Make sure to enter the correct username in the USER variable. This is the user that vnc server is going to use to start the desktop session.
root@bintu:~# sudo nano /etc/init.d/vncserver
Paste the following script
#!/bin/bash PATH="$PATH:/usr/bin/" export USER="mike" DISPLAY="1" DEPTH="16" GEOMETRY="1024x768" OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}" . /lib/lsb/init-functions case "$1" in start) log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}" su ${USER} -c "/usr/bin/vncserver ${OPTIONS}" ;; stop) log_action_begin_msg "Stoping vncserver for user '${USER}' on localhost:${DISPLAY}" su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}" ;; restart) $0 stop $0 start ;; esac exit 0
Save the file and close it. Make it executable
# chmod +x /etc/init.d/vncserver
Start the service
Now everything is read. Its time to run the vncserver and test our step.
First reload systemctl so that it can use the vncserver startup script.
systemctl daemon-reload
Now start vncserver. It starts a server on port 5901
# service vncserver start
Check that its running
root@bintu:~# service vncserver status ● vncserver.service Loaded: loaded (/etc/init.d/vncserver; bad; vendor preset: enabled) Active: active (exited) since Thu 2017-03-02 05:36:42 UTC; 6s ago Docs: man:systemd-sysv-generator(8) Process: 24877 ExecStart=/etc/init.d/vncserver start (code=exited, status=0/SUCCESS) Mar 02 05:36:40 bintu systemd[1]: Starting vncserver.service... Mar 02 05:36:40 bintu vncserver[24877]: * Starting vncserver for user 'vnc' on localhost:1... Mar 02 05:36:40 bintu su[24885]: Successful su for vnc by root Mar 02 05:36:40 bintu su[24885]: + ??? root:vnc Mar 02 05:36:40 bintu su[24885]: pam_unix(su:session): session opened for user vnc by (uid=0) Mar 02 05:36:42 bintu vncserver[24877]: New 'X' desktop is bintu:1 Mar 02 05:36:42 bintu vncserver[24877]: Starting applications specified in /home/vnc/.vnc/xstartup Mar 02 05:36:42 bintu vncserver[24877]: Log file is /home/vnc/.vnc/bintu:1.log Mar 02 05:36:42 bintu systemd[1]: Started vncserver.service.
$ cat ~/.vnc/*.pid 18577 18731
# ps -ef | grep tightvnc vnc 24574 1 0 05:32 ? 00:00:00 Xtightvnc :1 -desktop X -auth /home/vnc/.Xauthority -geometry 1024x768 -depth 16 -rfbwait 120000 -rfbauth /home/vnc/.vnc/passwd -rfbport 5901 -fp /usr/share/fonts/X11/misc/,/usr/share/fonts/X11/Type1/,/usr/share/fonts/X11/75dpi/,/usr/share/fonts/X11/100dpi/ -co /etc/X11/rgb root 24744 10412 0 05:33 pts/0 00:00:00 grep --color=auto tightvnc root@bintu:~#
Check the open ports of the vnc server. You need the correct port number when connecting from the vnc client
# netstat -nlp | grep vnc tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 24574/Xtightvnc tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 24574/Xtightvnc unix 2 [ ACC ] STREAM LISTENING 5225386 24574/Xtightvnc /tmp/.X11-unix/X1
Vnc server can also be started by calling the script directly.
# /etc/init.d/vncserver start [ ok ] Starting vncserver (via systemctl): vncserver.service. root@bintu:~#
To stop vncserver
# service vncserver stop
Install vncviewer client on Desktop
Now that we have the vnc server up and running with the gui desktop environment, its time to install a vnc client and access the remote desktop.
Install xtightvncviewer on Ubuntu.
$ sudo apt-get install xtightvncviewer
Now connect to the remote vnc server using the vncviewer command.
$ vncviewer -quality 5 -encodings "copyrect tight hextile zlib corre rre raw" -compresslevel 5 IPADDR:5901
We use lower quality and compression encodings to compress the image data being transferred and make it faster.
Using other vnc viewers like KRDC might be slower.
Resources
For further reading, check out these useful links -
http://tightvnc.com/vncviewer.1.html https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-16-04https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-14-04
https://www.digitalocean.com/community/tutorials/how-to-setup-vnc-for-ubuntu-12
Great post, thank you!