我在工作中使用 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。选择您喜欢的一项。它会即时改变。

enter image description here

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

由于这个问题首先出现在 Google 上,我想我应该分享一个使用 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”分辨率的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
    
  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. 将新的 modeline 绑定到当前的 VNC 虚拟监视器:

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

    $ 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 下的所有显示设备

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

我是 Windows 用户,所以这可能是一个错误的猜测,但是:不是有一个东西叫 X服务器 在 Linux 机器上运行 - 至少在那些可能是 VNC 感兴趣的目标的机器上 - 您可以使用“X-Clients”连接到它?

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

X服务器 尝试一下维基百科,这可能会给您一个粗略的概述。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top