Установка VNC-сервера на VDS и рекомендации по тюнингу
Данное руководство ориентировано на виртуальные серверы (VDS/VPS), доступ к которым осуществляется по VNC через интернет. Это задает основные приоритеты — экономное использования ресурсов сервера и работа по недостаточно быстрому каналу. В качестве базовой системы, на которую выполняется установка, используется минимальная инсталляция Ubuntu 9.10. С небольшими изменениями это руководство применимо к другим дистрибутивам Linux и операционным системам семейства Unix, а также для настройки VNC на обычных выделенных серверах и на серверах в локальной сети.
* Способы организации работы VNC-серверов
** Встроенный VNC-сервер в эмуляторах аппаратного обеспечение (Xen/HVM, VMWare, Qemu)
** VNC-сервер, привязанный к работающему X-серверу (GNOME vino)
** VNC-сервер с встроенным X-сервером
*** VNC-сервер, запускаемый вручную
*** VNC-сервер, запускаемый в режиме демона
*** VNC-сервер, запускаемый через inetd
* Выбор VNC-сервера
* Тюнинг сервера
** Тюнинг десктопа
** Опции VNC-сервера
Способы организации работы 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.
Тюнинг сервера
Тюнинг десктопа
Настройки рабочего стола способны оказать заметное влияние на скорость работы по сети. Задача снижения объема передаваемых данных сводится к двум подзадачам: минимизация изменений на экране и использование хорошо сжимаемых изображений.
Сглаживания шрифтов
Основная часть информации, с которой работает пользователь — это текст: окна с текстом, меню, формы и т.д. Включенное сглаживание шрифтов увеличивает в 1.5-3 раза объем передаваемых при отображении текста данных, так как полутоновые области на границах символов несут в себе дополнительную плохо сжимаемую информацию.
Сглаживание можно отключить в окне настроек шрифтов GNOME, но такое отключение будет работать не во всех программах — например, Firefox шрифты по прежнему будет сглаживать. Поэтому лучше внести настройки в системный конфигурационный файл /etc/fonts/fonts.conf (отключается сглаживание всех шрифтов размером менее 14 пикселей):
<match target="font">
<test name="size" compare="less">
<double>14</double>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>
<match target="font">
<test name="pixelsize" compare="less" qual="any">
<double>14</double>
</test>
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
Объем передаваемых данных и скорость отображения на канале 1 Мбит/сек выпадающего меню (глубина цвета: 16 бит, кодирование: Tight):
|
Включено субпиксельное сглаживание |
Без сглаживания |
|
|
|
Объем |
30 Кб |
13.8 Кб |
Скорость |
0.24 сек |
0.11 сек |
Фон рабочего стола
Фон рабочего стола способен сильно замедлить работу, если в нем будет расположена фотография или рисунок. Любое сворачивание окна или меню влечет за собой перерисовку того участка фона, который был им перекрыт. И, чем сложнее изображение, тем больший объем данных будет передаваться. Для минимизации затрат полосы пропускания на фон рекомендуется использовать одноцветный фон, лучше всего — белый.
Десктопная тема
Оформление элементов интерфейса тоже может влиять на объем передаваемых данных. Для минимизации трафика следует выбрать тему с плоскими цветами, без градиентов. Впрочем, многие темы, использующие вертикальные градиенты, сжимаются достаточно хорошо и их можно использовать без ощутимых потерь в скорости.
Размер шрифтов
Уменьшение размера шрифтов для системных меню и текстовых полей влечет за собой уменьшение геометрического размера текстовых участков, а следовательно, уменьшение объема передаваемых данных.
Опции VNC-сервера
VNC-сервер имеет много опций, но нас интересуют следующие три: geometry — размер экрана, depth — глубина цвета, deferupdate — задержка передачи изменений.
geometry
Размер экрана в пикселях. Формат: -geometry ШИРИНАxВЫСОТА. Например, -geometry 800x600 — 800 пикселей в ширину и 600 пикселей в высоту. Чем больше размер экрана, там больший объем данных необходимо передавать — но прямой зависимости между ними нет. При изменении информации на дисплее, клиенту передается не изображение дисплея полностью, а только участок с измененной информацией — открытое окно, открытый пункт меню или напечатанный символ. Поэтому существенного выигрыша при использовании 800x600 вместо 1024x768 нет.
depth
Глубина цвета в битах. Формат: -depth ЧИСЛО_БИТ, ЧИСЛО_БИТ — 8, 15, 16 или 32. Чем больше глубина цвета, тем качественнее показываются полутона, оттенки, но тем больший объем информации требуется передавать. Уменьшение глубины цвета уменьшает объем данных, и, соотвественно, увеличивается скорость. Для работы через интернет вполне подходит глубина цвета 16 бит. При использование медленного канала (<256 Кбит/сек) рекомендуется использовать глубину цвета в 8 бит.
Объем передаваемых данных и скорость отображения на канале 1 Мбит/сек выпадающего меню для различной глубины цвета (кодирование: Tight):
|
|
|
|
Глубина цвета |
24 бита |
16 бит |
8 бит |
Объем |
15.2 Кб |
13.8 Кб |
9 Кб |
Скорость |
0.12 сек |
0.11 сек |
0.07 сек |
VNC-клиенты имеют возможность принудительно использовать уменьшенную глубину цвета 8 бит (256 цветов), игнорируя при этом глубину цвета, заданную на сервере.
deferupdate
Задержка при передаче изменений на дисплее, в миллисекундах. Формат: -deferupdate ЧИСЛО_МИЛЛИСЕКУНД, по умолчанию — 40. Позволяет объединить в одно обновление большое число мелких изменений экрана, выполненных в интервал времени, указанный в опции. При слиянии нескольких изменений, произошедших на одном и том же участке экрана, итоговый объем передаваемых данных уменьшается. Увеличение этого параметра ухудшает интерактивность — визаульная реакция на какое-либо действие показывается на VNC-клиенте только после истечения времени deferupdate. С учетом задержек на передачу данных по сети, суммарные задержки реакции могут снижать конфортность работы.
Большинство операций на виртуальных серверах отрисовывается достаточно быстро, и значение deferupdate можно отрицательных эффектов понизить до 10 мсек. В сетях с большой пропускной способностью задержку можно отключить полностью, указав -deferupdate 0.
Заключение
Использование 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-клиент, десктоп GNOME |
80 Mb |
два VNC-клиента, две сессии десктопа GNOME |
127 Mb |
один VNC-клиент, десктоп GNOME, запущен Firefox, открыт сайт www.ubuntu.com |
121 Mb |
один VNC-клиент, десктоп GNOME, запущен текстовый редактор OpenOffice.org |
112 Mb |