题
我在工作中使用 VNC 连接到 Linux 工作站。在工作中,我有一台运行分辨率为 1600x1200 的 20 英寸显示器,而在家里,我使用分辨率为 1440x900 的笔记本电脑。如果我将 vncserver 设置为以 1440x900 运行,我会错过显示器上的大量空间,而如果我将其设置为以 1600x1200 运行,则它不适合笔记本电脑的屏幕,而且我必须一直滚动它。
有没有什么好方法可以动态调整 VNC 会话的大小?
我的VNC服务器是在SuSE64上运行的RealVNC E4.x(我不记得确切的版本)。
解决方案
Real VNC 服务器 4.4 包括对 Xrandr 的支持,它允许调整 VNC 的大小。使用以下命令启动服务器:
vncserver -geometry 1600x1200 -randr 1600x1200,1440x900,1024x768
然后调整大小:
xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768
其他提示
发现 Ubuntu (10.04) 附带的 vnc4server (4.1.1) 已修补,还支持通过 xrandr 动态更改分辨率。不幸的是,该功能很难找到,因为它没有记录。所以这里是...
使用多个“几何”实例启动服务器,例如:
vnc4server -geometry 1280x1024 -geometry 800x600
从 vncviewer 中的终端(使用:启用“允许动态桌面调整大小”)使用 xrandr 查看可用模式:
xrandr
要更改结果,例如使用:
xrandr -s 800x600
就是这样。
我在跑 老虎VNC 在我的 Linux 服务器上,它有基本的 兰德尔 支持。我只是启动 vncserver,没有任何 -randr 或多个 -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 查看器作为客户端,它会自动适应新的分辨率。
我认为最好的方法是在不同的端口上运行具有不同几何结构的 VNC 服务器。我会尝试基于 手册页
$vncserver :0 -geometry 1600x1200 $vncserver :1 -geometry 1440x900
然后,您可以从工作地点连接到一个端口,从家里连接到另一个端口。
编辑:然后使用 xmove 在两个 x-server 之间移动窗口。
有趣的是没有人回答这个问题。在 TigerVNC 中,当您登录到会话时。去 System > Preference > Display
从顶部菜单栏(我使用 Cent OS 作为我的远程服务器)。单击分辨率下拉菜单,有各种可用设置,包括 1080p。选择您喜欢的一项。它会即时改变。
确保在出现对话框时应用新设置。否则它将恢复到之前的设置,就像在 Windows 中一样
由于这个问题首先出现在 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
你会发现屏幕非常小。
列出“ 2560x1600”分辨率的Modeline(请参阅Archlinux Wiki中的Xrandr文章):
$ 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
将新的 modeline 绑定到当前的 VNC 虚拟监视器:
$ xrandr --addmode VNC-0 "2560x1600_60.00"
用它:
$ xrandr -s "2560x1600_60.00"
伙计们,这真的很简单。
通过登录 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
}
它获取当前索引,进入下一个索引,并在出现错误时循环回 0(即结尾)
编辑
已修改以匹配更高版本的 xrandr(“*”位于行尾且无前导解析标识符)。
function vncNextRes()
{
xrandr -s $(($(xrandr 2>/dev/null | grep -n '\* *$'| sed 's@:.*@@')-2)) || \
xrandr -s 0
}
我不确定Linux,但在Windows下,tightvnc将检测并适应服务器上的分辨率变化。
因此,您应该能够通过 VNC 进入工作站,执行相当于右键单击桌面、属性、将分辨率设置为任意值的操作,并让您的客户端 VNC 窗口相应地调整自身大小。
另一方面,如果有一种方法可以将现有窗口从一个X服务器移动到另一个X服务器,那可能会解决问题。
我想你可以使用 移动 在两个独立的 x 服务器之间移动窗口。因此,如果它有效,这至少应该为您提供一种做您想做的事情的方法,尽管不像更改分辨率那么容易。
也许是我发布过的最无知的答案,但这里是:使用 TigerVNC 客户端/查看器并检查 'Resize remote session to local window'
在选项的“屏幕”选项卡下。
我不知道 $%#@ TigerVNC 客户端告诉远程 vncserver 或 xrandr 或 Xvnc 或 gnome 或...但当我更改 TigerVNC 客户端窗口时它会调整大小。
我的设置:
- Tiger VNC 服务器运行在 CentOS 6 上。托管 GNOME 桌面。(也适用于 RHEL 6.6)
- Windows 某些版本带有 Tiger VNC 客户端。
这样,无论客户端窗口是什么,分辨率都会改变以适应客户端窗口的大小,但事实并非如此 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.
@omiday 的解决方案在 Xvnc TigerVNC 1.1.0 中为我工作,因此我将其压缩为单个 bash 函数 vnc 大小 x y. 。像这样使用它: vnc 大小 1400 1000. 。它假设 兰德尔 将 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
}
据我所知,仅使用 VNC 无法更改客户端的分辨率,因为它只是一个“监视器镜像”应用程序。
紧VNC 但是(这是一个 VNC 客户端和服务器应用程序)可以在客户端调整屏幕大小,即使一切变小(类似于图形程序中的图像调整大小技术)。如果您不使用太小的字体,这应该可行。理论上,VNC 应该在不同的 VNC 应用程序之间兼容。
我有一个简单的想法,如下所示:
#!/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 和类似 S.O 下的所有显示设备