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).