気の向くままに辿るIT/ICT/IoT
システム開発

NetBSDでVNC/Virtual Network Computing

ホーム前へ次へ
NetBSDのインストールと運用/NetBSD/i386 6.1.x編

NetBSDでVNC/Virtual Network Computing

NetBSDでVNC/Virtual Network Computing

 VNC機能やVNCソフトウェアとは、UNIX系であるUNIX、Linux、*BSD、Mac OS X/OS XやWindowsなど様々なOSで相互に利用可能なGUIによる遠隔操作(リモートコントロール)を可能とするものです。

 Windowsの場合、Vistaの一部エディションや7などならクライアント用WindowsをVNCサーバとすることもできますが、その場合には、デスクトップを1つしか利用できないという制約から当該マシンのデスクトップそのものが遠隔操作画面に表示され、当該マシン、遠隔操作側何れか一方はロックがかかり、2008や2012のようなWindowsサーバをVNCサーバとする場合には、遠隔操作するモニタ数に応じて別途サーバライセンスを保持していれば、こうした制約もなく利用できる模様、プロプライエタリな有償製品もあるようですが、オープンソース・フリーソフトウェアも多々あります。

 こうした機能を利用する場合、後述のようにVNCソフトウェアを使うか、SSHのX11Forwarding機能を利用するという方法があります。

 ここでは、NetBSDでVNCソフトウェアを使う方法について記します。

VNCソフトウェアを使う

 VNCソフトウェアはVNCサーバとVNCクライアント(ビューワ)から成り、VNCクライアント(X/Win32/Javaの一部、または全て)でVNCサーバが動作するリモートホストのGUI(X/Win32)を遠隔操作することができます。

 リモートでGUI操作する為の通信プロトコルRFB/Remote FrameBufferをベースとしたものならVNCクライアントとVNCサーバは、同一のVNCソフトウェアである必要はありません。

 同様の機能を持つWindows用のオープンソースのRDP/Remote Desktop Protocolをベースとしたものには、この通信プロトコルに対応したVNCクライアントを使うことになります。

 何れにしてもNetBSDの/usr/pkgsrc及びバイナリのリポジトリにも結構いろいろなVNCソフトウェアがあります。

(バイナリ)
$ pkgin av | grep -i vnc
gtk-vnc-0.5.2nb11    VNC viewer widget for GTK
libVNCServer-0.9.9nb5 Easy API to write one's own vnc server
tightvnc-1.3.10nb13  Display X and Win32 desktops on remote X/Win32/Java displays
tightvncviewer-1.3.10nb2 Viewer for remote X and Win32 VNC servers
vinagre-3.6.2nb23    VNC client for GNOME
vino-2.32.2nb15      VNC server for GNOME
vnc-3.3.3.2nb9       Display X and Win32 desktops on remote X/Win32/Java displays
vnc2swf-0.5.0nb4     Record vnc session as flash movie
vncviewer-4.1.2nb2   Viewer for remote X and Win32 VNC servers
x11vnc-0.9.13nb24    VNC server for real X displays
x2vnc-1.7.2nb2       Multi-console display using X and VNC
$ pkgin av | grep -i rdesktop
rdesktop-1.8.3       Open-source Remote Desktop Protocol client
tsclient-0.132nb70   GNOME2 Frontend for rdesktop
$ pkgin av | grep -i freerdp
freerdp-1.0.2nb11    Free implementation of the Remote Desktop Protocol
$
(/usr/pkgsrc)
$ pkgfind vnc
graphics/vnc2swf: Record vnc session as flash movie
net/gtk-vnc: VNC viewer widget for GTK
net/libvncserver: Easy API to write one's own vnc server
net/tigervnc: High-performance, platform-neutral VNC client/server
net/tightvnc: Display X and Win32 desktops on remote X/Win32/Java displays
net/tightvncviewer: Viewer for remote X and Win32 VNC servers
net/vnc: Display X and Win32 desktops on remote X/Win32/Java displays
net/vncviewer: Viewer for remote X and Win32 VNC servers
net/x2vnc: Multi-console display using X and VNC
wip/realvnc: Display X and Win32 desktops on remote X/Win32/Java displays
wip/vncselector: Tool for managing VNC sessions
x11/x11vnc: VNC server for real X displays
$ pkgfind rdesktop
net/rdesktop: Open-source Remote Desktop Protocol Client
$ pkgfind freerdp
net/freerdp: Free implementation of the Remote Desktop Protocol
$ pkgse realvnc
Version: realvnc-4.2.1
Location: wip//realvnc
Comment: Display X and Win32 desktops on remote X/Win32/Java displays
...
$

TightVNC・TigerVNC

$ su
Password:
# unset PKG_PATH
# cd /usr/pkgsrc/net/tigervnc
# make install clean clean-depends
...
Error
...
# exit
$

 当初、同じVNCソフトウェアである必要があるのかと勘違いしていたこともあり、NetBSDでもFedoraが標準採用しているTigerVNCにしようかと確認、バイナリはなかった為、make installしてみたものの、インストールできるまでに至らず、バイナリもあったTightVNCをインストールしてみることに。

$ sudo pkgin in tightvnc
...
$ ssh hostname
Password:
hostname$ sudo pkgin in tightvnc
hostname$ which tightvncserver <=こんなのない
hostname$ which tightvncviewer <=こんなのもない
hostname$ ls /usr/pkg/bin
...
vncserver
vncviewer
...
hostname$ vncserver :3
hostname$ exit
$ vncviewer :3
...

 最初は、パッケージ名+serverやパッケージ名+viewerというコマンドを想定していたものの、見当たらないのでls /usr/pkg/binを確認するとvncserver、vncviewer他コマンドがあり、manを見るとこれらはVNCソフトウェアのラッパとのこと。

 そこでリモートサーバ側で単にvncserverとしたらdisplayが:1で起動、クライアント側で単にvncviewer hostname:1としたらリモートホスト側のウィンドウマネージャtwm上にxtermが起動し、xtermからgeditやcajaを起動してみると無事、GUI起動しました。

 manで改めて確認してみるとリモートサーバ側でvncserver :diplay_numberとすれば、クライアント側で同じdisplayを指定してvncviewer host_name:diplay_numberのようにできるとあります。

VNCクライアントのTightVNCウィンドウ内でGUI起動したリモートホスト上のCajaベースのデスクトップ
twm上で端末からオプションなしでcajaを起動して表示されたデスクトップ
vncserver:(twm/)NetBSD/デスクトップPC
on vncviewer:Xfce4/NetBSD/ノートPC

 一部アイコンが無地(白地)になっていますが、これは、Cajaのみインストールした結果、ファイルマネージャcajaの起動に伴って表示されたmate-desktopであり、Caja用のアイコンテーマを含め、NetBSDにMATEデスクトップをフルインストールしていない為です。

VNCクライアントのTightVNCウィンドウ内でGUI起動したリモートホスト上のgedit
twm上で端末からgeditを起動
vncserver:(twm/)NetBSD/デスクトップPC
on vncviewer:Xfce4/NetBSD/ノートPC

 また、VNC越しのtwm上で常用しているPlumaがなく、何も考えずにgeditを起動したものの、以前からPlumaやKate、KWrite、Leafpad、Mousepadなどでは正常に機能する一方、geditでは、日本語表示は問題ないのに日本語入力ができない事象があり、scimとの相性かと思っていたら、scimを使う他のNetBSDマシンでは起きないことが判明、今回、これに加えてNetBSD同士のVNC越しだと起動したgeditが英語バージョンとなっており、リモートホスト側で直接操作してみると(通常は日本語バージョンなのに)、やはり、geditが英語バージョンとなってしまい、入力メソッドが落ちたのか、日本語が入力できない状態になり、何れもリモートホスト側については再ログインしたら直る(NetBSDからVNC越しにFedoraを操作、geditを起動すると日本語バージョンでかつ、日本語表示・日本語入力共に正常に機能する)という状況はあるにせよ、起動することは確認できました。

$ ssh hostname
Password:
hostname$ mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
hostname$ ln -s ~/.xinitrc ~/.vnc/xstartup
        または
hostname$ mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
hostname$ vi ~/.vnc/xstartup
#!/bin/sh
 
xrdb $HOME/.Xresources
xsetroot -solid grey
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &
# Could not acquire name on session busエラーの対策
unset DBUS_SESSION_BUS_ADDRESS
#jwm &
gnome-session
#exec gnome-session
#exec startxfce4
hostname$ exit
$

 表示させるデスクトップなどの設定は、初めてvncserverを起動させると生成される~/.vnc/xstartup(.vnc/、xstartup共にパーミッションビットは755等)において設定をすればよいようで当該ファイルを直接編集するか、~/.xinitrcのリンクを張るなどすれば、うまく機能する模様。

 そこで試しに、twm &をコメントアウトしてjwm &としたら若干解像度が合っていないようでスタートメニューやタスクバー部分などはスクロールする必要がありましたが、JWMが起動し、GUI起動はもとより、日本語入力もできるようになりました。

 もし、日本語表示や入力ができない(~/.xinitrcのシムリンクだとうまくいかない、$HOME/.xinitrcなどがうまく読み込めない...etc.)場合には、$HOME/.xinitrcの該当する設定部分を~/.vnc/xstartupに追記するという手もあります。

 が、ここでgnome-session &やstartxfce4 &としてみても、なぜか起動しません。。。ちなみに前者はリモートホスト側で、後者はクライアント側で使っているデスクトップで(前者の結果から、もしかしてクライアントのリソース使ってるのか!?と深読みしてて試しにやってみただけ)、前者だと閉じるボタン付きで[Could not acquire name on session bus]というメッセージのポップアップが表示され、後者だとグレー一色で何も起こる気配がありません。

VNCクライアントのTightVNCウィンドウ内でGUI起動したリモートホスト上のGNOMEデスクトップ
VNCリモートホストをGNOMEで起動
vncserver:(GNOME/)NetBSD/デスクトップPC
on vncviewer:Xfce4/NetBSD/ノートPC

 このメッセージをキーに調べてみるとhttp://mitsuakikawamorita.com/blog/?p=1185のxstartupにその対策として[unset DBUS_SESSION_BUS_ADDRESS]とするとあり、やってみたら、GNOMEが起動、日本語入力も問題なくできるようになりました。(当然ながらリモートホストにインストールされていないxfce4は起動しない。)

 ただ、twmやjwm、Xfce4では問題ないのでGNOME固有(ちなみに試したのはGNOME2)の問題のようですが、[s]と[h]がショートカットキーとなっているようで前者ではメニューが開き、後者では開いたソフトウェア画面がタスクバーにしまわれてしまうという状況でキーバインド・キーマップが変。。。この2つのキーは意外と重要であれもこれもできなくなってしまう。。。XKL_XMODMAP_DISABLE=1なども試してみましたが、解決に至らず、調べてもよくわかりませんでした。

VNCクライアントのTightVNCウィンドウ内でGUI起動したリモートホスト上のXfce4デスクトップ
VNCリモートホストをXfce4で起動
vncserver:(Xfce4/)NetBSD/ノートPC
on vncviewer:GNOME/NetBSD/デスクトップPC

 ちなみに検証時、無線LAN接続しているノートパソコン/NetBSD上のXfce4にはxfce4-netload-pluginやxfce4-wavelan-pluginを入れているのですが、VNCクライアント上のXfce4でも受信感度や送受信サイズをリアルタイムで確認でき、VNC接続におけるデータの送受信があるようで何もしていなくても受信が1〜2KiB、送信が22KiB前後でひっきりなしに通信が行なわれています。

$ ssh hostname
Password:
hostname$ vncserver :5 -geometry 800x600
hostname$ exit
$ vncviewer :5
...
$ ssh hostname
Password:
hostname$ vncserver -kill :5
hostname$ exit
$

 先の画像では、解像度が若干あっていないのでスクロールバーが表示されていますが、例えば、コマンドライン上でvncserver :display_num -geometry WIDTHxHEIGHTとすれば、任意の解像度を指定することができ、起動したvncserverを終了するには、リモートホスト側でvncserver -kill :display_numとします。

 尚、-geometryで解像度を指定してVNCサーバを起動、vncviewer側で何らかのソフトウェアを開いたり、編集し、VNCを終了した後、リモートホスト側で先に開いたソフトウェアを起動すると(リモートホストのモニタの実際の解像度と-geometry指定したVNCの解像度が異なる場合、顕著にわかるが、)VNCで-geometry指定したサイズになっていたりします。

 ちなみにvncviewer側では、サウンドの出力はできず、一方、YouTubeやGyao!などの動画は再生できる(音声は出ない)ものの、カクカクしたり、スローモーション状態になったりします。

TightVNCのvncserverで起動したNetBSDをFedora上のTigerVNCのvncviewerで表示
NetBSD上でvncserver(TightVNC)を起動
Feodra上のvncviewer(TigerVNC)で表示
vncserver:(JWM/)NetBSD/ノートPC
on vncviewer:LXDE/Fedora/デスクトップPC

 また、この例は、NetBSD上でウィンドウマネージャをJWMとしてTightVNCのvncserverを起動し、Fedora上で、TightVNCの派生であるTigerVNCのvncviewerでリモート表示したものですが、OSの違いはもとより、リモートでGUI操作する為の通信プロトコルRFB/Remote FrameBufferを使ったものであれば、このようにリモートホスト側とローカル側で必ず同一のソフトウェアを使わなくてもリモート操作可能となっています。

TigerVNCのvncserverで起動したFedoraをNetBSD上のTightVNCのvncviewerで表示
Feodra上でvncserver(TigerVNC)を起動
NetBSD上のvncviewer(TightVNC)で表示
vncserver:(Xfce4/)Fedora/デスクトップPC
on vncviewer:Xfce4/NetBSD/ノートPC

 FedoraのTigerVNCサーバ、NetBSDのTightVNCクライアントだとなんでできないんだ。。。と思っていたら、後述のSSHポートフォワーディングでその必要もなくなったものの、vncserverを直接起動させている時点では、Fedora上のファイアウォールでブロックされていただけでファイアウォール設定でvncを通したらできました。

 *BSD/PC-UNIX/Linux上のVNCサーバにMac OS XやWindowsをVNCクライアントとすることもできる一方、サーバライセンスが必要になる模様もWindowsをVNCサーバとする場合には、Windows固有のRDP/Remote Desktop Protocolを使ったVNCサーバ用のUNIX系用VNCクライアントとしてrdesktopや、その派生であるFreeRDPがあり、これらもNetBSDのリポジトリにあります。

 これらに加えてNetBSDのリポジトリには、gtkベースの簡易GUIパネルやフロントエンド、VNCセッションをflash動画として記録するソフトウェアなどもあります。

 当初、遠隔ユーザーサポートしかイメージしていなかったのでリモートデスクトップって。。。と思っており、今回のようにリモートホストの物理モニタ上に表示されているデスクトップとは別のデスクトップを使って利用できるなんて思いもよりませんでしたが、単に自身の理解不足により様々な利用シーンをイメージできていなかっただけでssh(トンネル)も使えますし(というか使うべきですが)、ここまでできるとビジネスシーンだけでなく、パーソナルユースでも結構便利だと今更ながら思うに至った今となってはSSHポートフォワードを使って頻繁に利用しています。

SSHトンネル/ポートフォワーディング

 SSHトンネル(ポートフォワード・ポートフォワーディング)とは、IPv4プロトコルにおいて通信が暗号化されない任意のサービスを通信が暗号化されるSSHを通して利用することで安全性を高めることができる機能で、その場合、SSHで通信できる状態であれば、SSHのポートを使って通信が行なわれる為、ポートフォワードによってSSHを通したいサービスのポート自体は開ける必要がないという副産物もあります。

 当然のことながら、あらかじめ、VNCサーバを起動しておきます。

[NetBSDの場合。。。例えば、シンプルに]
$ vncserver :3
...
$
(他にinetdやスクリプト書いて/etc/rc.dに置いておくとかもアリかも)

 SSHを介す方法は、リモートホスト側から、ローカルホスト側から、更にその指定によって、一通りではありませんが、例えば、次のようにするだけです。

 そして端末からVNCクライアントとするローカルホスト上でsshコマンドをローカルの空きポートとリモートホストのVNCサーバ用のポートを1つのコロン区切りで紐付けて実行させておきます。

localhost $ ssh -N -l username -L local_port:remote_host_ip_address:remote_host_port remote_host_ip_address
Password:
 
TightVNCの例
localhost $ ssh -N -l username -L 49200:192.168.0.2:5501 192.168.0.2
Password:
 
TigerVNCの例
localhost $ ssh -N -l username -L 49200:192.168.0.2:5901 192.168.0.2
Password:

 この[-N]スイッチは、SSH2で利用可能な「遠隔操作を実行しない」指定であり、結果、リモートホストにログインもせず、VNCサーバがマシンの起動と同時に有効かつ起動している場合などに最適なオプションで、もし、VNCサーバが起動していない場合には、このスイッチを指定せずにログイン後にVNCサーバを起動させた状態にして下記の操作へ、また、サーバマシン・クライアントマシン共にユーザー名が同名なら[-l username]は省略可能、名前解決済みならIPアドレス部は、ホスト名でも可です。

 尚、標準のListenポートは、NetBSDのmanによるとTightVNCが5500+1~、FedoraのmanによるとTigerVNCが5900+1~となっていますが、NetBSDのTightVNC同士でポートフォワーディングせずにvncserver/vncviewerを実行するとポート番号は5901〜でないと機能しないのでNetBSDのman TightVNCの誤記?のようです。

 次に同じくVNCクライアントとなるローカルホストで別途端末を開いてvncviewerで先ほど紐付けたローカルホスト(自マシンで自マシン)のポートを指定します。(この場合、ssh実行も指定ポートもVNCサーバ側でないことに注意。)

localhost $ vncviewer localhost:local_port
Password:
...
例えば。。。
localhost $ vncviewer localhost:49200
Password:

 これでリモート画面が表示されれば、通信内容が暗号化されているので、より安全にリモート操作できるようになります。

 終了させる場合には、sshを実行中の端末で[Ctrl]+[c]とします。

ホーム前へ次へ