Вопрос или проблема
У меня есть удаленная виртуальная машина с Ubuntu 1804, и я хочу запустить VNC. Я использую x11vnc, который требует запущенного X сервера. В настоящее время я подключен через SSH.
На виртуальной машине установлена карта Nvidia, и после генерации xorg.conf с помощью nvidia-xconfig я могу запустить X сессию с помощью startx, но только от имени root. Любое последующее подключение через VNC происходит от имени root, чего я хочу избежать.
Раздел Device в файле xorg.conf выглядит следующим образом:
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "Tesla K80"
BusID "0:30:0"
EndSection
При попытке запустить startx под пользователем, не обладающим правами root, возникает следующая ошибка:
/usr/lib/xorg/Xorg.wrap: Only console users are allowed to run the X server
Если я изменяю /etc/X11/Xwrapper.config, чтобы разрешить любому пользователю запускать startx, то появляется следующая ошибка:
Couldn't get a file descriptor referring to the console
Я читал, что подключение через SSH не означает подключение к текстовой консоли, которая необходима для запуска startx. Попытка сменить текстовую консоль с помощью chvt не дает результата.
Существует ли способ запустить X через SSH?
Здесь приведено решение на основе systemd-run
, которое обманывает startx
, заставляя его считать, что он был запущен из виртуального терминала.
Вы можете добавить дисплейный менеджер (например, lightdm
) и настроить автоматический вход пользователя. Даже запустить x11vnc
при старте сессии пользователя.
В качестве альтернативы можно запустить vncserver
от имени пользователя и затем подключиться к нему напрямую через переадресацию ssh:
ssh -L5904:localhost:5905 [email protected]
vncserver :5 # только если сервер ещё не запущен
Затем на клиенте вы можете запустить:
xvncviewer localhost:4
.
Ответ или решение
Чтобы запустить X-сервер как обычный пользователь через SSH на удаленной виртуальной машине под управлением Ubuntu 18.04 с установленной видеокартой Nvidia, необходимо учесть несколько аспектов.
Теория
Запуск X-сервера в Unix-подобных системах требует доступа к терминалу консоли, поскольку по умолчанию считается, что Xorg должен быть запущен из текстового виртуального терминала (TTY). Когда вы подключаетесь по SSH, вы, по сути, работаете в псевдотерминале, который не имеет доступа к основному экрану консоли. Это делает невозможным запуск X-сессий с использованием стандартного вызова startx
из-под обычного пользователя через SSH, так как Xorg.wrap
настроен таким образом, что позволяет запуск X только из консоли.
Решение проблемы может быть несколькими способами: конфигурирование с помощью systemd-run
, использование диспетчера входа, или же использование сервера VNC вместо x11vnc, оставаясь в пространстве прав непривилегированного пользователя.
Пример
Ваше текущее решение использует nvidia-xconfig
, чтобы автоматически сгенерировать xorg.conf
, который выглядит следующим образом:
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "Tesla K80"
BusID "0:30:0"
EndSection
Ошибка, которую вы получаете при попытке запустить startx
как непривилегированный пользователь, выглядит так:
/usr/lib/xorg/Xorg.wrap: Only console users are allowed to run the X server
Это происходит из-за ограничений, установленных в /etc/X11/Xwrapper.config
.
Применение
Метод 1: Использование systemd-run
Вы можете использовать systemd-run
, чтобы обмануть startx
, заставляя его думать, что вы запустили его из виртуального терминала. Команда может выглядеть примерно так:
systemd-run --user --tty startx
systemd-run
создаёт временную систему, где startx может выполняться, как если бы он был запущен из TTY.
Метод 2: Установка диспетчера входа
Установка диспетчера входа, такого как lightdm
, позволяет автоматически входить в систему и запускать X-сервер без необходимости использовать startx
напрямую в SSH-сессии:
-
Установите
lightdm
с помощью:sudo apt-get install lightdm
-
Настройте автоматический вход, отредактировав файл
/etc/lightdm/lightdm.conf
:[SeatDefaults] autologin-user=[ваше_имя_пользователя] autologin-user-timeout=0
-
Настройте
x11vnc
для автозапуска при старте X-сессий вашего пользователя, добавив его в конфигурацию автозапуска вашего оконного менеджера.
Метод 3: Использование VNC-сервера
Вы можете использовать VNC-сервер, такой как tigervnc
, который может предоставлять доступ к графическим сессиям без прямого использования X через startx
:
-
Установите
tigervnc
:sudo apt-get install tigervnc-standalone-server
-
Настройте VNC-сервер для запуска X-середы, выполнив:
vncserver :1
-
Подключитесь к VNC-сессии через SSH-туннель, чтобы обеспечить безопасное соединение:
На клиентской машине выполните:
ssh -L 5901:localhost:5901 user@remote-server
В другом терминале клиента войдите в через VNC-клиент:
vncviewer localhost:1
Таким образом, выбор наиболее подходящего метода зависит от ваших требований и доступа к системе. Использование systemd-run
– это элегантное решение, которое позволяет избежать сложной конфигурации, тогда как использование VNC-сервера предлагает более гибкий подход для управления удаленной графической средой. Рассмотрение диспетчера входа инфраструктуры может быть удобным выбором для автоматизации процессов входа и настройки рабочей станции на удаленном оборудовании.