Portál AbcLinuxu, 1. května 2025 01:26
Na root.cz vyšla zprávička o Synergy+ a v této zprávičce mě zaujala jedna věta.
Na rozdíl od KVM přepínačů se nestará o monitor, takže každý ze strojů musí mít svůj.No a tak mě napadla taková šílenost, jestli by nešlo nějak pracovat i s obrazem. A ono to jde, pár minutek bastlení a je to tady.
Update: Poznámka. V tomto článku se používá zkratka KVM ve dvou významech. První význam je Kernel-based Virtual Machine, když píšu, že mi běží Windows v KVM. V ostatních případech je ale zkratka KVM použita ve významu Keyboard-Video-Mouse přepínač. Ke KVM přepínači lze připojit konektory klávesnice, myši a monitoru z více různých PC, dále pak jededn monitor, myš a klávesnici. KVM přepínač pak umožňuje přepnout na jednotlivé počítače a propojit k nim tu sdílenou klávesnici, myš a monitor, takže uživatel nemusí mít ke každému počítači vlastní klávesnici, myš a monitor.
Mám hlavní pracovní stanici a vedlejší pracovní stanici. Ke hlavní stanici mám připojený jeden monitor, na vedlejší stanici jsou dva starší LCD. Na obou stanicích beží Linux (na hlavní Gentoo, na vedlejší Debian stable), přičemž na vedlejší stanici nahazuju Xka s Fluxboxem a na jednom monitoru se mi startuje RDP na Windows běžící v KVM a na druhém monitoru se startuje Firefox se stránkou s Nagiosem. Samozřejmě díky fluxboxu na obou screenech :0.0 a :0.1 mám možnost přepnout na jinou virtuální plochu a pracovat normálně v Linuxu. Na vedlejší stanici startuju v obou X screenech synergyc, který se připojuje na hlavní stanici na synergys přes stunnel. Přes synergy tedy mohu ovládat oba screeny vedlejší stanice pomocí klávesnice a myši hlavní stanice. Pro jistotu mám ale klávesnici a myš také u vedlejší stanice - už jsem se párkrát potřeboval připojit z vedlejší stanice na hlavní přes SSH a nakonfigurovat správně Xserver po nějaké větší aktualizaci Gentoo. Všechno funguje super.
Akorát mě teď napadlo, jestli by opravdu nešlo synergy používat i včetně obrazu. Samozřejmě, na HW KVM to nebude mít šanci, protože při bootu to prostě nepojede, ale na běžícím systému to může být pro někoho s jedním monitorem bez KVM zajímavé.
A jak to vlastně funguje? Script spustí synergys na popředí a čte jeho hlášení (musíte nějak synergys donutit, aby vypisoval INFO hlášení). Pokud script najde informaci o přepnutí synergy na jiný screen a pokud je ten screen "externí", spustí se vncviewer. Když pak dojde k přepnutí zase jinam, zabije vncviewer a spustí nový vncviewer. Pro nastartovaní VNC serveru na externím screenu můžete použít buď vncserver na Windows nebo na linuxu x11vnc.
Na začátku se jednoduše definují jednotlivé externí screeny, názvy musí odpovídat definicím v konfiguraci synergy, za zavináč se pak definuje cílový screen VNC. Můžete definovat cokoliv, co vncviewer podporuje. Můžete definovat přímo VNC server nebo (jako v mém případě) SSH tunely, stunnely nebo openvpn adresy, záleží na vás, kudy chcete obraz přenášet. VNC můžete přenášet klidně nešifrovaně, pokud vám nebude vadit, že může někdo sledovat obraz. Hesla by se měla posílat přes synergy (ten byste měli určitě šifrovat). Na druhou stranu x11vnc nebo vncserver (na Windows) buď poběží bez hesla nebo VNC heslo budete posílat pomocí vncvieweru v plain-textu, takže je lepší i ten VNC kanál šifrovat (nebo alespoň omezit přístup na vncserver/x11vnc pouze z vybraných IP). Po definici screenů přichází hlavní cyklus, který čte výstupy ze synergys. Pokud se najde zpráva o přepnutí na jiný screen, script nejdříve zabije již bežící vncviewer (pokud tedy nějaký již beží) a pak prohledá seznam definovaných screenů. Pokud se najde shodný název screenu, spustí se na pozadí (obraz samozřejmě vyskočí na popředí) vncviewer se zadanou adresou VNC serveru (parametry vncviewer si můžete upravit). Protože se zadávají pouze externí screeny, pro lokální obraz se žádný vncviewer nespustí. Takhle lze samozřejmě kombinovat screeny s LCD a screeny bez LCD, prostě pro externí screeny s monitorem žádný záznam nenadefinujete a definujete pouze externí screeny bez monitoru.
V mém případě se tedy připojím na vedlejší stanici přes ssh příkazem ssh -L 6300:localhost:6400 -L 6301:localhost:6301 vedlstanice
a pak tam spustím x11vnc na oba screeny: x11vnc -forever -rfbport 6300 -display :0.0
a x11vnc -forever -rfbport 6301 -display :0.1
. Mohl bych to ještě vylepšit tak, aby se x11vnc spouštěly při startu floxboxu, stejně jako se startují synergyc, rdp na Windows a firefox s Nagios stránkou a VNC bych mohl tunelovat také stunnelem jako synergy a ne přes ssh, ale teď jsem to chtěl pouze vyzkoušet, takže jsem to nejak složitěji neřešil.
Sice by bylo super spouštět vncviewer ve fullscreen modu, ale když jsem ho tak spouštěl, tak mi nefungovala myš v externím screenu přes synergy. Vncviewer ve fullscreen modu zřejmě nějak zamkne myš, alespoň v manu má tightvnc popis resource grabKeyboard. Taky to trošku pomaleji startuje, ale nevím, jak bych to vyřešil. Napadlo mě hned na začátku scriptu nastartovat všechny vncviewery, schovat je a pak je jenom zobrazovat, když je potřeba, ale nevím čím to udělat. Možná nějakou utilitkou pro Xka, ale teď mě nic nenapadá a není to pro mne tak důležité. Pokud byste měl někdo nějaký nápad, tak napište komentář.
Pokud to někomu pomůže, super. Pokud to někdo nebude potřebovat, tak se třebas aspoň něco nového dozví. A kdo už tohle všechno zná, tak už tenhle script zřejmě také napsal a možná používá vlastní
#!/bin/bash vncscreens="windows-ext@::6300|nagios0@::6301" pid="" synergys -f 2>&1 | while read l;do echo "$l" dst="${l##*to }" dst="${dst%% at *}" if ! [ "$l" = "$dst" ] ; then v="$vncscreens" if [ -n "$pid" ] && [ "$( ps -p "$pid" h -o comm )" = "vncviewer" ] ; then kill "$pid" ; fi d="" while [ -n "$v" ] ; do s="${v%%|*}" v="${v#*|}" if [ "$s" = "$v" ] ; then v=""; fi n="${s%%@*}" if [ "\"$n\"" = "$dst" ] ; then d="${s##*@}";break; fi done if [ -n "$d" ] ; then vncviewer -compresslevel 9 -encodings tight -viewonly "$d" >/dev/null 2>&1 & pid="$!" ; fi fi done
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.