Debian.pro

Блог для пользователей и администраторов Debian


Запускаем графические приложения на сервере без иксов с удаленным доступом к ним по VNC.

Иногда возникает необходимость запускать графические приложения на сервере. Поднимать иксы из-за этого глупо. Дырка, ресурсы, иксы будут работать медленно на всяких Cyrus на 8 мб. А может и иксы не получится поднять вообще (ну нет нужных устройств в /dev, что поделаешь). С OpenVZ такое часто бывает.
У нас остается вариант использовать ssh -X. Но проброс иксов (кстати, в этом случае не обязательно на сервере иметь запущенным X-сервер) может работать медленно и у нас не получится запустить приложение в фоне (если уж быть совсем занудой, то получится, но с матами и этому будет посвящен отдельный трактат). В общем для запуска браузера на быстром коннекте подойдет, но не более.
Сейчас кто-то задаст вопрос «на кой черт оно тебе надо?». Поясню. Во-первых браузер доступный отовсюду с сохраненными паролями (таскать их на флешке и втыкать в вендовозки, которые могут копировать содержимое — опасно). VPN поднять получится далеко не на всех чужих ПК. Во-вторых — браузер, за сохранность которого мы можем не бояться в открытых сетях. Понятно, что это не для видео, а для банковских интерфейсов или webmoney/ЯД. В-третьих может придти заказчик и сказать «надо и всё тут». Ну а про случаи, когда нужна запущенная в фоне утилита с графической мордой я молчу. Мало ли что там быдлокодеры пишут =) Я же использовал данный способ для запуска Firefox с запущенными iMacros-скриптами на домашнем сервере, чтобы зря не гонять шумный десктоп (да-да, когда то у меня был шумный десктоп. Это сейчас водянка и огромные тихие кулеры на HDD).
Ладно, определились с целями (пусть будет джастфофан). Теперь определимся с реализацией.
У линуксячьего VNC-сервера есть режим эмуляции X-среды. Да, дергаются все библиотеки, но фактического запуска иксов не происходит. Экономятся ресурсы, не нужна видеокарта. А самое главное, что можно спокойно отключиться и с сессией ничего не случится.
Кто-то скажет про то, что медленно или некрасиво. Медленно решается туннелированием через SSH со сжатием. Некрасиво — нам ехать, а не шашечки.
Все действия я буду воспроизводить на OpenVZшной машинке, чтобы уж наверняка.
Поставим нужные пакеты:
root@remote-server:~# aptitude install xvnc4server
Оно спросит кучу зависимостей, что логично. Придется их ставить.
Ещё нам понадобится простенький, но функциональный оконный менеджер. В подобных случаях я использую обычно fluxbox (да и на десктопе его использовал очень долгое время). В нем есть все необходимое. Ещё я запускаю gnome-panel (уж очень удобные апплеты и менюшки), но это опционально.
Поставим fluxbox:
root@remote-server:~# aptitude install fluxbox
Теперь становимся пользователем и всё дальше выполняем от имени пользователя. В данном примере я использую пользователя inky
root@remote-server:~# su inky
Для начала запаролим VNC-сервер:
inky@remote-server:~$ vnc4passwd
Теперь впишем в конфиг vnc-сервера весь софт, который нужно запускать при старте vnc-демона.
inky@remote-server:~$ editor /home/inky/.vnc/xstartup
У меня файл выглядит так:
#/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
fluxbox &
AeroFS &
gnome-panel &

Главное тут то, что нам нужно заменить x-window-manager & на fluxbox & или запуск любого другого оконного менеджера.
Всё готово для запуска. Собственно, запустим:
inky@remote-server:~$ vnc4server -geometry 1350x600
-geometry 1350×600 — разрешение виртуального экрана. Подберите себе сами удобное.
Внимательно ищем строчку вот такого рода:
New ‘remote-server:1 (inky)’ desktop is remote-server:1
Если :1 — то vnc слушает порт 5901, если :2 — то 5902 и так далее. Данная информация будет полезна анальным рабам стивобалмера, и тем, кто дочитает статью до конца (там будет про безопасность). Обычный же VNC клиент в Linux сможет прицепиться к адресу remote-server:1
Чтобы остановить vnc-server правильно используем такую команду:
inky@remote-server:~$ vnc4server -kill :1
Всё. Теперь мы можем цепляться к нашему VNC-серверу и запускать там какие-либо приложения. Если вы выбрали Fluxbox — не поленитесь сменить тему Флюкса на FluxNight — с ней намного комфортнее, чем со стандартной (пкм по столу, styles и там выбираете).
Теперь о безопасности. Понятное дело, что цепляться к VNC напрямую в прослушиваемой wifi-сети не очень хорошая идея. Мы обернем наш VNC в ssh туннель.
Закроем все соединения к VNC, кроме локальных (все команды дальше исходят из того, что vnc-server стартовал на :1):
root@remote-host:~# iptables -I INPUT -p tcp --dport 5901 ! -i lo -j DROP
root@remote-host:~# iptables -I INPUT -p tcp --dport 6001 ! -i lo -j DROP

Теперь никто не сможет подцепиться к нашему VNC снаружи.
Мы же пробросим себе порт VNC-сервера на локальную машину (выполняем уже на лаптопе):
user@laptop:~$ ssh -L 5910:127.0.0.1:5901 user@remote-server
Теперь мы можем VNC клиентами цепляться к localhost:5910 и localhost:10
Виндузятники могут пробросить порты в Putty или использовать openssh-клиент (у него такой же синтаксис как и в нормальных ОС).

В общем-то всё. Мы получили шифрование и сжатие VNC-трафика. Ну а то, про что было написано в начале статьи мы получили уже давно.
В ходе следования выполнения инструкций из статьи на сервере стало занято на 20 мегабайт больше памяти и на 100 метров больше дисково пространства, что более чем отлично. На VNC запустилось без особых вопросов. По скорости — на сервере в хетзнере из москвы я смог с ветерком полазить по gmail, убить ноутбук не хотелось.
Удачного использования и не светите свои данные в открытой сети ;)
P.S. — из VNC-клиентов крайне советую использовать Remmina — действительно клевая вещь. Она умеет целиком пробрасывать клавиатуру в VNC, вместе со всякими alt-f2 и c-a-del.

22.08.2011 byinkvizitor68sl|Использование
Метки:

Комментарии (18):

  1. Civil :

    М… А ты замерял какой прирост скорости даёт сжатие на ssh для VNC? Честно говоря сомневаюсь что даст что-то значительное…

  2. Достаточно ощутимое, чтобы им пользоваться. Раза в 2-3 на глаз, на медленных каналах.
    Ну и про шифрование забывать не стоит — vnc из коробки ничего не шифрует.

  3. Civil :

    Про шифрование понимаю. А вот Z-сжатие на сжатую графику всегда действовало отвратно.

  4. Хм. VNC то не пыныгой картинку передаёт, емнип. Оно цветные точки + координаты. Потом локально собирается в BMP-шку. Иначе бы нельзя было на лету менять глубину цвета, качество картинки и т.д. А если клиент может хоть как-то воздействовать на сервер — то это дырко )

  5. Civil :

    Измененные тайлы, пожатые уже. Грубо говоря diff картинки, пожатый как считали нужным авторы протокола.

  6. Ты меня вынуждаешь tcdump достать из широких штанов? )

    Я сейчас из Пензы по edge прекрасно ощущаю, как VNC «сжимает» тайлы. Можно поковыряться и изучить как оно работает в данной конкретной реализации, но зачем?

  7. vovans :

    Как зачем? Публике интеренсно ))

  8. Кхы) хорошая аргументация)
    Но пойду ка я лучше более полезную на практике статью напишу.

  9. gonzo :

    статья баян, 4 года назад такое реализовал
    не понял в каком месте ты указываешь сжатие ssh и не упомянуты vnc клиенты для венды,кстати в них тоже есть сжатие,еще там будет решаемая проблема с вставкой русского текста из буфера обмена и тд

  10. Ну реализовывали и реализовывали, что с того? Я это реализую с установки первой машинки на убунте (6 лет назад дело было). От этого нормального хауту на русском языке нигде не материализовалось силами нашей мысли.
    Сжатие — http://debian.pro/517
    Про винду я пишу редко и она меня мало интерисует в принципе. Тем более, что сейчас у меня вообще нет необходимости оглядываться на эту винду, потому как даже на эникее с виндой я всех послал лесом (а линуксоидов просто консультирую — они уже давно без меня справляются).
    В реммине проблем с буфером обмена нет, в самом xvncserver — тоже.

  11. ChimKiu :

    Огромная благодарность автору за отличную статью! Очень полезно, четко и ясно!

  12. RootKiiit :

    Где можно найти этот самый xvnc4server? Это не одно и то же, что и vnc4server? Я в поисках 3й день шарю по Сети, но откуда ставить так и не нашёл… Есть неттоп, который собираюсь таскать с буком по командировкам, что б при нужде можно было и кластер поднять, и серверочком поставить и просто поработать немножко с другим софтом (бук-то старенький, не резиновый, да и ещё на чипсете от VIA, уходит в кому от слова торрент)… А таскать с собой ещё и моник, и клаву как-то не шибко кошерно…

  13. Да, тоже самое.

  14. RootKiiit :

    Спасибо, поставил пакет, как бы и со всеми зависимостями… Ставил на гольную Lucid-server (только mc, openSSH, aircrack-ng), X-ами там и не пахло… Ставил как и описано (я тоже люблю Flux…), но при подключении получил гольные «X-ы», только подвигал крестом и никакой реакции на клаву-батоны мыши… Неттоп был с подключенными моником, клавой и мышью (оба устройства ввода — USB), сам неттоп на Ion`е и Атоме — только USB и подключается… Где может быть косяк? Клиент — Remmina…

  15. > Теперь впишем в конфиг vnc-сервера весь софт, который нужно запускать при старте vnc-демона.
    > inky@remote-server:~$ editor /home/inky/.vnc/xstartup
    > У меня файл выглядит так:

    Описанное вами выглядит так, как будто вы не стартовали ни одного WM.

  16. RootKiiit :

    Hi, inky, проблема была в правах на xstartup — не был установлен бит исполнения… Сейчас всё заработало…

  17. ivan :

    и в чём выигрыш? в оперативе? очень интересно какой — в цифрах.

  18. Выигрыш в том, что трафик зашифрован.

    Но вообще нафиг это уже всё — лучше x2go использовать https://debian.pro/1618

Написать комментарий