Zmiana rozdzielczości sesji VNC w systemie Linux [zamknięte]


153

Używam VNC do łączenia się ze stacją roboczą Linux w pracy. W pracy mam 20-calowy monitor o rozdzielczości 1600x1200, natomiast w domu korzystam z laptopa o rozdzielczości 1440x900. Jeśli ustawię serwer vncs na 1440x900, tracę dużo miejsca na monitorze, a jeśli ustaw go na 1600x1200, nie mieści się na ekranie laptopa i muszę go cały czas przewijać.

Czy istnieje dobry sposób na zmianę rozmiaru sesji VNC w locie?

Mój serwer VNC to RealVNC E4.x (nie pamiętam dokładnej wersji) działający na SuSE64.


Chciałbym wspomnieć o czymś, na co natknąłem się ostatnio, ale nie byłem jeszcze w stanie tego przetestować. Istnieje nowy program o nazwie FreeNX, który ma zastąpić VNC. Oto link: freenx.berlios.de
andho.

@andho - ten link wydaje się być uszkodzony.
ArtOfWarfare

@ArtOfWarfare mam nadzieję, że to pomoże help.ubuntu.com/community/FreeNX . Powinien być już dość stabilny. Myślę, że wkrótce spróbuję, o ile czas na to pozwoli.
andho

Odpowiedzi:


159

Prawdziwy serwer VNC 4.4 zawiera obsługę Xrandr, która umożliwia zmianę rozmiaru VNC. Uruchom serwer z:

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

Następnie zmień rozmiar za pomocą:

xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768

1
Dzięki Nathan, nawet ludzie realvnc nie wydają się podkreślać funkcji xrandr ... Zobacz także moją funkcję bash poniżej, aby umożliwić przełączanie się między rozdzielczościami randr.
nhed

7
Może się okazać, że wygodnie jest umieścić wszystkie te opcje w .vnc/configpliku. Na przykład pierwsza linia mojej konfiguracji to:-randr 800x600,1024x768,1280x800,1280x960,1280x1024,1680x1050,1920x1080,3360x1050,1024x700,1200x740,1600x1000,3200x1000
bfroehle

@Nathan Próbowałem użyć podanego przez Ciebie rozwiązania, ale bezskutecznie. czy możesz spróbować odpowiedzieć na moje pytanie?
Geek

3
Zastanawiam się, czy to działa tightvncserver?
Dimitry K,

4
@DimitryK Miałem tightvncserver i nie działa. Wyczyściłem go i zainstalowałem prawdziwy VNC. Polecam to. Wszystkie rozdzielczości poziome: 320x240,480x320,482x320,560x360,576x360,640x480,640x482,648x486,720x480,720x486,720x540,720x576,768x576,800x480,800x600,1024x600,1024x768,1280x720,1280,1280x400,1280x720,1280,1280x400,1280x720,1280,1280x400x450 1600x900,1600x1024,1600x1200,1680x1050,1920x1080,1920x1200,2048x1024,2048x1152,2048x1536,2560x1080,2560x1440,2560x1600,2560x2048,3072x1536,3072x1728,3840x2160,4096x2048,4096x2304,7280x860x4196x480
barwnikk

68

Okazało się, że vnc4server (4.1.1) dostarczany z Ubuntu (10.04) jest załatany tak, aby obsługiwał również zmianę rozdzielczości w locie przez xrandr. Niestety ta funkcja była trudna do znalezienia, ponieważ jest nieudokumentowana. Więc oto jest ...

Uruchom serwer z wieloma instancjami „geometrii”, takimi jak:

vnc4server -geometry 1280x1024 -geometry 800x600

Z terminala w vncviewer (z włączoną opcją: „zezwól na zmianę rozmiaru pulpitu dymanic”) użyj xrandr, aby wyświetlić dostępne tryby:

xrandr

aby zmienić rezolucję, na przykład użyj:

xrandr -s 800x600

Otóż ​​to.


Próbowałem również zastosować twoje podejście wraz z podejściem zaproponowanym przez Nathana, ale bez powodzenia. Czy potrafisz dostrzec, czego tu
Geek

Działał doskonale. Dzięki!
Roney Michael

27

Używam TigerVNC na moim serwerze Linux, który ma podstawową obsługę randr . Po prostu uruchamiam vncserver bez żadnych opcji -randr lub multiple -geometry.

Kiedy uruchamiam xrandr w terminalu, wyświetla wszystkie dostępne rozdzielczości ekranu:

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

Mogę wtedy łatwo przełączyć się na inną rozdzielczość (np. Przełączyć na 1360x768):

bash> xrandr -s 5

Używam przeglądarki TightVnc jako klienta i automatycznie dostosowuje się do nowej rozdzielczości.


aby ludzie nie biegali w pogoń za dzikimi gęsiami, czy możesz podać zarówno wersję TigerVnc, jak i wersję z dystrybucją + serwer Linux? Dzięki
nhed

Mogę potwierdzić, że działa całkiem dobrze z TiverVnc 1.1.0 (serwer Linux, klient Linux)
Benedikt Waldvogel

1
Używam vncviewer i za każdym razem, gdy próbuję zmienić rozdzielczość, okno się zamyka.
AWE

czy mogę zapytać, która to wersja xrandr. Mój: program xrandr w wersji 1.3.5 Raporty serwera RandR w wersji 1.3 wydaje się zupełnie inny, np. Nie ma pierwszej kolumny
Wakan Tanka

Wystarczy dodać, że działa również z Real VNC jako klient. Testowane dla wersji 6.0.3
Vivek VK

25

Myślę, że najlepiej byłoby uruchomić serwer VNC z inną geometrią na innym porcie. Spróbowałbym w oparciu o stronę podręcznika

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

Następnie możesz łączyć się z pracy do jednego portu iz domu do innego.

Edycja: Następnie użyj xmove, aby przenieść okna między dwoma x-serwerami.


3
@Pat, problem z twoim rozwiązaniem polega na tym, że nie mogę łatwo przenieść okna z jednej sesji VNC do drugiej. Jeśli jestem w trakcie debugowania, kiedy muszę wyjść, chcę móc wznowić od miejsca, w którym przerwałem (może z oknami przesuniętymi trochę z powodu zmiany rozmiaru). Jeśli mam dwie oddzielne sesje, nie będę mógł kontynuować tego samego co poprzednio, ponieważ będę musiał zamknąć okna z jednej sesji i ponownie otworzyć je w innej. Z drugiej strony, jeśli istnieje sposób na przeniesienie istniejącego okna z jednego X-serwera na inny, może to rozwiązać problem.
Nathan Fellman

1
xmove nie znajduje się w aktualnym repozytorium Ubuntu; xpra jest, co zrobi to samo (będzie działać jako X proxy).
Sam Hartsfield

20

Ponieważ to pytanie pojawia się jako pierwsze w Google, pomyślałem, że udostępnię rozwiązanie wykorzystujące TigerVNC, które jest obecnie domyślne.

xrandrpozwala na wybór trybów wyświetlania (inaczej rozdzielczości), jednak ze względu na zakodowane na stałe modele modeline, do kodu należałoby dodać dodatkowe modele, takie jak „2560x1600” lub „1600x900” . Myślę, że programiści, którzy napisali kod, są znacznie mądrzejsi, a lista zakodowana na stałe to tylko próbka wartości. Prowadzi to do wniosku, że musi istnieć sposób dodawania własnych modeli i man xrandrpotwierdza to.

Na tym tle, jeśli celem jest współdzielenie sesji VNC między dwoma komputerami o powyższych rozdzielczościach i przy założeniu, że serwer VNC to komputer o rozdzielczości „1600x900”:

  1. Rozpocznij sesję VNC z geometrią pasującą do fizycznego wyświetlacza:

    $ vncserver -geometry 1600x900 :1
    
  2. Na komputerze „2560x1600” uruchom przeglądarkę VNC (wolę Remmina) i połącz się ze zdalną sesją VNC:

    host:5901
    
  3. Po wejściu do sesji VNC uruchom okno terminala.

  4. Potwierdź, że nowa geometria jest dostępna w sesji 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  
    

    a zauważysz, że ekran jest dość mały.

  5. Wypisz modeline (zobacz artykuł xrandr w ArchLinux wiki) dla rozdzielczości "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
    

    lub jeśli monitor jest stary, pobierz taktowanie 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. Dodaj nowy modeline do bieżącej sesji VNC:

    $ xrandr --newmode "2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
    
  7. W powyższym xrandrwyjściu poszukaj nazwy wyświetlanej w drugiej linii:

    VNC-0 connected 1600x900+0+0 0mm x 0mm
    
  8. Powiąż nowy modeline z bieżącym wirtualnym monitorem VNC:

    $ xrandr --addmode VNC-0 "2560x1600_60.00"
    
  9. Użyj tego:

    $ xrandr -s "2560x1600_60.00"
    

użył go do stworzenia większego obszaru roboczego z tigervnc i mwm, działał, aby zwiększyć rozmiar ekranu, ale obszar roboczy jest ograniczony do początkowego rozmiaru używanego przez vnc.
user2019716

Wynika to z mwm, całe miejsce jest wykorzystywane po ponownym uruchomieniu mwm
user2019716

Świetnie, wielkie dzięki za przepis, naprawdę pomogło.
Adrian Rosoga

Dzięki temu zaoszczędziłem dużo czasu!
Ben Davis,

17

Co ciekawe, nikt na to nie odpowiedział. W TigerVNC, gdy jesteś zalogowany do sesji. Przejdź do System > Preference > Displayz górnego paska menu (używałem Cent OS jako mojego zdalnego serwera). Kliknij listę rozwijaną rozdzielczości, dostępne są różne ustawienia, w tym 1080p. Wybierz ten, który Ci się podoba. Zmieni się w locie.

wprowadź opis obrazu tutaj

Upewnij się, że zastosowałeś nowe ustawienie, gdy pojawi się okno dialogowe. W przeciwnym razie powróci do poprzedniego ustawienia, tak jak w systemie Windows


1
Czy to jest ustawienie TigerVNC, CentOS czy menedżera okien?
Nathan Fellman

To jest ustawienie w CentOS. Możesz uzyskać do niego dostęp z „TigerVNC Viewer” po zalogowaniu.
Hammad Khan

2
to bezpieczne moje życie
Yu Jiaao

9

Chłopaki, to jest naprawdę proste.

zaloguj się sshdo swojego pi

wykonać

vncserver -geometry 1200x1600

Spowoduje to wygenerowanie nowej sesji :1

połącz się z klientem vnc pod adresem ipaddress:1

Otóż ​​to.


7
To zła odpowiedź, ponieważ nie zmieni rozdzielczości istniejącej sesji, a po prostu utworzy nową.
Nathan Fellman

6

Dodawanie do (zaakceptowanej) odpowiedzi Nathana:

Chciałem przewinąć listę rozwiązań, ale nic nie widziałem:

function vncNextRes()
{
   xrandr -s $(($(xrandr | grep '^*'|sed 's@^\*\([0-9]*\).*$@\1@')+1)) > /dev/null 2>&1 || \
   xrandr -s 0
}

Pobiera aktualny indeks, przechodzi do następnego i cofa się do 0 w przypadku błędu (tj. Koniec)


EDYTOWAĆ

Zmodyfikowano w celu dopasowania do późniejszej wersji xrandr („*” znajduje się na końcu wiersza i nie ma wiodącego identyfikatora rozdzielczości).

function vncNextRes()
{
   xrandr -s $(($(xrandr 2>/dev/null | grep -n '\* *$'| sed 's@:.*@@')-2))  || \
   xrandr -s 0
}

3

Rozwiązanie autorstwa @omiday działało dla mnie w Xvnc TigerVNC 1.1.0, więc skondensowałem je do pojedynczej funkcji bash vncsize xy . Użyj tego w ten sposób: vncsize 1400 1000 . Działa z każdą nazwą wyjścia VNC, „domyślną” lub „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 "$sscreen" "$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
}

2

Być może najbardziej ignorancka odpowiedź, którą opublikowałem, ale oto: Użyj klienta / przeglądarki TigerVNC i sprawdź 'Resize remote session to local window' opcje w zakładce Ekran.

Nie wiem, co klient $% # @ TigerVNC mówi zdalnemu serwerowi vncserver lub xrandr, Xvnc lub gnome lub ... ale zmienia rozmiar, gdy zmieniam okno klienta TigerVNC.

Moja konfiguracja:

  • Tiger VNC Server działający na CentOS 6. Hosting pulpitu GNOME. (Działa również z RHEL 6.6)
  • Windows w wersji z klientem Tiger VNC.

Dzięki temu rozdzielczość zmienia się, aby dopasować się do rozmiaru okna klienta, bez względu na to, co to jest, i tak nie jest zooming, to rzeczywista zmiana rozdzielczości (widzę nową rozdzielczość na wyjściu xrandr).

Próbowałem wszystkiego, co mogłem, aby dodać nową rozdzielczość do xrandra, ale bezskutecznie, zawsze kończy się to 'xrandr: Failed to get size of gamma for output default' błędem.

Wersje, z którymi to teraz działa (chociaż nie miałem problemów z ŻADNĄ wersją w przeszłości, po prostu instaluję najnowsze yum install gnome-* tigervnc-serveri działa dobrze):

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.

Jakich wersji TigerVNC używasz na swoim kliencie / serwerze? Próbowałem tego dzisiaj i nie zmienia to automatycznie rozmiaru. Jestem na RHEL 6.2 działa Xvnc TigerVNC 1.1.0 dla serwera i klienta vncviewer-1.4.3.exe
cdwilson

@cdwilson Mam nadzieję, że próbowałeś z klientem w trybie pełnoekranowym. Dodane wersje. HTH
Kashyap

okazuje się, że wersja 1.1.0 nie grała dobrze z tym, co działają na naszych komputerach roboczych. Uruchomienie najnowszej wersji 1.4.3 z mojego $HOMEkatalogu działa zgodnie z oczekiwaniami github.com/TigerVNC/tigervnc/issues/155
cdwilson

Potwierdzone: openSuse 15.1, GDM, KDE Plasma, klient TigerVNC 1.9.0. Rozdzielczość mojego zdalnego pulpitu jest dopasowana do dowolnego rozmiaru okna klienta, dowolnej szalonej rozdzielczości ad-hoc, dowolnego współczynnika proporcji; w GDM lub KDE. Działa jak urok, po wyjęciu z pudełka, nie ma potrzeby ustawiania niczego w dowolnym miejscu na kliencie lub serwerze.
Espinosa

1

Nie jestem pewien co do Linuksa, ale pod Windows, tightvnc wykryje i dostosuje się do zmian rozdzielczości na serwerze.

Więc powinieneś być w stanie podłączyć VNC do stacji roboczej, zrobić odpowiednik kliknięcia prawym przyciskiem myszy na pulpicie, właściwościach, ustawić rozdzielczość na dowolną i odpowiednio zmienić rozmiar okna vnc klienta.


1

Z drugiej strony, jeśli istnieje sposób na przeniesienie istniejącego okna z jednego X-serwera na inny, może to rozwiązać problem.

Myślę, że możesz użyć xmove do przenoszenia okien między dwoma oddzielnymi x-serwerami. Jeśli więc zadziała, powinno to przynajmniej dać ci sposób na zrobienie tego, co chcesz, choć nie tak łatwo, jak zmiana rozdzielczości.


czy wiesz, czy xmove występuje pod inną nazwą w SuSE Linux?
Nathan Fellman

@NathanFellman czy spojrzałeś na XPRA? Jest to nowsza aplikacja, ale podobne narzędzie en.wikipedia.org/wiki/Xpra i software.opensuse.org/package/xpra .
Dnia

Nie mam nad tym dużej kontroli, ponieważ pracuję w dużej korporacji, w której dział IT wybiera narzędzia zdalnego dostępu
Nathan Fellman

0

O ile wiem, nie ma sposobu, aby zmienić rozdzielczość klienta po prostu za pomocą VNC, ponieważ jest to po prostu aplikacja do „dublowania monitora”.

Jednak TightVNC (który jest aplikacją klienta i serwera VNC) może zmienić rozmiar ekranu po stronie klienta, tj. Uczynić wszystko trochę mniejszym (podobnie do technik zmiany rozmiaru obrazu w programach graficznych). To powinno działać, jeśli nie używasz zbyt małych rozmiarów czcionek. VNC powinien teoretycznie być kompatybilny między różnymi aplikacjami VNC.


pytanie jest ściśle związane z Linuksem, ta odpowiedź systemu Windows nie ma tutaj zastosowania. W systemie Windows VNC to tylko monitor, ale w Linuksie był to NAJPIERW wirtualny pulpit, a dopiero później niektóre wersje dodały obsługę 'display 0' (tj. Monitora). Skalowanie VNC jest dość kiepskim doświadczeniem użytkownika.
nhed

0

Mam prosty pomysł, coś takiego:

#!/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

Cóż, potrzebuję lepszego rozwiązania dla wszystkich urządzeń wyświetlających pod Linuksem i Similars SO


-3

Myślę, że to zależy od twojego menedżera okien.

Jestem użytkownikiem systemu Windows, więc może to być błędne przypuszczenie, ale: czy nie istnieje coś, co nazywa się X-Server na komputerach z systemem Linux - przynajmniej na tych, które mogą być interesującymi celami dla VNC - z którymi można się połączyć ” X-Clients ”?

VNC po prostu pobiera wszystko, co jest na ekranie i „tuneluje to przez Twoją sieć”. Jeśli się nie mylę, protokół „X” powinien dać ci szansę na użycie rozdzielczości pulpitu klienta.

Wypróbuj X-Server na Wikipedii, co może dać ci ogólny przegląd.


Pomysł jest dobry i można go wykonać za pomocą tunelu ssh i lokalnego serwera x. Masz x-serwer na swojej maszynie i dajesz zdalnym klientom dostęp do twojego x-serwera, który będzie renderował GUI zdalnych aplikacji na twoim ekranie.
andho

@andho no to w ogóle nie jest to, o co prosił plakat - problem polega na tym, że po utracie łączności stracisz okna. Otwieranie okien nad tunelem jest przydatne tylko w przypadku krótkoterminowych aplikacji, a nie wtedy, gdy chcesz przenieść swój pulpit (i wszystkie otwarte aplikacje) od jednego klienta do drugiego ...
nhed

@nhed, nie wiem, czy to w ogóle jest praktyczne, ale to jest pomysł. Jeśli chodzi o aplikacje długoterminowe, może można użyć programu „ekranowego”?
andho

Ekran @andho jest niesamowity, dla aplikacji tekstowych ... OP pytał o aplikacje X ... i dotarłem do tego zakątka sieci, ponieważ szukałem tego samego i wydaje się, że albo coś takiego jak xranr lub xmove at the closet things (xrandr to czystsza opcja)
nhed

@nhed, tak, to jest problem, który też mam. Po prostu wyrzucam ten pomysł, aby ktoś bardziej doświadczony mógł go wymyślić, bez konieczności sprawdzania, czy to w ogóle możliwe.
andho,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.