Primeiras coisas primeiro: XDG_RUNTIME_DIR
Para responder sua primeira pergunta, "O que é XDG_RUNTIME_DIR?" , é uma variável de ambiente que é configurada automaticamente quando você efetua login. Diz a qualquer programa que você executar onde encontrar um usuário específico diretório no qual ele pode armazenar pequenos arquivos temporários. Observe que XDG_RUNTIME_DIR é definido por pam_systemd (8) , por isso não está realmente relacionado com X (executando programas graficamente), que é o problema que você parece ter.
Como solucionar problemas
Sua segunda pergunta, "Como solucionar esse problema?" é muito boa. Isso significa que você não está interessado apenas em qual é a correção, mas também em como descobrir por conta própria. Para começar, observe primeiro as primeiras mensagens de erro. Em particular, procurar por No protocol specified ou WARNING **: Could not open X display , deve mostrar que o problema é com X (também chamado The X Windowing System ), que é como programas gráficos são mostrados em sua tela. Sabendo que isso deve levantar muitas questões de solução de problemas em sua mente.
EXIBIÇÃO X
Sua próxima pergunta pode ser, o que é esse "display X" que o evince não pode abrir? Um "display" é o endereço da sua tela. [*] Qualquer programa que queira escrever em sua tela precisa saber o endereço. Você pode ver qual é a sua exibição X, verificando a variável de ambiente DISPLAY:
echo $DISPLAY
E você pode verificar o que o sudo acha que seu DISPLAY está digitando:
sudo -s
echo $DISPLAY
exit
Se não mostrar nada, então esse é o problema. (Veja a correção abaixo).
XAUTHORITY
Mas, e se esse não for o problema e o DISPLAY estiver definido corretamente em sudo ? Então você pode se perguntar: X tem algum tipo de permissão que impede que outros usuários escrevam no meu monitor? Se você pensou que estaria certo, X tem dois métodos principais de autorização: xauth e xhost . O mais comumente usado hoje é xauth (1) que usa o XAUTHORITY variável de ambiente. Novamente, vamos verificar se está definido corretamente em sudo :
echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit
Se XAUTHORITY estiver apontando para um arquivo em seu diretório pessoal, mas estiver em branco quando você executar sudo , esse é o problema.
CORRECÇÃO: Salvar as variáveis de ambiente
Então, qual é a correção? Se as variáveis de ambiente DISPLAY ou XAUTHORITY não forem salvas no sudo , você poderá informar sudo (8) para preservar o ambiente usando a opção -E , da seguinte forma:
sudo -E evince
Uma maneira melhor: env_keep
Você pode perguntar: Espere, se -E fizer tudo funcionar magicamente, por que não é o padrão para sudo ? A resposta é que é um risco potencial à segurança. Variáveis de ambiente afetam a maneira como os programas funcionam e você não quer que todos sejam exportados de uma conta de usuário para a raiz. A maneira "correta" de fazer isso é adicionar a linha Defaults env_keep += "DISPLAY XAUTHORITY" ao sudoers (5) arquivo usando visudo (8) . Você pode verificar quais variáveis de ambiente o sudo preserva executando:
sudo sudo -V
(Sim, você digita sudo duas vezes). Eu recomendo colocar a linha não no arquivo sudoers padrão ( /etc/sudoers ), mas em um arquivo local que não será sobrescrito quando você atualizar seu sistema. Você pode fazer isso assim:
sudo visudo -f /etc/sudoers.d/local
Mas espere, e se nenhum dos itens acima funcionar?
Eu acho que esta é uma resposta bastante completa, mas se você ainda está tendo problemas, há uma outra coisa que eu sugiro. Você pode usar xhost (1) para conceder acesso a um usuário específico no host local (sua máquina) assim,
xhost si:localuser:root
Nesse caso, estamos especificando root como o nome de usuário, já que essa é a conta com a qual sudo executa programas.
[*] : Q: Eu só tenho uma tela, então por que um display X precisa de um "endereço"? A: É porque o X pode funcionar não apenas na sua máquina, mas na Internet. Com X , é fácil executar programas em sua máquina que aparecem em outros hosts da Internet e programas em outros hosts que aparecem na tela (supondo que você tenha permissão).