参考メモ/minimal installしたCentOS7にXfce4 + ibus-kkcで日本語入力可能にする で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
- CentOS 7にVNCサーバをインストールする | 俺的備忘録 〜なんかいろいろ〜
- ServersMan@VPS(CentOS7) VNCでリモートデスクトップとWindows/AndroidでSSHポートフォワード方法
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
- UltraVNC - 窓の杜ライブラリ
- UltraVNCの描画設定を変更してレスポンスを向上させる - @IT
インストールしたら、"UltraVNC Viewer" を起動し、画面番号2番のTCPポート番号5902なので "IPアドレス:2" に接続します。
無事接続できたら、単にXとVNC用のツールが起動しただけのそっけない画面が表示されるはずです。(あと、なぜかfirefoxも起動してました)
VNCからXfce4を使う
一度VNCを起動すれば、$HOME/.vnc/xstartup
にデフォルトの起動スクリプトが生成されます。これをカスタマイズしてVNC Serverを再起動すれば、好きなDesktop環境やWindow ManagerをVNCから使えます。
今回はXfce4を起動するようにします。
# !/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec /etc/X11/xinit/xinitrc
→
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
無効化して、今回の実験は終了します。