168

我在工作中使用 VNC 连接到 Linux 工作站。在工作中,我有一台运行在 1600x1200 的 20" 显示器,而在家里,我使用分辨率为 1440x900 的笔记本电脑。如果我将 vncserver 设置为以 1440x900 运行,我会错过显示器上的大量空间,而如果我将它设置为以 1600x1200 运行它不适合笔记本电脑的屏幕,我必须一直滚动它。

有什么好的方法可以即时调整 VNC 会话的大小吗?

我的 VNC 服务器是在 SuSE64 上运行的 RealVNC E4.x(我不记得确切的版本)。

4

15 回答 15

171

Real VNC server 4.4 包括对 Xrandr 的支持,它允许调整 VNC 的大小。使用以下命令启动服务器:

vncserver -geometry 1600x1200 -randr 1600x1200,1440x900,1024x768

然后调整大小:

xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768
于 2009-07-05T08:18:58.250 回答
69

发现 Ubuntu (10.04) 附带的 vnc4server (4.1.1) 已修补,也支持通过 xrandr 动态更改分辨率。不幸的是,该功能很难找到,因为它没有记录。所以这里...

使用多个“几何”实例启动服务器,例如:

vnc4server -geometry 1280x1024 -geometry 800x600

从 vncviewer 中的终端(启用:“允许动态桌面调整大小”)使用 xrandr 查看可用模式:

xrandr

要更改结果,例如使用:

xrandr -s 800x600

就是这样。

于 2010-10-01T13:47:01.993 回答
30

我在我的 Linux 服务器上运行TigerVNC ,它具有基本的 randr支持。我只是在没有任何 -randr 或多个 -geometry 选项的情况下启动 vncserver。

当我在终端中运行 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

然后我可以轻松切换到另一个分辨率(fe 切换到 1360x768):

bash> xrandr -s 5

我使用 TightVnc 查看器作为客户端,它会自动适应新的分辨率。

于 2011-12-05T15:57:55.767 回答
26

我认为最好的办法是在不同的端口上运行具有不同几何形状的 VNC 服务器。我会根据手册页尝试

$vncserver :0 -geometry 1600x1200
$vncserver :1 -geometry 1440x900

然后,您可以从工作连接到一个端口,从家里连接到另一个。

编辑:然后使用 xmove 在两个 x 服务器之间移动窗口。

于 2008-08-19T09:36:37.247 回答
24

当这个问题首先出现在谷歌上时,我想我会分享一个使用 TigerVNC 的解决方案,这是这些天的默认设置。

xrandr允许选择显示模式(也称为分辨率),但是由于模式行是硬编码 的,因此需要将任何额外的模式行(例如“2560x1600”或“1600x900”)添加到代码中。我认为编写代码的开发人员要聪明得多,硬编码列表只是值的示例。它得出的结论是,必须有一种方法可以添加自定义模型并man xrandr对其进行确认。

在此背景下,如果目标是在具有上述分辨率的两台计算机之间共享 VNC 会话,并假设 VNC 服务器是分辨率为“1600x900”的计算机:

  1. 使用与物理显示匹配的几何图形启动 VNC 会话:

    $ vncserver -geometry 1600x900 :1
    
  2. 在“2560x1600”计算机上启动 VNC 查看器(我更喜欢 Remmina)并连接到远程 VNC 会话:

    host:5901
    
  3. 一旦进入 VNC 会话,就会启动一个终端窗口。

  4. 确认新几何在 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  
    

    你会注意到屏幕很小。

  5. 列出“2560x1600”分辨率的模式行(参见 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
    
  6. 将新模式行添加到当前 VNC 会话:

    $ xrandr --newmode "2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
    
  7. 在上面的xrandr输出中查找第二行的显示名称:

    VNC-0 connected 1600x900+0+0 0mm x 0mm
    
  8. 将新的模式行绑定到当前的 VNC 虚拟监视器:

    $ xrandr --addmode VNC-0 "2560x1600_60.00"
    
  9. 用它:

    $ xrandr -s "2560x1600_60.00"
    
于 2016-07-28T08:01:37.197 回答
21

有趣的是没有人回答这个问题。在 TigerVNC 中,当您登录会话时。System > Preference > Display从顶部菜单栏转到(我使用 Cent OS 作为我的远程服务器)。单击分辨率下拉菜单,有各种可用设置,包括 1080p。选择你喜欢的那个。它会即时改变。

在此处输入图像描述

确保在提示对话框时应用新设置。否则它将恢复到以前的设置,就像在 Windows 中一样

于 2014-05-31T20:32:21.013 回答
10

伙计们,这真的很简单。

ssh通过您的 pi登录

执行

vncserver -geometry 1200x1600

这将生成一个新会话:1

与您的 vnc 客户端连接ipaddress:1

就是这样。

于 2017-11-12T17:39:02.420 回答
6

添加到内森(已接受)的答案:

我想循环浏览决议列表,但没有看到任何内容:

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
}
于 2011-07-03T02:08:14.133 回答
4

@omiday 的解决方案在 Xvnc TigerVNC 1.1.0 中为我工作,因此我将其浓缩为单个 bash 函数vncsize xy。像这样使用它:vncsize 1400 1000。它适用于任何 VNC 输出名称,“默认”或“VNC-0”。

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_]/ } )
            local screen=$(xrandr -q|grep connected|cut -d' ' -f1)
            xrandr --newmode $newMode
            xrandr --addmode "$screen" "$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
}
于 2016-09-29T18:02:46.137 回答
2

也许是我发布的最无知的答案,但这里是:使用 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.
于 2015-02-28T04:06:14.767 回答
1

我不确定linux,但是在windows下,tightvnc会检测并适应服务器上的分辨率变化。

因此,您应该能够将 VNC 连接到工作站,执行相当于右键单击桌面、属性、将分辨率设置为任何内容,并让您的客户端 vnc 窗口相应地调整自身大小。

于 2008-08-19T10:32:18.010 回答
1

另一方面,如果有办法将现有窗口从一个 X 服务器移动到另一个,那可能会解决问题。

我认为您可以使用xmove在两个单独的 x 服务器之间移动窗口。因此,如果它有效,这至少应该为您提供一种方法来做您想做的事情,尽管不像更改分辨率那么容易。

于 2008-08-19T13:07:41.220 回答
0

据我所知,仅使用 VNC 无法更改客户端的分辨率,因为它只是一个“监视器镜像”应用程序。

然而, TightVNC(它是一个 VNC 客户端和服务器应用程序)可以在客户端调整屏幕大小,即使一切变得更小(类似于图形程序中的图像调整技术)。如果您不使用太小的字体,那应该可以。VNC 理论上应该在不同的 VNC 应用程序之间兼容。

于 2008-08-19T07:13:31.733 回答
0

我有一个简单的想法,是这样的:

#!/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 和类似设备下的所有显示设备 SO

于 2012-07-25T11:19:37.193 回答
-3

我认为这取决于您的窗口管理器。

我是 Windows 用户,所以这可能是一个错误的猜测,但是:在 linux 机器上是否没有运行称为X-Server的东西- 至少在那些可能是 VNC 有趣目标的机器上 - 你可以连接到“ X 客户”?

VNC 只是获取屏幕上的所有内容并“通过您的网络进行隧道传输”。如果我没有完全错,那么“X”协议应该让您有机会使用客户端的桌面分辨率。

试试 Wikipedia 上的X-Server,它可能会给你一个粗略的概述。

于 2008-08-19T07:54:11.040 回答