Updated 22 November, 2021
Recently, I repurposed an old desktop machine to be a headless server for running machine learning and ArchiveTeam stuff. In its former life it ran Manjaro alongside Windows 10, so I figured I might as well stick with Manjaro in its new role.
Of course, since it would be running headless, I needed to install a remote desktop solution. xrdp has worked a treat in the past on my various other Debian-based systems, so what the heck.
Unfortunately, a quick Google search will confirm that running xrdp on Manjaro is anything but straightforward. The issues are twofold:
- A required package has a borked GPG signature, so you have to build it yourself.
- Even once you have all the dependencies installed, you’re greeted by a blank screen.
Fortunately, the solution is relatively straightforward. So without any further prologue, let’s go.
Note: XFCE
I’m assuming that your desktop environment is XFCE, since that’s the default Manjaro environment. If you’re using KDE or Gnome, I’m guessing the same steps apply. But don’t take my word for it.
Step 1: SSH into your machine
Since this is a headless machine, I’m doing everything via SSH. That said, other than Step 2, everything will be via the terminal anyway.
Step 2: Install some dependencies
Specifically, we’re going to install:
- yay – which enables the installation of AUR packages. xrdp doesn’t live in the regular pacman universe, so we need yay.
- base-devel – which enables the building of said AUR packages
xorg-xserver-devel – which provides necessary dependencies for xrdp.- xorg-server-dev – successor xorg-server-devel. Provides necessary dependencies for xrdp.
sudo pacman -Sy yay base-devel xorg-xserver-devel
Step 3: Install xrdp
Now we can install xrdp using yay.
yay -S xrdp
Agree to install all dependencies, blah blah, and you’re good.
Step 4: Download and install xorgxrdp
Normally, we’d install xorgxrdp through yay, same as xrdp. Unfortunately, the GPG keys are scuzzed up, so we have to do this the hard way: by building it ourselves.
Fortunately, this isn’t hard at all.
Step 4a: Download xorgxrdp
As of this writing, the latest release is 0.2.17. Find the current link on the AUR page under Sources and proceed accordingly.
wget https://github.com/neutrinolabs/xorgxrdp/releases/download/v0.2.17/xorgxrdp-0.2.17.tar.gz
Step 4b: Extract the files and enter the directory
tar xvf xorgxrdp-0.2.17.tar.gz
cd xorgxrdp-0.2.17
Step 4c: Configure, make, and install
./bootstrap
./configure
make
sudo make install
Step 5: Create (or edit) your Xwrapper.config file
My understanding of this step is sketchy, but it goes like this: by default, X11 won’t open a session unless you’re at the display. This is understandably an issue if you’re remote.
So we either edit /etc/X11/Xwrapper.config (if it exists) or create a fresh copy (most likely the case), containing the ending (or only) line:
allowed_users = anybody
Step 6: Edit ~/.xinitrc
This is the file that is causing your blank screen woes, and likely why you’re reading this post in the first place. The stock version has a couple of typos that result in the window manager never actually being invoked. In particular, we need to make 3 edits:
- Change SESSION=${1:-xfce-session} to read SESSION=${1:-xfce4-session}
- Change local dbus_args=(–sh-syntax –exit-with-session) to read local dbus_args=(–sh-syntax)
- Change exec $(get_session “$1”) to read exec $(get_session “$SESSION”)
The resultant file should look like
#!/bin/bash
#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/etc/X11/xinit/.Xresources
sysmodmap=/etc/X11/xinit/.Xmodmap
SESSION=${1:-xfce4-session}
# merge in defaults and keymaps
if [ -f $sysresources ]; then
xrdb -merge $sysresources
fi
if [ -f $sysmodmap ]; then
xmodmap $sysmodmap
fi
if [ -f "$userresources" ]; then
xrdb -merge "$userresources"
fi
if [ -f "$usermodmap" ]; then
xmodmap "$usermodmap"
fi
# start some nice programs
if [ -d /etc/X11/xinit/xinitrc.d ] ; then
for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do
[ -x "$f" ] && . "$f"
done
unset f
fi
get_session(){
#local dbus_args=(--sh-syntax --exit-with-session)
local dbus_args=(--sh-syntax)
case "$1" in
awesome) dbus_args+=(awesome) ;;
bspwm) dbus_args+=(bspwm-session) ;;
budgie) dbus_args+=(budgie-desktop) ;;
cinnamon) dbus_args+=(cinnamon-session) ;;
deepin) dbus_args+=(startdde) ;;
enlightenment) dbus_args+=(enlightenment_start) ;;
fluxbox) dbus_args+=(startfluxbox) ;;
gnome) dbus_args+=(gnome-session) ;;
i3|i3wm) dbus_args+=(i3 --shmlog-size 0) ;;
jwm) dbus_args+=(jwm) ;;
kde) dbus_args+=(startplasma-x11) ;;
lxde) dbus_args+=(startlxde) ;;
lxqt) dbus_args+=(lxqt-session) ;;
mate) dbus_args+=(mate-session) ;;
xfce) dbus_args+=(xfce4-session) ;;
openbox) dbus_args+=(openbox-session) ;;
*) dbus_args+=("$1") ;;
esac
echo "dbus-launch ${dbus_args[*]}"
}
exec $(get_session "$SESSION")
Step 8: Enable and Start xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp
Step 8.1: Bypass nVidia Drivers
If you’re running nVidia drivers, there’s one more step, which I discovered courtesy of this delightful post.
In short, the nVidia drivers will cause the blank screen to resurface. We want to keep the drivers for use by applications, but deny their use by xrdp. Here’s how:
- Make the directory /etc/X11/nvidia.d
- Move the files 90-mhwd.conf and [stuff].nvidia-drm-outputclass.conf to said directory where [stuff] depends on your specific installation. For me the file was 10-amdgpu-nvidia-drm-outputclass.conf but your mileage (and CPU) will vary.
sudo mkdir /etc/X11/nvidia.d
sudo mv /etc/X11/xorg.conf.d/90-mhwd.conf /etc/X11/nvidia.d
sudo mv /etc/X11/xorg.conf.d/10-amdgpu-nvidia-drm-outputclass.conf /etc/X11/nvidia.d
Your /etc/X11 directory should look something like
.
├── mhwd.d
│ ├── nvidia.conf
│ └── nvidia.conf.nvidia-xconfig-original
├── nvidia.d
│ ├── 10-amdgpu-nvidia-drm-outputclass.conf
│ └── 90-mhwd.conf -> /etc/X11/mhwd.d/nvidia.conf
├── tigervnc
│ └── Xsession
├── xinit
│ ├── xinitrc
│ ├── xinitrc.d
│ │ ├── 40-libcanberra-gtk-module.sh
│ │ ├── 50-systemd-user.sh
│ │ └── 80xapp-gtk3-module.sh
│ └── xserverrc
├── xorg.conf.d
│ └── 00-keyboard.conf
├── xrdp
│ └── xorg.conf
└── Xwrapper.config
Step 9: Prosper
Hop on in, and be greeted by the XFCE environment.
Let me know if you still have any issues, though the chances of my being able to solve them are miniscule. Godspeed!
I notice that there is also xorgxrdp-git in AUR.
Looking at the build files, there is no PGP key included.
I wonder if installing that instead of xorgxrdp from AUR would work.
(both are version 0.2.17 and both cite https://github.com/neutrinolabs/xorgxrdp)
Most likely. I had to redo this entire process a week ago following a botched kernel upgrade, and foolishly didn’t take notes. I’ll try to step through the process soon and make and update.
—
Update
The xorgxrdp and xorgxrdp-git packages are functionally identical, coming from the same tag on the same git repo. If one has a working signature and the other does not, definitely go with it.
In my experience, neither has ever been both a) up to date with the xrdp release, and b) properly signed, so I’ve been building from source. But if it works, do it!
Thank You !
If you can do the same for google-remote-desktop that still doesn’t work
Etienne Pralong
Hi! Here’s the challenge with Google Remote Desktop: it requires the full version of Google Chrome, rather than the open source Chromium that is generally available. I’ll see what I can do, but part of why I switched do XRDP I’m the first place was struggles with Chrome.
While running the ./configure command, the output stops with the following error
configure: error: no nasm (Netwide Assembler) found.
I needed to install nasm
pamac install nasm