First things first: XDG_RUNTIME_DIR
To answer your first question, "What is XDG_RUNTIME_DIR?", it is an environment variable that is set automatically when you log in. It tells any program you run where to find a user-specific directory in which it can store small temporary files. Note that
XDG_RUNTIME_DIR is set by
pam_systemd(8), so it is not actually related to X (running programs graphically), which is the problem you seem to be having.
How to troubleshoot
Your second question, "How to troubleshoot this problem?" is a very good one. That means you're interested in not only what the fix is, but also how to figure it out on your own. To start, look at the first error messages first. In particular, searching for
No protocol specified or
WARNING **: Could not open X display, should show you that the problem is with X (also called The X Windowing System) which is how graphical programs are shown on your screen. Knowing that should raise many troubleshooting questions in your mind.
Your next question might be, what is this "X display" that evince can't open? A "display" is the address for your screen.[*] Any program that wants to write to your screen has to know the address. You can see what your X display is by checking the DISPLAY environment variable:
And you can check what
sudo thinks your DISPLAY is by typing:
If it doesn't show anything, then that's the problem. (See fix below).
But, what if that's not the problem and the
DISPLAY is set correctly in
sudo? Then you might wonder, does X have some sort of permissions that prevent other users from writing on my display? If you thought that, you'd be right, X has two main authorization methods:
xhost. The most commonly used one today is
xauth(1) which uses the
XAUTHORITY environment variable. Again, let's check if it is properly set in
XAUTHORITY is pointing to a file in your home directory for you, but it's blank when you run
sudo, then that's the problem.
FIX: Save the Environment Variables
So, what's the fix? If either the
DISPLAY or the
XAUTHORITY environment variables aren't getting saved across the
sudo, you can tell
sudo(8) to preserve the environment by using the
-E option, like so:
sudo -E evince
A better way: env_keep
You might well ask, Wait, if
-E makes everything magically work, then why isn't it the default for
sudo? The answer is that it is a potential security hazard. Environment variables affect the way programs work and you don't want them all being exported from a user account to the root. The "correct" way to do it is to add the line
Defaults env_keep += "DISPLAY XAUTHORITY" to the
sudoers(5) file using
visudo(8). You can check what environment variables sudo preserves by running:
sudo sudo -V
(Yes, you type
sudo twice). I recommend putting the line not in the default sudoers file (
/etc/sudoers), but in a local file that won't get overwritten when you upgrade your system. You can do that like so:
sudo visudo -f /etc/sudoers.d/local
But wait, what if none of the above works?
I think this is a fairly thorough answer, but if you're still having trouble, there's one other thing I'd suggest. You can use
xhost(1) to grant access to a specific user on the local host (your machine) like so,
In this case, we're specifying
root as the username, since that's the account that
sudo runs programs as.
[*]: Q: I've only got one screen, so why does an X display need an "address"? A: It's because X can work not only on your machine, but over the internet. With X, it's easy to run programs on your machine that show up on other internet hosts and programs on other hosts that appear on your screen (assuming you give them permission).