参考メモ/CentOS7にSSH越しでVNC接続してみる

[参考メモ/minimal installしたCentOS7にXfce4 + ibus-kkcで日本語入力可能にする](http://qiita.com/msakamoto_sf/items/bf2e37b22ae6694440c3) でXfce4 + ibus-kkcを入れてみましたが、VNCも試してみました。

ちなみに、VNCって結局、ログイン状態で画面がたちがるんですね。グラフィカルログイン画面の状態からVNCで接続できて、そこから好きなユーザでログインできる・・・ようには、簡単にはできないようです。（今回軽くググッたところでは、そこまで言及してる記事がすぐには見つからなかった）
なので、今回の実験でも、systemctlの設定ファイル中に「どのユーザで起動する」という情報を埋め込んで、最初からそのユーザで起動して専用の画面で待ち受ける、というような仕組みになってます。VNCクライアントで接続すると、最初からそのユーザでXが起動済みの画面が見えるイメージです。

```
検証環境：
VirtualBox ホスト : Windows 10 64bit
VirtualBox : 5.0.16
VirtualBox ゲスト : CentOS Linux release 7.2.1511 (Core)
```

今回は短いので先に参考記事のURL : 

- [CentOS 7でVNCサーバを構築してみた - Qiita](http://qiita.com/tanuki-project/items/2496339d204b9646f36c)
  - http://qiita.com/tanuki-project/items/2496339d204b9646f36c
- [CentOS 7にVNCサーバをインストールする | 俺的備忘録 〜なんかいろいろ〜](http://orebibou.com/2014/12/centos-7%E3%81%ABvnc%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)
  - http://orebibou.com/2014/12/centos-7%E3%81%ABvnc%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/
- [ServersMan@VPS（CentOS7）　VNCでリモートデスクトップとWindows/AndroidでSSHポートフォワード方法](http://hikaku-server.com/rentalserver/entry498.html)
  - http://hikaku-server.com/rentalserver/entry498.html

## VNC Serverのインストール

CentOS7 で `yum search vnc` してみたところ、普通に使える VNC Server としては `tigervnc-server` パッケージが提供されてるようです。
検索で見つかる記事によっては、 `yum install vnc-server` としてますが、試したところ結局 `yum install tigervnc-server` と同じパッケージがインストールされます。
なので今回は素直に `yum install tigervnc-server` します。

```
# yum install -y tigervnc-server
-> tigervnc-server, tigervnc-license, tigervnc-server-minimal パッケージがインストールされます。

# rpm -ql tigervnc-server
/etc/sysconfig/vncservers
/usr/bin/vncserver
/usr/bin/x0vncserver
/usr/lib/systemd/system/vncserver@.service
/usr/share/man/man1/vncserver.1.gz
/usr/share/man/man1/x0vncserver.1.gz

# rpm -ql tigervnc-license
/usr/share/doc/tigervnc-1.3.1/LICENCE.TXT

# rpm -ql tigervnc-server-minimal
/usr/bin/Xvnc
/usr/bin/vncconfig
/usr/bin/vncpasswd
/usr/share/man/man1/Xvnc.1.gz
/usr/share/man/man1/vncconfig.1.gz
/usr/share/man/man1/vncpasswd.1.gz
```

コンパクトなので、ファイルを漁ってみますと `/usr/lib/systemd/system/vncserver@.service` にVNC Serverをsystemctlで起動して管理するやり方が書いてありました。
内容は見ればわかりますので省略します。
とりあえずその内容に従い以下のように作業しました。

```
（画面番号1番 -> TCP 5901 番でlistenするよう、"@:1" にしてコピー
# cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service

（VNC Serverを動かしたいユーザ名で、ファイル内の "<USER>" という部分を書き換える）
# vi /etc/systemd/system/vncserver\@\:1.service

# systemctl daemon-reload
# systemctl enable vncserver@:1
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@:1.service.
# systemctl restart vncserver@:1
Job for vncserver@:1.service failed because the control process exited with error code. See "systemctl status vncserver@:1.service" and "journalctl -xe" for details.
```

失敗してしまいました・・・。

```
# journalctl -xe
(...)
Mar 12 20:43:13 localhost.localdomain runuser[2772]: Warning: localhost.localdomain:1 is taken because of /tmp/.X11-unix/X1
Mar 12 20:43:13 localhost.localdomain runuser[2772]: Remove this file if there is no X server localhost.localdomain:1
Mar 12 20:43:13 localhost.localdomain runuser[2772]: A VNC server is already running as :1
(...)
```

":1"はすでに使われてるよ、と出てます。そういえばこのVM、すでにグラフィカルログインでXが起動してるので、それで使用済みになってるんでしょう。
なので、":2"になるようにします。

```
（まずは "@:1" での登録を外す）
# systemctl disable vncserver@:1
Removed symlink /etc/systemd/system/multi-user.target.wants/vncserver@:1.service.

（ファイル名を "@:2" にリネーム）
# mv /etc/systemd/system/vncserver\@\:1.service /etc/systemd/system/vncserver\@\:2.service 

# systemctl daemon-reload
# systemctl enable vncserver@:2
# systemctl restart vncserver@:2
# systemctl status vncserver@:2
● vncserver@:2.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@:2.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2016-03-12 20:47:34 JST; 6s ago
  Process: 2950 ExecStart=/usr/sbin/runuser -l msakamoto -c /usr/bin/vncserver %i (code=exited, status=0/SUCCESS)
  Process: 2946 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 2992 (Xvnc)
   CGroup: /system.slice/system-vncserver.slice/vncserver@:2.service
           ‣ 2992 /usr/bin/Xvnc :2 -desktop localhost.localdomain:2 (msakamoto) -auth /home/msakamoto/.Xauthority -geometry 1024x768 -rfbwait 30000 -rfbauth /home/msakamoto/.vnc/passwd -rfbport 5902 -fp catalogue:/etc/X11/fontpath.d -...
```

今度は正常に起動しました。`ss -tanp` で確認すると、TCP 5902 番をVNC ServerがlistenしてましたのでOKです。

## VNC Passwordの設定

設定ファイルに埋め込んだユーザでログインして、

```
$ vncpasswd
```

で設定します。そのユーザの `$HOME/.vnc/passwd` に保存されます。（暗号化されてるのかわかりませんが、平文では保存されてなかったです）

## UltraVNCでの接続

VirtualBoxホストのWindows 10 64bit からVNCで接続します。クライアントとしてはUltraVNCを使ってみました。

- [UltraVNC VNC, Remote Access, Support Software, Remote Desktop Control Free Opensource](http://www.uvnc.com/)
  - http://www.uvnc.com/
- [UltraVNC - 窓の杜ライブラリ](http://www.forest.impress.co.jp/library/software/ultravnc/)
  - http://www.forest.impress.co.jp/library/software/ultravnc/
- [UltraVNCの描画設定を変更してレスポンスを向上させる － ＠IT](http://www.atmarkit.co.jp/fwin2k/win2ktips/937vncexp/vncexp.html)
  - http://www.atmarkit.co.jp/fwin2k/win2ktips/937vncexp/vncexp.html

インストールしたら、"UltraVNC Viewer" を起動し、画面番号2番のTCPポート番号5902なので "IPアドレス:2" に接続します。
無事接続できたら、単にXとVNC用のツールが起動しただけのそっけない画面が表示されるはずです。（あと、なぜかfirefoxも起動してました）

## VNCからXfce4を使う

一度VNCを起動すれば、`$HOME/.vnc/xstartup` にデフォルトの起動スクリプトが生成されます。これをカスタマイズしてVNC Serverを再起動すれば、好きなDesktop環境やWindow ManagerをVNCから使えます。
今回はXfce4を起動するようにします。

```bash:~/.vnc/xstartup(デフォルト)
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec /etc/X11/xinit/xinitrc
```
→

```bash:~/.vnc/xstartup
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#exec /etc/X11/xinit/xinitrc

#すでにXfce4 + ibus-kkcのグラフィカルログイン実験により、起動済みだったので入れなくて良いかも。
#ibus-daemon -drx
exec /usr/bin/xfce4-session
```

この後 `systemctl restart vncserver@:2` した後UltraVNCから接続してみたのですが・・・やっぱりモタツキました・・・。

## SSH越しにVNC接続

まずfirewalldを入れてVNCに接続できなくします。

```
# yum install -y firewalld

# systemctl enable firewalld
# systemctl start firewalld
# firewall-cmd --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

# firewall-cmd --get-services
... vnc-server ...

# rpm -qf /usr/lib/firewalld/services/vnc-server.xml
firewalld-0.3.9-14.el7.noarch

# cat /usr/lib/firewalld/services/vnc-server.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Virtual Network Computing Server (VNC)</short>
  <description>A VNC server provides an external accessible X session. Enable this option if you plan to provide a VNC server with direct access. The access will be possible for displays :0 to :3. If you plan to provide access with SSH,
do not open this option and use the via option of the VNC viewer.</description>
  <port protocol="tcp" port="5900-5903"/>
</service>
```

firewalldの方に最初からVNCサーバ向けのサービス設定が含まれてたようです。でも、今はデフォルトの、OFFのままなので、これでUltraVNCで接続しようとすると、接続できません。
そこで、`/usr/lib/systemd/system/vncserver@.service` を参考にSSHのポートフォワーディングをしてみます。
私はたまたまCygwin使いで、VirtualBoxホストのWin10にcygwinでOpenSSHのsshコマンド入れてましたので、win10上のTCP5903番を、VNCサーバが起動してるVM中の5902番につなげてみます。

```
（Win10上から）
$ ssh -C -L 5903:localhost:5902 xxx@(VNCサーバが起動してるゲストVMのIP)
```

これで、UltraVNCで "IPアドレス::5903" (TCPポート番号で指定するときは、コロンが2つ) に接続してみますと、接続成功です。
心なしか、反応も直接接続よりは速い感じがします。

## でも結局・・・

結局、SSH越しでも直接でも、やっぱり反応が遅いですし、日本語入力もうまくいきませんでした。（"Option" -> "Mouse and Keyboard" の "Japanese keyboard"にチェックいれても半角/全角でのIME切り替えが動かなかった。)

そのため、あんまり使えないかなぁ・・・という感じで、実験は終了です。（VNCクライアントの問題かなぁ・・・）

EC2上のminimal CentOS7 イメージにVNCできれば面白いかな～と思ってたんですが、ちょっと厳しいかも？

```
# systemctl disable vncserver@:2
```

無効化して、今回の実験は終了します。