Изменение разрешения сеанса VNC в Linux
Я использую VNC для подключения к рабочей станции Linux на работе. На работе у меня есть 20-дюймовый монитор, который работает с разрешением 1600x1200, а дома я использую свой ноутбук с разрешением 1440x900. Если я установлю vncserver на 1440x900, мне не хватит места на мониторе, тогда как если я установите его на 1600x1200, он не помещается на экране ноутбука, и мне приходится постоянно прокручивать его.
Есть ли хороший способ изменить размер сеанса VNC на лету?
Мой VNC-сервер - RealVNC E4.x (точную версию не помню), работающий на SuSE64.
15 ответов
Реальный VNC-сервер 4.4 включает поддержку Xrandr, которая позволяет изменять размеры VNC. Запустите сервер с:
vncserver -geometry 1600x1200 -randr 1600x1200,1440x900,1024x768
Затем измените размер с помощью:
xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768
Выяснилось, что vnc4server (4.1.1), поставляемый с Ubuntu (10.04), исправлен, чтобы также поддерживать изменение разрешения на лету через xrandr. К сожалению, эту функцию было трудно найти, потому что она недокументирована. Так что вот оно...
Запустите сервер с несколькими экземплярами 'geometry', например:
vnc4server -geometry 1280x1024 -geometry 800x600
Из терминала в vncviewer (с включенным: "разрешить изменение размера рабочего стола") используйте xrandr для просмотра доступных режимов:
xrandr
чтобы изменить результат, например, используйте:
xrandr -s 800x600
Это оно.
Я использую TigerVNC на моем Linux-сервере, который имеет базовую поддержку randr. Я просто запускаю vncserver без опций -randr или multi-geometry.
Когда я запускаю xrandr в терминале, он отображает все доступные разрешения экрана:
bash> xrandr
SZ: Pixels Physical Refresh
0 1920 x 1200 ( 271mm x 203mm ) 60
1 1920 x 1080 ( 271mm x 203mm ) 60
2 1600 x 1200 ( 271mm x 203mm ) 60
3 1680 x 1050 ( 271mm x 203mm ) 60
4 1400 x 1050 ( 271mm x 203mm ) 60
5 1360 x 768 ( 271mm x 203mm ) 60
6 1280 x 1024 ( 271mm x 203mm ) 60
7 1280 x 960 ( 271mm x 203mm ) 60
8 1280 x 800 ( 271mm x 203mm ) 60
9 1280 x 720 ( 271mm x 203mm ) 60
*10 1024 x 768 ( 271mm x 203mm ) *60
11 800 x 600 ( 271mm x 203mm ) 60
12 640 x 480 ( 271mm x 203mm ) 60
Current rotation - normal
Current reflection - none
Rotations possible - normal
Reflections possible - none
Затем я могу легко переключиться на другое разрешение (например, переключиться на 1360x768):
bash> xrandr -s 5
Я использую TightVnc Viewer в качестве клиента, и он автоматически адаптируется к новому разрешению.
Так как этот вопрос возник в Google в первую очередь, я решил поделиться решением, использующим TigerVNC, которое в наши дни используется по умолчанию.
xrandr
позволяет выбирать режимы отображения (также называемые разрешениями), однако из-за жесткой кодировки моделинов в код необходимо будет добавить любую дополнительную модельную линию, такую как "2560x1600" или "1600x900". Я думаю, что разработчики, написавшие код, намного умнее, а жестко закодированный список - это всего лишь образец значений. Это приводит к выводу, что должен быть способ добавления пользовательских моделей и man xrandr
подтверждает это.
На этом фоне, если целью является совместное использование сеанса VNC между двумя компьютерами с указанными выше разрешениями и при условии, что VNC-сервер - это компьютер с разрешением "1600x900":
Начните сеанс VNC с геометрией, соответствующей физическому отображению:
$ vncserver -geometry 1600x900 :1
На компьютере "2560x1600" запустите программу просмотра VNC (я предпочитаю Remmina) и подключитесь к удаленному сеансу VNC:
host:5901
Оказавшись внутри сеанса VNC, запустите окно терминала.
Убедитесь, что новая геометрия доступна в сеансе VNC:
$ xrandr Screen 0: minimum 32 x 32, current 1600 x 900, maximum 32768 x 32768 VNC-0 connected 1600x900+0+0 0mm x 0mm 1600x900 60.00 + 1920x1200 60.00 1920x1080 60.00 1600x1200 60.00 1680x1050 60.00 1400x1050 60.00 1360x768 60.00 1280x1024 60.00 1280x960 60.00 1280x800 60.00 1280x720 60.00 1024x768 60.00 800x600 60.00 640x480 60.00
и вы заметите, что экран довольно маленький.
Перечислите модельную линию (см. Статью xrandr в ArchLinux wiki) для разрешения "2560x1600":
$ cvt 2560 1600 # 2560x1600 59.99 Hz (CVT 4.10MA) hsync: 99.46 kHz; pclk: 348.50 MHz Modeline "2560x1600_60.00" 348.50 2560 2760 3032 3504 1600 1603 1609 1658 -hsync +vsync
или, если монитор старый, получите тайминги GTF:
$ gtf 2560 1600 60 # 2560x1600 @ 60.00 Hz (GTF) hsync: 99.36 kHz; pclk: 348.16 MHz Modeline "2560x1600_60.00" 348.16 2560 2752 3032 3504 1600 1601 1604 1656 -HSync +Vsync
Добавьте новую моделину в текущий сеанс VNC:
$ xrandr --newmode "2560x1600_60.00" 348.16 2560 2752 3032 3504 1600 1601 1604 1656 -HSync +Vsync
В выше
xrandr
На выходных ищите отображаемое имя во второй строке:VNC-0 connected 1600x900+0+0 0mm x 0mm
Свяжите новую модельную линию с текущим виртуальным монитором VNC:
$ xrandr --addmode VNC-0 "2560x1600_60.00"
Используй это:
$ xrandr -s "2560x1600_60.00"
Я думаю, что вам лучше всего запустить VNC-сервер с другой геометрией на другом порту. Я хотел бы попробовать на основе страницы руководства
$vncserver :0 -geometry 1600x1200 $vncserver :1 -geometry 1440x900
Затем вы можете подключиться с работы к одному порту и из дома на другой.
Изменить: Затем используйте xmove для перемещения окон между двумя x-серверами.
Интересно, что никто не ответил на это. В TigerVNC, когда вы вошли в сеанс. Идти к System > Preference > Display
из верхней строки меню (я использовал Cent OS в качестве удаленного сервера). Нажмите на раскрывающееся разрешение, доступны различные настройки, включая 1080p. Выберите тот, который вам нравится. Это изменится на лету.
Убедитесь, что вы применяете новый параметр при появлении диалогового окна. В противном случае он вернется к предыдущему значению, как в Windows
Ребята, это действительно просто.
войти через ssh
в твой пи
выполнять
vncserver -geometry 1200x1600
Это создаст новый сеанс :1
связаться с вашим клиентом VNC в ipaddress:1
Это оно.
Добавление к ответу Натана (принято):
Я хотел просмотреть список разрешений, но ничего для этого не увидел:
function vncNextRes()
{
xrandr -s $(($(xrandr | grep '^*'|sed 's@^\*\([0-9]*\).*$@\1@')+1)) > /dev/null 2>&1 || \
xrandr -s 0
}
Он получает текущий индекс, переходит к следующему и возвращается к нулю в случае ошибки (т. Е. Завершается)
РЕДАКТИРОВАТЬ
Изменено в соответствии с более поздней версией xrandr ("*" находится в конце строки и не содержит идентификатора ведущего разрешения).
function vncNextRes()
{
xrandr -s $(($(xrandr 2>/dev/null | grep -n '\* *$'| sed 's@:.*@@')-2)) || \
xrandr -s 0
}
Решение от @omiday работало для меня в Xvnc TigerVNC 1.1.0, поэтому я собрал его в единую функцию bash vncsize xy. Используйте это так: vncsize 1400 1000. Предполагается, что xrandr сообщает имя выхода VNC по умолчанию.
function vncsize {
local x=$1 y=$2
local mode
if mode=$(cvt "$x" "$y" 2>/dev/null)
then
if [[ $mode =~ "Modeline (.*)$" ]]
then
local newMode=${BASH_REMATCH[1]//\"/}
local modeName=${newMode%% *}
local newSize=( ${modeName//[\"x_]/ } )
xrandr --newmode $newMode
xrandr --addmode default "$modeName"
xrandr --size "${newSize[0]}x${newSize[1]}" &&
return 0
else
echo "Unable to parse modeline for ($x $y) from $mode"
return 2
fi
else
echo "\`$x $y' is not a valid X Y pair"
return 1
fi
}
Возможно, самый невежественный ответ, который я написал, но здесь идет: Используйте клиент / просмотрщик TigerVNC и проверьте 'Resize remote session to local window'
под вкладкой экрана параметров.
Я не знаю, что клиент $%#@ TigerVNC сообщает удаленному vncserver, или xrandr, или Xvnc, или gnome, или... но он изменяет размер, когда я изменяю окно клиента TigerVNC.
Моя настройка:
- Tiger VNC Server, работающий на CentOS 6. Хостинг рабочего стола GNOME. (Работает с RHEL 6.6 тоже)
- Windows какая-то версия с Tiger VNC Client.
При этом разрешение изменяется в соответствии с размером окна клиента, независимо от того, что это, и это не zooming
, это фактическое изменение разрешения (я вижу новое разрешение в выводе xrandr).
Я перепробовал все, что мог, чтобы добавить новое разрешение в xrandr, но безрезультатно, всегда получалось 'xrandr: Failed to get size of gamma for output default'
ошибка.
Версии, с которыми он работает у меня сейчас (хотя у меня не было проблем с ЛЮБЫМИ версиями в прошлом, я просто устанавливаю последнюю версию, используя yum install gnome-* tigervnc-server
и отлично работает)
OS: RHEL 6.6 (Santiago)
VNC Server:
Name : tigervnc-server
Arch : x86_64
Version : 1.1.0
Release : 16.el6
# May be this is relevant..
$ xrandr --version
xrandr program version 1.4.0
Server reports RandR version 1.4
$
# I start the server using vncserver -geometry 800x600
# Xvnc is started by vncserver with following args:
/usr/bin/Xvnc :1 -desktop plabb13.sgdcelab.sabre.com:1 (sg219898) -auth /login/sg219898/.Xauthority
-geometry 800x600 -rfbwait 30000 -rfbauth /login/sg219898/.vnc/passwd -rfbport 5901 -fp catalogue:/e
tc/X11/fontpath.d -pn
# I'm running GNOME (installed using sudo yum install gnome-*)
Name : gnome-desktop
Arch : x86_64
Version : 2.28.2
Release : 11.el6
Name : gnome-session
Arch : x86_64
Version : 2.28.0
Release : 22.el6
Connect using Tiger 32-bit VNC Client v1.3.1 on Windows 7.
Я не уверен насчет linux, но в Windows, silentvnc обнаружит и адаптируется к изменениям разрешения на сервере.
Таким образом, вы должны иметь возможность подключать VNC к рабочей станции, делать то же самое, что щелкать правой кнопкой мыши по рабочему столу, свойствам, устанавливать разрешение на что угодно, и соответственно изменять размер окна vnc вашего клиента.
С другой стороны, если есть способ переместить существующее окно с одного X-сервера на другой, это может решить проблему.
Я думаю, что вы можете использовать xmove для перемещения окон между двумя отдельными x-серверами. Так что, если это работает, это должно, по крайней мере, дать вам возможность делать то, что вы хотите, хотя и не так легко, как изменение разрешения.
У меня есть простая идея, что-то вроде этого:
#!/bin/sh
echo `xrandr --current | grep current | awk '{print $8}'` >> RES1
echo `xrandr --current | grep current | awk '{print $10}'` >> RES2
cat RES2 | sed -i 's/,//g' RES2
P1RES=$(cat RES1)
P2RES=$(cat RES2)
rm RES1 RES2
echo "$P1RES"'x'"$P2RES" >> RES
RES=$(cat RES)
# Play The Game
# Finish The Game with Lower Resolution
xrandr -s $RES
Что ж, мне нужно лучшее решение для всех устройств отображения в Linux и аналогичных ПО.
Насколько я знаю, нет способа изменить разрешение клиента, просто используя VNC, так как это просто приложение для "зеркалирования монитора".
Однако TightVNC (который является клиентским и серверным приложением VNC) может изменить размер экрана на стороне клиента, то есть сделать все немного меньше (аналогично методам изменения размера изображения в графических программах). Это должно работать, если вы не используете слишком маленький размер шрифта. VNC должен теоретически быть совместимым между различными приложениями VNC.
Я думаю, что это зависит от вашего оконного менеджера.
Я пользователь Windows, так что это может быть ошибочным предположением, но: разве не существует что-то под названием X-Server, работающее на машинах Linux - по крайней мере на тех, которые могут быть интересными целями для VNC - с которыми вы можете соединиться? "X-клиенты "?
VNC просто берет все, что находится на экране, и "туннелирует это через вашу сеть". Если я не совсем ошибаюсь, тогда протокол "X" должен дать вам возможность использовать разрешение рабочего стола вашего клиента.
Попробуйте X-Server в Википедии, которая может дать вам приблизительный обзор.