CentOS8.2にVNCサーバーをセットアップする手順

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---

（注）CentOS8.3にupdateすると、vncserverのセットアップの手順は変更になっている。CentOS8.3の場合には、[CentOS8.3にVNCサーバーをセットアップする手順](https://qiita.com/taconana/items/8a9b07ea686d68587281)の記事に遷移のこと。

VPSサーバー（CentOS8.2）にGNOMEとtigervnc-serverをインストールし、WindowsPCからVNCViewerで接続するためのセットアップを行った。vncserverの起動自体は容易であったが、その最後の手順としてvncserverをサービス登録して自動で起動されるように設定する際に結構悩まされた。例えば、以下のような「vncserver@:1.service: Start operation timed out. Terminating.」のエラーが出ることがあった。解決した手順を示しておく。

```bash

$ systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: failed (Result: timeout) since Mon 2020-11-23 17:39:24 JST; 6min ago
  Process: 1067 ExecStart=/usr/bin/vncserver_wrapper taconana :1 (code=exited, status=0/SUCCESS)
  Process: 1030 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)

17:37:47 xxx.com systemd[1]: Starting Remote desktop service (VNC)...
17:37:53 xxx.com vncserver_wrapper[1067]: New 'xxx.com:1 (taconana)' desktop is xxx>
17:37:53 xxx.com vncserver_wrapper[1067]: Starting applications specified in /home/taconana/.vnc/xstartup
17:37:53 xxx.com vncserver_wrapper[1067]: Log file is /home/taconana/.vnc/xxx.com:1.log
17:37:58 xxx.com vncserver_wrapper[1067]: 'vncserver :1' has PID 1248, waiting until it exits
17:39:19 xxx.com systemd[1]: vncserver@:1.service: Start operation timed out. Terminating.
17:39:19 xxx.com vncserver_wrapper[1067]: Terminated
17:39:24 xxx.com vncserver_wrapper[1067]: PID 1248 exited, exiting ...
17:39:24 xxx.com systemd[1]: vncserver@:1.service: Failed with result 'timeout'.
17:39:24 xxx.com systemd[1]: Failed to start Remote desktop service (VNC).
```
   
## UltraVNCViewerのインストール

Windows側クライアントとして、UltraVNCViewer使う。UltraVnc_1240_X64.msi（Windows 64bit用）をダウンロードしてをインストールする。UltraVNCには、ServerとClient(=Viewer)が同梱されているので、インストール時にはServerを除外すること。


## GNOMEのインストール

GNOMEとIMEのインストールを次のように行う。以前はグループが`GNOME Desktop`であったが、`GNOME`に変更になっている。hidden指定でないとyumで一覧されない。700個くらいのパッケージがインストールされる。インストール後、ターゲット(ランレベル)を確認しておく。multi-user.targetのままでよい。graphical.targetに変更しない方がよい。

```bash

$ yum grouplist hidden
$ yum groups install GNOME -y
$ yum groups install "Input Methods" -y
$ systemctl get-default
multi-user.target
```

## tigervnc-serverのインストール

tigervnc-serverをインストールする。そして、vnc-serverをサービスとしてFirewallに追加する。5901/tcpのポートは明示的に開放する必要はないようだ。add-portすると`ports:`のところに並ぶが、なくても動作する。

```bash

$ yum -y install tigervnc-server
$ # firewall-cmd --add-port=5901/tcp --permanent 
$ # firewall-cmd --remove-port=5901/tcp --permanent 
$ firewall-cmd --add-service=vnc-server --permanent --zone=public
$ firewall-cmd --reload
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh vnc-server
  ports:
  protocols:
```

## vncserverの初回の動作確認

以降は、`taconana`というユーザーが5901ポートでVNCサーバーに接続するという前提で説明する。単一のユーザーで単一のポートのみとする。複数ユーザーで複数ポートを利用するには、同じ操作をユーザーの数だけで繰り返す。VNCサーバーは非常にメモリを消費する。私の環境で確認したところ、vncserverを1つ起動するだけでおよそ500MBを消費していた。このメモリ消費は、VNCで接続しているかどうかではなく、VNCサーバーとして起動しているかどうかで決まる。なので、使うかどうかわからないようなユーザーでのVNCサーバーは起動しない方がよい。

```bash

$ su - taconana
$ vncpasswd
Password: ***
Verify: ***
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
```

利用するユーザーには、ハイフンありで su（switch user）すること。ハイフンなしだと、/homeのユーザー配下の.bashrcが実行されず、環境変数の設定が切り替わらない。VNC用のパスワードを設定する。パスワードは9文字以上だとUltraVNCViewerで接続時にbeep音が鳴るが、問題はない。view-onlyかの問いには、`n`を入力すること。

vncserverを起動してみる。引数なしだと、ディスプレイ番号は自動でインクリメントされる。初回は`:1`になる。解像度は初期設定で 800x600 になる。

```bash

$ vncserver
New xxx.com:1 (taconana)' desktop is xxx.com:1
Creating default startup script /home/taconana/.vnc/xstartup
Creating default config /home/taconana/.vnc/config
Starting applications specified in /home/taconana/.vnc/xstartup
Log file is /home/taconana/.vnc/xxx.com:1.log
```

ディスプレイ番号`:1`は、ポート番号5901に対応する。5900をプラスした値がポート番号になる。ディスプレイ番号は:1から:5まで有効であり、対応するポート番号は5901から5905である。Windows側からUltraVNCViewerで接続してみる。IPアドレスとポート5901を指定して、vncpasswdで設定したユーザーとパスワードで接続する。

GNOMEの画面が開いたら、IMEなどの初期設定をしておく。ユーザーごとの設定である。

- Welcome＝日本語、入力＝日本語(かな漢字)、プライバシー＝OFF、オンラインアカウントの接続＝スキップする。
- アクティビティ→端末が開くことを確認しておこう。
- アクティビティ→アプリケーション→テキストエディタを開いて、日本語入力できることを確認しておこう。
- IMEの切り替えは、Superキー(Windowsの旗のキー)＋スペースキーで行う。
- 日本語化すると、ホームディレクトリの配下に「デスクトップ、ダウンロード、...」といったディレクトリが作られる。英語にしたい場合は、端末を開いて、`LANG=C xdg-user-dirs-gtk-update`でダイアログを開いて変更できるそうだ。

## vncserverの再起動の確認

UltraVNCViewerを一旦クローズして、解像度を 1360x768 に変更して、再接続を試してみたい。やり直すときは、一旦プロセスをkillしてから実行する必要がある。この操作は、rootではなく、suで切り替わったユーザーごとにチェックして、操作する必要がある。UltraVNCViewerから再接続すると、解像度は 1360x768 になっているはずだ。

```bash

$ # su - taconana		# rootにいるなら、suしてから操作のこと
$ vncserver -list
$ vncserver -kill :1
$ vncserver :1 -geometry 1360x768
```


##VNCサーバーのサービス登録

VNCサーバーは利用したいとき、都度、vncserverコマンドで起動したり、killしたりできる。サーバーを再起動した場合には、TeraTermなどで利用したいユーザーにsuして、vncserverを起動した後で、Windows側からUltraVNCViewerで接続することになる。この操作をサーバーの再起動のたびに行うのは面倒なので、vncserverの起動をサービスに登録しておき、サーバーの再起動時に自動で実行してくれるようにする。

CentOS8では、systemctlを使ってサービス登録する。rootで作業する。テンプレートをコピーしてvncserver@:1.serviceを作成し、サービス登録する。
名前に`:1`が含まれているが、名前は何でもよい。慣習的にディスプレイ番号:1を添えているようだ。ポート5901を使用するものは、一般に`vncserver@:1.service`とする。

```bash

$ su -
$ cp -p /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
$ vi /etc/systemd/system/vncserver@:1.service
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
User=taconana
Group=taconana
PIDFile=/home/taconana/.vnc/%H%i.pid
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target

$ vi /home/taconana/.vnc/xstartup		# 確認のみしておこう
$ vi /home/taconana/.vnc/config			# 解像度を変更する
geometry 1360x768

$ systemctl daemon-reload
$ systemctl enable vncserver@:1.service
$ systemctl start vncserver@:1.service
$ systemctl status vncserver@:1.service	
```

ポイントは、`User=taconana`、`Group=taconana`、`ExecStart=/usr/bin/vncserver %i`の記述である。ExecStartの記述方法にはいろいろあるが、シンプルに`vncserver %i`のみにする。そして、解像度の指定は、/home/taconana/.vnc/configに記述するようにする。解像度を指定する方法もいくつかあるが、ユーザーごとに設定できるのでconfigファイルに記述するのが正しいだろう。

## vncserver起動に成功した場合

vncserverの起動に成功すると、ステータスは以下の感じになり、Xvncのプロセスが生成される。以下の例では、PID=2885でプロセスが生成されている。また、ロック情報が /tmp 配下に生成されている。/tmp/.X11-unix/X1と/tmp/.X1-lockの2つのファイルである。X1の1はディスプレイ番号である。上記のvncserver@:1.serviceの中にも「# Clean any existing files in /tmp/.X11-unix environment」と記述されている。これは起動に失敗した場合に、ロック情報も消しなさいという意図と思われる。

```bash

$ systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-23 18:29:57 JST; 16h ago
  Process: 2878 ExecStart=/usr/bin/vncserver :1 (code=exited, status=0/SUCCESS)
  Process: 2871 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 2885 (Xvnc)
    Tasks: 245 (limit: 24989)
   Memory: 499.9M
   
$ ps ax | grep vnc
   2885 ?        Sl     0:00 /usr/bin/Xvnc :1 -geometry 1360x768 -auth /home/taconana/.Xauthority
    -desktop xxx.com:1 (taconana) -fp catalogue:/etc/X11/fontpath.d -pn 
    -rfbauth /home/taconana/.vnc/passwd -rfbport 5901 -rfbwait 30000
   2898 ?        S      0:00 /bin/sh /home/taconana/.vnc/xstartup
  13923 pts/0    S+     0:00 grep --color=auto vnc
  
$ netstat -tanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      2885/Xvnc
tcp6       0      0 :::5901                 :::*                    LISTEN      2885/Xvnc

$ ls -lag /tmp/.X*
-r--r--r-- 1 taconana   11 11月 23 18:29 /tmp/.X1-lock
/tmp/.X11-unix:
srwxrwxrwx  1 taconana    0 11月 23 18:29 X1

$ su - taconana
$ vncserver -list
TigerVNC server sessions:
X DISPLAY #     PROCESS ID
:1              2885
```

## vncserver起動に失敗した場合

vncserverの起動に失敗した場合は、vncserver@:1.serviceを修正してやり直すことになるが、その際にはプロセスとロックの残骸をクリアして、再実行する必要がある。残骸が残ったままvncserverを実行すると、vncserverのもともとの機能により、自動でインクリメントされたディスプレイ番号になってしまう。:1で生成したいのに、:2となる。5901ポートにしたいのに5902ポートになってしまう。何を削除し、何を確認すればよいかは、前述の「vncserver起動に成功した場合」から推測できる。

```bash

# 古いプロセスをディスプレイ番号を指定してkillする。
$ su - taconana
$ vncserver -list
$ vncserver -kill :1		# 他のディスプレイ番号もあればすべてkillする。

# それでも古いプロセスが残っていれば、強制的にプロセスをkillする。
$ ps ax | grep vnc
  34437 ?        Sl     0:01 /usr/bin/Xvnc :1 -auth /home/taconana/.Xauthority -desktop maguro.osakana.com:1 (taconana) 
  -fp catalogue:/etc/X11/fontpath.d -geometry 1360x768 -pn -rfbauth /home/taconana/.vnc/passwd 
  -rfbport 5901 -rfbwait 30000
  34450 ?        S      0:00 /bin/sh /home/taconana/.vnc/xstartup
  35944 pts/1    T      0:00 systemctl status vncserver@:1.service
  38482 pts/1    S+     0:00 grep --color=auto vnc
$ kill -9 34437
$ netstat -tanp
Proto Recv-Q Send-Q Local Address Foreign Address        State       PID/Program name
tcp        0      0 0.0.0.0:5901   0.0.0.0:*               LISTEN      9274/Xvnc
tcp6       0      0 :::5901         :::*                    LISTEN      9274/Xvnc> vi
$ kill -9 9274

# ロックが残っている可能性があるので、削除する。
$ ls -lag /tmp/.X*
$ rm -f /tmp/.X%-lock
$ rm -f /tmp/.X11-unix/X%

# vncserver@:1.serviceを編集後、再度起動を試行する。
$ su root
$ systemctl start vncserver@:1.service
$ systemctl status vncserver@:1.service
```

## 複数ユーザーでVNCサーバー利用

複数ユーザーでVNCサーバーを利用する場合、vncserver@:1.serviceをコピーして、例えばvncserver@:2.serviceを作成して同様にsystemctlでstartさせればよい。ただし、繰り返しになるが、vncserverは非常にメモリを消費するので、不要なアカウントを追加しない方がよい。

また、複数ユーザーを扱う場合、/etc/sysconfig/vncserversファイルにアカウントごとに引数（解像度など）を定義し、/etc/init.d/vncserver でまとめて起動することもできる。この手順については、もはや必要ないと思われる。

以上

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---