I have an X server all configured and running with LightDM and GNOME desktop. I have x11vnc installed to access the X server. I open a terminal in GNOME and run x11vnc
. This gives me VNC access to the real X server, however I would like to start it automatically. I could put x11vnc
in ~/.xprofile
to start in after I log in on LightDM, but what I would prefer is to start it immidiately after LightDM is started so that when I log in on VNC, I can see the LightDM prompt. How would I go about doing this?
1 Answer
You can do this by adding a systemd service to start the x11vnc server After=
LightDM is started. Ensure that the service is run under user lightdm
so that you don't get pesky XAuthority No protocol specified
errors.
/etc/systemd/system/[email protected]:
[Unit]
Description=Remote desktop service (VNC)
After=display-manager.service
[Service]
Type=simple
User=lightdm
ExecStart=/usr/bin/x11vnc -display %i
Restart=always
RestartSec=3
[Install]
WantedBy=graphical.target
After=display-manager.service
tells systemd that the display manager (LightDM) needs to be running before this service can be started.
Type=simple
says that the process is non-forking, the command under ExecStart
stays running for the duration of the VNC server's life.
User=lightdm
says that the process under ExecStart
should be run by user lightdm
, a system user whose purpose is to run X clients for the duration of the LightDM login prompt. This user owns the X server, so in order to have applications run in the login prompt, you need to run them as this user.
ExecStart=/usr/bin/x11vnc -display %i
is the command to run when this service is activated, it says to start x11vnc
on display %i
, which is referring to whatever comes after the "@" symbol when you start the service.
Restart=always
says that whenever the service fails to start, try again.
RestartSec=3
says to wait 3 seconds each time you retry.
WantedBy=graphical.target
says to run the service whenever systemd brings up the graphical system (legacy runlevel 5).
To load the unit (make systemd "see" it), run the command
# systemctl daemon-reload
To enable it (make it start on boot), run the command
# systemctl enable x11vnc@<your-$DISPLAY-here>
where <your-$DISPLAY-here>
is the X display that you want to give VNC access (usually :0
)
To start it, run the command
# systemctl start x11vnc@<your-$DISPLAY-here>
Ditto about the <your-$DISPLAY-here>
.
Note that you can run multiple independent services under the same unit file, by passing different displays after the "@". For example, you could run multiple VNC servers on X displays :0
, :1
, and :2
, on ports 5900
, 5901
, and 5902
with x11vnc@:0
, x11vnc@:1
, and x11vnc@:2
.