Перші речі: XDG_RUNTIME_DIR
Щоб відповісти на ваше перше запитання, "Що таке XDG_RUNTIME_DIR?" , це змінна середовище, яка встановлюється автоматично при вході в систему. Він повідомляє будь-якій програмі, яку ви запускаєте, де знайти специфічний для користувача каталог, в якому він може зберігати невеликі тимчасові файли. Зауважте, що XDG_RUNTIME_DIR
встановлено pam_systemd
(8) , тому він насправді не пов’язаний з X (графічно запущені програми), яка проблема, як ви мабуть, маєте.
Як усунути неполадки
Ваше друге запитання: "Як вирішити цю проблему?" дуже хороший. Це означає, що вас цікавить не тільки те, що виправлено, але і як розібратися в цьому самостійно. Для початку спочатку перегляньте перші повідомлення про помилки. Зокрема, пошук No protocol specified
або WARNING **: Could not open X display
повинен показати вам, що проблема пов'язана з X (також називається системою X Windowing ), і це те, як графічні програми відображаються на вашому екрані. Знаючи, що повинно викликати багато питань щодо усунення несправностей у вашому розумі.
X ДИСПЛЕЙ
Наступним питанням може бути, що це за "X-дисплей", який не може відкритися? "Дисплей" - це адреса вашого екрана. [*] Будь-яка програма, яка хоче написати на ваш екран, повинна знати адресу. Ви можете побачити, який ваш X-екран, перевіривши змінну середовища DISPLAY:
echo $DISPLAY
І ви можете перевірити, що sudo
вважає ваш DISPLAY, ввівши:
sudo -s
echo $DISPLAY
exit
Якщо він нічого не показує, то в цьому проблема. (Див. Виправлення нижче).
XAUTHORITY
Але що робити, якщо це не проблема, і значення DISPLAY
встановлено правильно sudo
? Тоді ви можете задуматися, чи має X якісь дозволи, які не дозволяють іншим користувачам писати на мій дисплей? Якщо ви думаєте, що ви будете праві, у X є два основні методи авторизації: xauth
і xhost
. Найчастіше сьогодні використовується xauth
(1), який використовує XAUTHORITY
змінну середовища. Ще раз перевіримо, чи правильно встановлено sudo
:
echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit
Якщо ви XAUTHORITY
вказуєте на файл у вашому домашньому каталозі, але він порожній під час запуску sudo
, тоді це проблема.
Виправлення: збереження змінних середовища
Отже, у чому виправлення? Якщо змінна середовище DISPLAY
або XAUTHORITY
змінні середовища не зберігаються через sudo
, ви можете сказати sudo
(8) зберегти довкілля за допомогою -E
параметра, наприклад:
sudo -E evince
Кращий спосіб: env_keep
Ви можете запитати, зачекайте, якщо -E
все магічно працює, то чому це не за замовчуванням sudo
? Відповідь - це потенційна небезпека для безпеки. Змінні середовища впливають на роботу програм, і ви не хочете, щоб вони експортувалися з облікового запису користувача до кореня. "Правильний" спосіб зробити це - додати рядок Defaults env_keep += "DISPLAY XAUTHORITY"
до файлу sudoers
(5), використовуючи visudo
(8) . Ви можете перевірити, які змінні середовища зберігає sudo, запустивши:
sudo sudo -V
(Так, ви вводите sudo
двічі). Я рекомендую розміщувати рядок не у файлі sudoers за замовчуванням ( /etc/sudoers
), а у локальному файлі, який не буде перезаписаний під час оновлення системи. Ви можете зробити це так:
sudo visudo -f /etc/sudoers.d/local
Але зачекайте, що робити, якщо жоден із перерахованих вище не працює?
Я думаю, що це досить ґрунтовна відповідь, але якщо у вас все ще виникають проблеми, я б запропонував ще одне. Ви можете використовувати xhost
(1), щоб надати доступ до певного користувача на локальному хості (вашій машині) так,
xhost si:localuser:root
У цьому випадку ми визначаємо root
як ім’я користувача, оскільки це обліковий запис, у якому sudo
запускаються програми.
[*] : Питання: У мене лише один екран, тож чому для дисплея X потрібна "адреса"? Відповідь: Це тому, що X може працювати не тільки на вашій машині, але і через Інтернет. За допомогою X легко запускати програми на вашій машині, які відображаються на інших хостах в Інтернеті та програми на інших хостах, які відображаються на екрані (якщо ви надаєте їм дозвіл).