• Москва +7 (495) 664 23 30
  • Санкт-Петербург +7 (812) 309 26 84

Справка

Установка VNC-сервера на VDS

Данное руководство ориентировано на виртуальные серверы (VDS/VPS), доступ к которым осуществляется по VNC через интернет. Это задает основные приоритеты - экономное использования ресурсов сервера и работа по недостаточно быстрому каналу. В качестве базовой системы, на которую выполняется установка, используется минимальная инсталляция Ubuntu 9.10. С небольшими изменениями это руководство применимо к другим дистрибутивам Linux и операционным системам семейства Unix, а также для настройки VNC на обычных выделенных серверах и на серверах в локальной сети.

Руководство написано по результатам разработки пресета Ubuntu 9.10 VNC, после установки которого на VDS, владелец сервера получает полностью сконфигурированный и готовый к работе сервер с многопользовательским графическим окружением.

Способы организации работы VNC-серверов

Основные способы организации удаленной работы с графическим десктопом на виртуальных серверах:

1. Встроенный VNC-сервер в эмуляторах аппаратного обеспечения (Xen/HVM, VMWare, Qemu)
2. VNC-сервер, привязанный к работающему X-серверу (GNOME vino)
3. VNC-сервер с встроенным X-сервером
3.1 VNC-сервер, запускаемый вручную
3.2 VNC-сервер, запускаемый в режиме демона
3.3 VNC-сервер, запускаемый через inetd

Рассмотрим эти способы и оценим их преимущества и недостатки.

1. Встроенный VNC-сервер в эмуляторах аппаратного обеспечение (Xen/HVM, VMWare, Qemu)

Многие платформы виртуализации, поддерживающие эмуляцию аппаратного обеспечение (VMWare, Qemu, Xen в режиме HVM) снабжают виртуальную машину виртуальными устройствами - графическим адаптером, клавиатурой, мышью - имитирующими работу реально существующиx устройств. Операционная система в виртуальной машине обращается с ними, как с обычным оборудованием, не отличая разницы. Программа, управляющая работой виртуальной машины, может связать эти эмулируемые устройства с встроенным в нее VNC-сервером, перенаправляя на VNC-клиент информацию, выводимую на графический адаптер виртуальной машины, и передавая на клавиатуру виртуальной машины информацию о нажатиях на клавиши, полученную от VNC-клиента. Для операционной системы и программ, работающих в виртульной машине, существование VNC-сервера и VNC-клиента незаметно, для них не требуются дополнительные драйверы или настройки - только стандартные драйверы того оборудования, которое эмулирует платформа виртуализации.

1. VNC-клиент, подключенный к VNC-серверу виртуальной машины Xen в режиме HVM, момент загрузки ОС FreeBSD.

В Xen включение VNC-сервера для виртуальной машины осуществляется указанием типа vnc в конфигурационном параметре vfb. Дополнительные опции в этом параметре: vnclisten - указывает IP-адрес, на котором VNC-сервер принимает соединения; vncpasswd - пароль, который должен сообщить VNC-клиент.

Например, добавление в конфигурационный файл виртуальной машины строки:

vfb = [ 'type=vnc,vnclisten=0.0.0.0,vncpasswd=qwerty' ]
означает включение VNC-сервера, который принимает соединения на всех доступных IP-адресах и требует авториазацию по паролю qwerty.

Основной и исчерпывающий плюс использования VNC-сервера платформы виртуализации: простота - достаточно включить поддержку VNC-сервера в настройках виртуальной машины.

Основные минусы: очень большой расход ресурсов на участке эмуляции оборудования и ограниченное число платформ виртуализации, поддерживающих эту возможность.

ПлюсыМинусы
  • Простота включения
  • Небольшое число платформ виртуализации
  • Расход ресурсов на эмуляцию оборудования
  • Расход на передачу данных между виртуальной машиной и супервизором
  • Расход ресурсов на постоянно работающие программы X-сервера и десктопа
  • Одновременно работать с десктопом может только один пользователь

Для некоторых платформ виртуализации также существует менее ресурсоемкий вариант, в котором вместо эмуляции реального графического устройства виртуальной машине передается упрощенная абстракция - фреймбуфер. Xen поддерживает фреймбуфер в качестве графического адаптера виртуальной машины, для X-серверов XFree86 и X.org есть драйверы экрана для фреймбуфера. При использовании фреймбуфера исключаются расходы процессора и оперативной памяти на эмуляцию реальной аппаратной части, но все остальные недостатки сохраняются.

2. VNC-сервер, привязанный к работающему X-серверу (GNOME vino)

Вариант лучше всего подходит для удаленного доступа к десктопу обычного компьютера (рабочего, домашнего). Доступ к рабочему столу по VNC в GNOME включается элементарно - достаточно включить в системном меню в разделе System / Preferences / Remote Desktop опции Allow other users to view you desktop, Allow other users to control you desktop. При их включении запускается входящий в GNOME VNC-сервер (vino), привязанный к дисплею X-сервера и полностью дублирующий для VNC-клиента выводимую на экран информацию.

Но на виртуальном сервере все становится сложнее. Сначала потребуется каким-либо образом запустить X-сервер, например, на эмулируемом графическом адаптере виртуальной машины, и только после этого можно будет разрешить VNC-доступ к дисплею данного X-сервера описаным выше способом. По сравнению с VNC-сервером на эмуляторе оборудования, плюс только один: меньшие расходы на эмуляцию. Но остальные минусы остаются и появляется новый - более трудоемкая настройка. Все вместе делает этот вариант худшим кандидатом для виртуального сервера.

ПлюсыМинусы
  • Меньший расход ресурсов на эмуляцию
  • Небольшое число платформ виртуализации
  • Расход ресурсов на эмуляцию оборудования
  • Расход на передачу данных между виртуальной машиной и супервизором
  • Расход ресурсов на постоянно работающие программы X-сервера и десктопа
  • Одновременно работать с десктопом может только один пользователь
  • Усложнение первоначальной настройки
  • Функция должна поддерживаться средой рабочего стола

3. VNC-сервер с встроенным X-сервером

Существует ряд программ - VNC-серверов, которые самостоятельно выступают в роли X-сервера для приложений. В отличии от стандартного X-сервера, работающего с реальными устройствами (графическим адаптером, клавиатурой, мышью) или их эмуляцией в виртуальных машинах, встроенному в VNC-сервер X-серверу эта функциональная часть не требуется - вместо аппаратного обеспечения взаимодействие осуществляется только с VNC-клиентом. X-серверу, встроенному в VNC-сервер, не требуются ни сложная настройка, ни вычислительные ресурсы для работы с оборудованием, поэтому для виртуальных серверов этот вариант подходит лучше всего.

В Ubuntu 9.10 виртуальный пакет vnc-server предлагает в качестве VNC-сервера две альтернативы: vnc4server (RealVNC) и tightvncserver (TightVNC). Существенной разницы между ними нет, есть только небольшие нюансы в их использовании, которые будут описаны позже. Сейчас рассмотрим vnc4server.

Минимальные инсталляции ОС для VDS, как правило, не включают графические среды, поэтому также понадобится установить GNOME. Для установки сервера RealVNC и GNOME достаточно установить два пакета:

apt-get install vnc4server gnome-core

3.1 VNC-сервер, запускаемый вручную
Настройки по умолчанию позволяют использовать VNC-сервер без дополнительной настройки сразу же после установки. Запускаем из командной строки VNC-сервер, создающий X-сервер на нулевом дисплее (и принимающий VNC-соединенения на порту 5900):
vncserver :0
а на созданном нулевом дисплее запускаем GNOME:
DISPLAY=:0 gnome-session

При первом старте vncserver попросит задать пароль, который нужно будет вводить в VNC-клиенте при подключении. Для изменения пароля VNC-сервера используется команда vncpasswd.

Но каждый раз заходить на сервер через SSH и запускать VNC-сервер вручную - для повседневной работы вариант не пригодный. Предпочтительнее настроить автоматический старт VNC-сервера.

3.2 VNC-сервер, запускаемый в режиме демона
Для того, чтобы не стартовать вручную VNC-сервер после каждой перезагрузки, его можно добавить в стартовую процедуру. При желании, можно построить полноценный набор скриптов для upstart, но на практике достаточно обойтись добавлением в /etc/rc.local строки:
su -l $USER -c "vncserver :0"
где в качестве $USER нужно указать логин пользователя, для которого запускается десктоп. При необходимости можно одновременно запустить несколько VNC-серверов для одного или разных пользователей на разных дисплеях.

При отключении VNC-клиента сессия десктопа и запущенные программы не завершаются, а продолжают работать так же, как при подключенном VNC-клиенте. При повтороном соединении VNC-клиента к этому дисплею, пользователь попадет в эту же самую сессию десктопа, как если бы отключения не было. К одному и тому же VNC-серверу (X-дисплею) могут подключиться несколько VNC-клиентов, при этом они будут работать с одним и тем же десктопом.

ПлюсыМинусы
  • Не зависит от платформы виртуализации
  • Не расходуются ресурсы на эмуляцию
  • Не расходуются ресурсы на работу с драйверами оборудования
  • Одновременно могут работать несколько пользователей
  • При отключении VNC-клиента сессия десктопа не прерывается
  • Расход ресурсов на постоянно работающие программы X-сервера и десктопа

3.3 VNC-сервер, запускаемый через inetd

Существует возможность стартовать VNC-сервер только по требованию - при подключении VNC-клиента. Для этого порт VNC-сервера 5900 передается на обслуживание демону inetd. Пока нет ни одного подключенного VNC-клиента, ни один VNC-сервер запущен не будет. При поступлении запроса на соединении со стороны клиента, inetd запускает VNC-сервер и связывает клиента с ним. VNC-сервер создает дисплей и начинает рабочую сессию. После отключения клиента, VNC-сервер закрывает сессию и завершает все программы, работающие с дисплеем.

При подключении к одному и тому же порту нескольких клиентов, для каждого будет запущен отдельный VNC-серверов с собственным дисплеем. Таким образом, у всех подключенных клиентов будут открыты независимые рабочие сессии. Это позволяет с помощью аутентификации через gdm легко настроить систему на многопользовательскую работу - после соединения запрашиваются логин и пароль пользователя виртуального сервера, после их правильного ввода будет начата рабочая сессия этого пользователя.

2. Авторизация пользователя через GDM при подключении к VNC-серверу.

В дополнение к уже установленным серверу RealVNC и GNOME, нам потребуется установить gdm и xinetd.

apt-get install xinetd gdm-2.20

Для начала нужно настроить менеджер дисплея GDM: разрешить принимать запросы на аутентификацию пользователей по XDMCP и отключить запуск X-сервера из gdm. Редактируем конфигурационный файл /etc/gdm/gdm.conf в соответствии с патчем:

--- /etc/gdm/gdm.conf.orig       2009-09-11 23:46:30.000000000 +0400
+++ /etc/gdm/gdm.conf    2009-11-30 02:36:06.000000000 +0300
@@ -311,3 +311,3 @@
 # the security of XDMCP.
-Enable=false
+Enable=true
 # Honor indirect queries, we run a chooser for these, and then redirect the
@@ -604,3 +604,3 @@
 #
-0=Standard device=/dev/console
+#0=Standard device=/dev/console
или сохраняем патч в файл /tmp/gdm.conf.patch и применяем его командой:
patch /etc/gdm/gdm.conf /tmp/gdm.conf.patch

Для того, чтобы xinetd стартовал VNC-сервер, создадим для него конфигурационный файл /etc/xinetd.d/xvnc с таким содержимым:

service xvnc
{
        type = UNLISTED
        disable = no
        socket_type = stream
        protocol = tcp
        wait = no
        user = gdm
        server = /usr/bin/Xvnc
        server_args = -inetd -query 127.0.0.1 -once -SecurityTypes none -extension XFIXES
        port = 5900
}

В аргументах запуска Xvnc обязательно должны быть -inetd, дающий знать VNC-серверу, что он запускается через демон inetd, и -query 127.0.0.1, означающий, что при старте VNC-сервера ему нужно будет выполнить аутентификацию пользователя через локальный менеджер дисплея (GDM). Опция -once сообщает, что после отключения клиента X-сервер нужно тоже отключить. -SecurityTypes none отключает собственную авторизацию VNC-сервера, так как пользователи аутентифицируются через gdm.

Рестартуем xinetd и gdm командами:

service gdm restart
service xinetd restart

Запускаем VNC-клиента и соединяемся с нашим сервером. Вводим логин и пароль пользователя системы, и получаем стандартный десктоп:

3. Ubuntu 9.10, десктоп GNOME.

Главное преимущество способа c inetd - отсутсвие расхода ресурсов на работу X-сервера и программ десктопа без VNC-клиентов. Дополнительный плюс - полноценная многопользовательская работа: все подключаются к стандратному VNC-порту, число пользователей не ограничено.

ПлюсыМинусы
  • Минимальный расход ресурсов в отсутствие VNC-клиентов
  • Не зависит от платформы виртуализации
  • Не расходуются ресурсы на эмуляцию
  • Не расходуются ресурсы на работу с драйверами оборудования
  • Полноценная многопользовательская работа
  • Более сложная настройка

Выбор VNC-сервера

В Ubuntu 9.10 стандартный дистрибутив имеет два VNC-сервера: vnc4server (RealVNC) и tightvncserver (TightVNC).

С RealVNC в качестве сервера встречаются проблемы с некоторыми клиентами. Например, ряд версий клиентов TightVNC и UltraVNC не могут использовать с этим сервером алгоритмы с сжатием, что приводит к замедлению работы через интернет. У сервера TightVNC таких проблем с клиентами не наблюдается. Кроме этого, в отличие от RealVNC, сервер TightVNC поддерживает алгоритм кодирования Tight, который позволяет сжимать данные с помощью JPEG - при отображении фотографий и других сложных изображений это существенно сокращает объем передаваемых данных. В остальном, заметных различий между серверами нет.

Отличия в настройке сервера TightVNC
В описании установки VNC-сервера с inetd все настройки приводились для сервера RealVNC. При использовании в качестве сервера TightVNC, потребуются небольшие изменения в настройках.

Для сервера TightVNC не требуются аргументы -SecurityTypes none и -extension XFIXES, поэтому строка аргументов в конфигурационном файле /etc/xinetd.d/xvnc для xinetd должна выглядеть так:

server_args = -inetd -query 127.0.0.1 -once

Также требуется запретить ремаппинг клавиатуры в GNOME, иначе нажатия на некоторые клавиши будут передаваться неверно. Для этого нужно установить переменную окружения XKL_XMODMAP_DISABLE. Легче всего это сделать создав файл /etc/X11/Xsession.d/10tightvncserver с содержимым:

export XKL_XMODMAP_DISABLE=1

Файл будет автоматически выполняться при старте сессии GNOME.

Заключение

Использование VNC-сервера, запускаемого через inetd, вместе с выполненными рекомендациями по тюнингу, позволяет работать с десктопом через интернет даже на виртуальных серверах начального уровня. В сумме, тюнинг позволяет добиться сокращения задержек в 2-5 раз, по сравнению со стандартными настройками. Запуск VNC-сервер по требованию позволяет освободить оперативную память для других задач.

Например, собранный по этой схеме пресет Ubuntu 9.10 VNC обеспечивает приемлемую работу с десктопом на VDS с 128 Mb RAM / 320 MHz CPU по каналу ADSL 1 Мбит/сек. При увеличении скорости подключения до 5-10 Мбит/сек и мощности виртуального сервера до 512 Mb RAM / 960 MHz CPU, работа по уровню комфортности приближается к работе с локальным компьютером. Время реакции для большинства интерфейсных операций находится в пределах 0.05-0.2 секунды.

Расход оперативной памяти на Ubuntu 9.10 с VNC-сервером, запускаемым через inetd:
Запущенные программыИспользуемая оперативная память
сервер без подключенных VNC-клиентов41 Mb
один VNC-клиент, десктоп GNOME80 Mb
два VNC-клиента, две сессии десктопа GNOME127 Mb
один VNC-клиент, десктоп GNOME, запущен Firefox, открыт сайт www.ubuntu.com121 Mb
один VNC-клиент, десктоп GNOME, запущен текстовый редактор OpenOffice.org112 Mb

Инструкции, VNC, VNC-сервер, Ubuntu