VNCサーバの設定方法



●VNCサーバの設定(CentOS Stream 9)

 参考URL:VNC サーバーの設定

 ユーザ個別にVNCを起動する方法もあります(「●VNCサーバの起動及び停止」)。
 また、VNC接続後、ログイン直後に固まる(ログイン受付後反応しなくなる)等について、下記のとおり対処方法を記載(xstartup記載内容の変更による対処)しています。
 Fedora 20でのxstartup記載内容
 Fedora 25でのxstartup記載内容
 Red Hat Linux 7.5でのxstartup記載内容
 Rocky Linux 9でのxstartup記載内容

 VNCサーバをインストールします。
# dnf install tigervnc-server -y
 Firewalldを有効にしている場合、VNCサービスを許可します。
# firewall-cmd --add-service=vnc-server
success
# firewall-cmd --runtime-to-permanent
success
 TigerVNCをSystemd Unitで起動する場合、下記のように設定します。なお、VNC環境は各ユーザで設定する必要があります。Systemdサービス自体はroot権限で起動します。
各ユーザごとに実施
$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n

新規作成
$ vi ~/.vnc/config
session=gnome
securitytypes=vncauth,tlsvnc
geometry=1400x1050

$ sudo systemctl start vncserver@user1:2
[sudo] user1 のパスワード:
 接続し、パスワードを入力します。デスクトップ画面で何かしらの操作をすると下記のようなウィンドウが表示されエラーとなってしまします。
 ※2022年2月2日現在、問題の解消に至っていません。

vnc.-server-non-conn.png

 「ログアウト」とすると、VNCサービスが必ず異常終了してしまします。
 再度、VNCサービスを利用するにはサービスを起動する必要があります。


 root権限でVNCの利用(ディスプレイ番号=ユーザ名) を定義して、Systemd Unitを起動するには下記のように設定します。
# vi /etc/tigervnc/vncserver.users
# TigerVNC User assignment
#
# This file assigns users to specific VNC display numbers.
# The syntax is <display>=<username>. E.g.:
#
# :2=andrew
# :3=lisa
:1=user1

# systemctl enable --now vncserver@:1
 この方法ではリモートでVNC接続でき、ログイン後の操作も正常に動作しました。
 ただし、VNCで接続した状態(ログアウトしたままの状態)で直接コンソール画面からログインしようとすると、真っ黒な画面のまま表示されませんでした。
 これを解消するには、VNC接続している画面でログアウトする必要があります(VNCサービスが異常終了します)。
 こちらの方法でも、再度、VNCサービスを利用するにはサービスを起動する必要があります。
 また、コンソール画面でログイン中はVNCサービスを起動することができません。
 したがって、root権限でVNCの利用する場合、全ユーザはログアウトする必要があります。

●VNCサーバをCentOS 8.3にインストールする

 参考URL:CentOS8.3でVNCサーバをセットアップする手順

 CentOSを8.3にアップデートするとvncserverが従来の手順で使えなくなるらしいので、下記のようにrootで1回だけ設定します。
$ su -
# echo "session=gnome" >> /etc/tigervnc/vncserver-config-defaults
# restorecon /usr/sbin/vncsession /usr/libexec/vncsession-start
 利用するユーザーとディスプレイ番号は、以下のファイルに記述します。以下の例では、testuserというユーザでディスプレイ番号は:2とします。
$ vi /etc/tigervnc/vncserver.users
:2=testuser
 各ユーザーごとにconfigファイルを編集します。そして、パスワードも設定します。
$ su - testuser
$ restorecon -RFv /home/testuser/.vnc

$ vi /home/testuser/.vnc/config
# session=gnome                 # vncserver-config-defaultsに設定されていれば不要
# securitytypes=vncauth,tlsvnc
# desktop=sandbox
geometry=1360x768               # これは任意に
# localhost
# alwaysshared

$ vncpasswd                     # パスワード設定
Password: ***
Verify: ***
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
 rootに戻ってサービスを開始します。
※ディスプレイ番号に対応したサービスを起動します。
# cp -p /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:2.service
# systemctl daemon-reload
# systemctl enable --now vncserver@shiba:2
# systemctl status vncserver@:2

Firewallを利用している場合、下記を実行
# firewall-cmd --add-service=vnc-server --permanent
# firewall-cmd --reload
 複数ユーザーで複数のディスプレイ番号を使用する場合は、vncserver@:2.serviceをコピーして、例えば、vncserver@:3.serviceを作成して起動する。

●VNCサーバのインストール

 VNCサーバをインストールします。
Fedora 10までの場合
# yum install vnc-server
Fedora 11の場合
# yum -y install tigervnc-server
# chkconfig --add vncserver ← 機動スクリプトとして追加
# chkconfig --list vncserver ← 追加されたか確認
vncserver       0:off   1:off   2:off   3:off   4:off   5:off   6:off
# chkconfig vncserver on ← 自動起動設定
# chkconfig --list vncserver ← 自動起動状態確認
vncserver       0:off   1:off   2:on    3:on    4:on    5:on    6:off

●VNCサーバの設定(旧手法)

# vi /etc/sysconfig/vncservers
下記のように記載します。
VNCSERVERS="1:root 2:user1"
VNCSERVERARGS[1]="-geometry 1024x768 -depth 24 -nolisten tcp -nohttpd"
  ↑ ユーザごとに追加
VNCSERVERARGS[2]="-geometry 1024x768 -depth 24 -nolisten tcp -nohttpd"
  ↑ ユーザごとに追加
Fedora 11の場合
VNCSERVERARGS[1]="-geometry 1024x768 -depth 24 -nolisten tcp" ← ユーザごとに追加

●VNCサーバの設定(新手法)
# vi /etc/systemd/system/vncserver@.service
下記のように記載します。
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=simple
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :$(echo %I | cut -f2 -d:) >/dev/null 2>&1 || :'
ExecStart=/bin/sh -c '/sbin/runuser -l $(echo %I | cut -f1 -d:) -c "/usr/bin/vncserver -fg -geometry 1680x1050 :$(echo %I | cut -f2 -d:)" || :'
ExecStop=/bin/sh -c '/sbin/runuser -l $(echo %I | cut -f1 -d:) -c "/usr/bin/vncserver -kill :$(echo %I | cut -f2 -d:)" || :'
[Install]
WantedBy=multi-user.target

●VNC用パスワードの設定(ユーザごとに設定)

パスワードを設定したいユーザでログインします。
# vncpasswd
または
$ vncpasswd
password: xxxxxxxx
verify: xxxxxxxx
設定したパスワードは、各ユーザのホームディレクトリ下の .vnc の下に作成されます。

●ウィンドウマネージャの変更及び日本語入力切り替え用キーの変更(ユーザごとに設定)
 ※Fedora 20、25でのxstartup記載
 Fedora 11からInput Methodが「IBus」に変更されました。ただし、SCIMと比較すると操作性に難があるので、SCIMを利用できるようにします。
 まず、下記のモジュールがインストールされているか確認し、インストールされていない場合は適宜インストールしてください。
 scim-bridge及びscim-bridge-gtkがインストールされていない場合、Ctrl+Spaceキーで日本語入力切り替えを行うことができません。
scim-1.4.8-3.fc11.i586
scim-anthy-1.2.7-2.fc11.i586
scim-bridge-0.4.15.2-3.fc11.i586
scim-bridge-gtk-0.4.15.2-3.fc11.i586
scim-lang-japanese-1.4.8-3.fc11.i586
scim-libs-1.4.8-3.fc11.i586
 VNCでログインした時にSCIMが利用できるようにします。
$ vi $HOME/.vnc/xstartup
下記のように変更します。
#!/bin/sh
export LANG="ja_JP.UTF-8"
vncconfig -iconic &
# Uncomment the following two lines for normal desktop: ← コメントアウト
# unset SESSION_MANAGER ← コメントアウト
# exec /etc/X11/xinit/xinitrc ← コメントアウト
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & ← コメントアウト
#twm & ← コメントアウト
Fedora 10までの場合(以下3行)
export GTK_IM_MODULE="scim"
scim -d &
export XMODIFIERS="@im=SCIM"
Fedora 11の場合(以下1行)
export GTK_IM_MODULE="scim-bridge"
export LANG="ja_JP.utf-8"
gnome-session & ← ウィンドウマネージャをGNOMEに変更
$ chmod +x $HOME/.vnc/xstartup ← 実行権限付加
ANTHY SCIMの起動  日本語(全角)と英語(半角)の切り替えはCtrl+Spaceキーで行うことができます。

 Fedora 20でのxstartup記載内容

 Fedora 20でのxtartupの記載は下記の通りとなっています。
#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
#xsetroot -solid grey
#vncconfig -iconic &
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &
if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
	eval `dbus-launch --sh-syntax –exit-with-session`
	echo "D-BUS per-session daemon address is: $DBUS_SESSION_BUS_ADDRESS"
fi
exec gnome-session
 VNCでの画面サイズは、接続後、[設定]-[画面]で変更可能です。

 Fedora 25でのxstartup記載内容

 Fedora 25でのxtartupの記載は下記の通りとなっています。
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#exec /etc/X11/xinit/xinitrc
#exec gnome-session ← GNOMEでは動作しなかった
exec /usr/bin/mate-session
 Mateを動作させたいので下記を実行します。
# dnf grouplist
# dnf groupinstall "MATE Applications"
# dnf groupinstall "MATE デスクトップ"
 VNCサーバを起動すれば、GUIで接続出来るようになります。

 Red Hat Linux 7.5でのxstartup記載内容

 Red Hat Linux 7.5でのxtartupの記載は下記の通りとなっています。
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#/etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
# Assume either Gnome or KDE will be started by default when installed
# We want to kill the session automatically in this case when user logs out. In case you modify
# /etc/X11/xinit/Xclients or ~/.Xclients yourself to achieve a different result, then you should
# be responsible to modify below code to avoid that your session will be automatically killed
#if [ -e /usr/bin/gnome-session -o -e /usr/bin/startkde ]; then
#    vncserver -kill $DISPLAY
#fi
exec gnome-session
 VNCサーバを起動すれば、GUIで接続出来るようになります。

 Rocky Linux 9でのxstartup記載内容

 Rocky Linux 9ではVNC接続時にGNOMEデスクトップでログインする画面で固まってしまい、利用することが出来ませんでした。
 「dnf grouplist」コマンドで確認したところ、「KDE Plasma デスクトップワークスペース」を別途利用可能なことが分かりましたので、それをインストールしました。
# dnf groupinstall "KDE Plasma デスクトップワークスペース"
 インストール後、xtartupを下記のように変更したところ、操作できるようになりました。

 Rocky Linux 9でのxtartupの記載は下記の通りとなっています。
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#/etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
# Assume either Gnome will be started by default when installed
# We want to kill the session automatically in this case when user logs out. In case you modify
# /etc/X11/xinit/Xclients or ~/.Xclients yourself to achieve a different result, then you should
# be responsible to modify below code to avoid that your session will be automatically killed
#if [ -e /usr/bin/gnome-session ]; then
#    vncserver -kill $DISPLAY
#fi
#exec gnome-session
exec plasma_session
 「$ vncserver -geometry 1920x1080 :2」のように実行すると、指定したディスプレイサイズでVNC接続出来るようになります。

●VNCサーバの起動及び停止

デーモンで起動する方法とユーザ単位で起動する方法の2通りがあります。

・デーモンでの起動(Cent OS 6の場合)
# chkconfig --level 345 vncserver on
# /etc/init.d/vncserver start
・デーモンでの起動(Fedora 21の場合)
 サービス名(Unit名)として、「vncserver@<接続ユーザ>:<ディスプレイ番号>.service」を指定します。
# systemctl enable vncserver@user01:1.service
# systemctl start vncserver@user01:1.service
・ユーザ単位での起動
# su - user ← 該当ユーザに切り替え
$ vncserver -geometry 800x600 :2
または
$ vncserver
・ユーザ単位での停止
# su - user ← 該当ユーザに切り替え
$ vncserver -kill :2
これで、該当ユーザのvncが停止します。

注意
iptablesでフィルタ掛けている場合はユーザ毎に TCP port 5901,5902,5903…を開ける必要があります。

また、VNC接続のほかにHTTPでの接続も可能です。その時はクライアント側にJAVAのランタイム(JRE)がなければなりません。
VNC connections on port 5901 5902 5903 ……
HTTP connections on port 5801 5802 5803 ……
●VNCサーバへの接続

Linux上で動作しているVNCサーバへの接続は下記のとおりとなります。
 VNCクライアントでの接続 1**.2*.3**.100:1
 ブラウザを使用しての接続 http://1**.2*.3**.100:5801
上記のいずれの方法でも、root環境のVNCに接続されることになります。

user2環境のVNCに接続したい場合は、下記のようになります。
 VNCクライアントでの接続 1**.2*.3**.100:2
 ブラウザを使用しての接続 http://1**.2*.3**.100:5802

●VNCで接続するとバグが発生する

1.以下のようなバグが発生した場合の対処。
---- Critical and fatal warnings logged during execution ----
** Gdk **: The program 'gnome-settings-daemon' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadWindow (invalid Window parameter)'.
  (Details: serial 399 error_code 3 request_code 20 minor_code 0)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the --sync command line
   option to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)
 まず、「gconf-editor」がインストールされているか確認します。インストールされていない場合はインストールします。
# yum list installed | grep gconf-editor ← 確認
# yum-y install gconf-editor
# gconf-editor & ← GNOME用に設定エディタ起動
 GNOME用の設定エディタを起動します。
 apps → gnome_settings_daemon → plugins → keyboardの順で開きます。 「active」のチェックを外します。
 VNCサーバを起動後、VNCクライアントで接続しバグが出なくなれば成功です。

2.パネルに起動したウィンドウが表示されない

 GNOMEパネルの設定をいろいろと変えていると、必要なアプレットが消えてしまったりして元の状態に戻せなくなることがある。
 GNOMEパネルを初期状態に戻すには、ホームディレクトリにある.gconfというサブディレクトリを削除する。ただし、いきなり削除して問題が起こると困るので、取りあえずほかの名前に変更して、様子を見るといいだろう。
$ mv .gconf .gconf.bak
 サブディレクトリの名前を変更したら、VNCサーバを再起動する。
# service vncserver restart
 これで、GNOMEパネルのアイコンなどが初期状態に戻るはずです。

●VNCでGnomeデスクトップ上の「システム」にマウスオンすると、ディスクトップが固まってしまう

 デスクトップ環境がGNOMEであるCentOS5.xにVNCで接続後、デスクトップ上の「システム」にマウスオンすると、ディスクトップが固まってしまうという現象が発生します。
 http://bugs.centos.org/view.php?id=3796に、報告されているバグだと思いますが、現状ではRUNレベルを落とすことでの対策しかないようです。
 KDEの方は問題なく利用できるので、しばらくはこちらで対応することとします。

●VMware上のLinuxで動作しているVNCサーバに接続できない

 バグなのか仕様なのか不明だが、VMware上のLinuxで動作しているVNCサーバに接続できないようだ。
Fri Mar 25 23:55:36 2011
 vncext:      VNC extension running!
 vncext:      Listening for VNC connections on port 5901
 vncext:      created VNC server for screen 0
SESSION_MANAGER=local/centos55-2003.bigbang.dyndns.org:/tmp/.ICE-unix/16788
ウィンドウ・マネージャの警告: Log level 32: could not find XKB extension.
Initializing nautilus-open-terminal extension
** Message: Could not connect to power manager: Could not get owner of name 'org.gnome.PowerManager': no such name
Another instance of vmware-user already running.  Exiting.

●Fedora 15でroboot -fで再起動後、VNCサーバが起動しなくなった

 VNCの起動時に下記のようなログが記録されていました。
Sep  9 14:23:16 inu systemd[1]: vncserver.service: control process exited, code=exited status=2
Sep  9 14:23:16 inu systemd[1]: Unit vncserver.service entered failed state.
 いろいろ調べてみるとSELinuxの影響で起動しないというような情報を見つけることは出来ました。
 しかし、SELinuxは無効にしてあるのでSELinuxによる拒否とは考えられませんでした。
 さらに調べてみると、「Fedora15上でtigervnc serverを使っていて、電源断が起きた場合の処理」というページを見つけ、以下のような記載がありました。
/tmp/.X11-unix/ の下にロックファイル(X1とか)があるので、それを消す。 でないと vncserver が起動できない。 # already running になる。 判ってみれば、現象的には当たり前のことなのだが、 systemctl 経由で立ち上がっている場合、ログには「INVALID ARGUMENT」と出てくるので、かなり悩んだ
 もしかしたら、このロックファイルを削除すれば起動するのではないかと考え、いざトライ。
 まず、ロックファイルが存在するか確認。
# ls -l /tmp/.X11-unix
合計 0
srwxrwxrwx 1 root  root  0  9月  9 12:45 X0
srwxrwxrwx 1 root  root  0  9月  9 12:20 X1
srwxrwxrwx 1 user user 0  9月  9 12:20 X2
 やはり、存在しました。削除することにします。
# rm /tmp/.X11-unix/*
rm: ソケット `/tmp/.X11-unix/X0' を削除しますか? y
rm: ソケット `/tmp/.X11-unix/X1' を削除しますか? y
rm: ソケット `/tmp/.X11-unix/X2' を削除しますか? y
# service vncserver start
Starting vncserver (via systemctl):                        [  OK  ]
 やりました。VNCサーバが起動しました。

●Fedora 16でVNCサーバが起動しない

 Fedora 15からFedora 16にアップグレード後、VNCが起動しなくなりました。chkconfig --listでも表示されなくなりました。しかも、systemctlコマンドを実行しても動作しません。
# systemctl start vncserver.service
Job failed. See system logs and 'systemctl status' for details.
# systemctl status vncserver.service
vncserver.service - Remote desktop service (VNC)
	  Loaded: loaded (/lib/systemd/system/vncserver.service; enabled)
	  Active: failed since Sun, 04 Dec 2011 12:36:39 +0900; 5min ago
	 Process: 22229 ExecStart=/sbin/runuser -l <USER> -c /usr/bin/vncserver %i (code=exited, status=125)
	  CGroup: name=systemd:/system/vncserver.service
/var/log/messagesには下記のようなエラーが・・
Dec  4 14:51:48 neko systemd[1]: vncserver.service: control process exited, code=exited status=125
Dec  4 14:51:48 neko systemd[1]: Unit vncserver.service entered failed state.
 何かこれまでのエラーとは違う・・。さて、設定方法を示します。
 /lib/systemd/system/vncserver@.serviceの冒頭には下記のような記載があります。
# The vncserver service unit file
#
# Quick HowTo:
# 1. Copy this file to /etc/systemd/system/vncserver@.service
# 2. Edit <USER> and vncserver parameters appropriately
#   ("runuser -l <USER> -c /usr/bin/vncserver %i -arg1 -arg2")
# 3. Run `systemctl daemon-reload`
# 4. Run `systemctl enable vncserver@:<display>.service`
 これにしたがって作業します。

# cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service
 ↑ 「:1」はディスプレイ番号を示す

# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
 ↑ 「:1」はディスプレイ番号を示す
 /lib/systemd/system/vncserver@:1.serviceの[Service]部分には下記のような記載があります。この部分を変更します。
# cat /etc/systemd/system/vncserver@:1.service
[Service]
Type=forking
ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
ExecStop=/sbin/runuser -l <USER>-c "/usr/bin/vncserver -kill %i"
<USER>部分をVNCでログインさせたいユーザに書き換えます(以下はrootでログインさせたい場合)。
# vi /etc/systemd/system/vncserver@:1.service
[Service]
Type=forking
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
ExecStop=/sbin/runuser -l root -c "/usr/bin/vncserver -kill %i"
# systemctl start vncserver@:1.service ← VNCにrootユーザでディスプレイ「1」で起動
# systemctl enable vncserver@:1.service ← 自動起動を有効
ln -s '/etc/systemd/system/vncserver@:1.service' '/etc/systemd/system/multi-user.target.wants/vncserver@:1.service'
# systemctl status vncserver@:1.service
vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@:1.service; enabled)
   Active: active (running) since 木 2014-05-22 20:44:41 JST; 13h ago
 Main PID: 8608 (Xvnc)
   CGroup: name=/system.slice/system-vncserver.slice/vncserver@:1.service
           ‣ 8608 /usr/bin/Xvnc :1 -desktop mercury.bigbang.dyndns.org:1 (roo...
 5月 22 20:44:38 mercury.bigbang.dyndns.org systemd[1]: Starting Remote desk...
 5月 22 20:44:41 mercury.bigbang.dyndns.org systemd[1]: Started Remote deskt...
Hint: Some lines were ellipsized, use -l to show in full.
 これで設定完了です。
 ただし、ホームディレクトリに.vncフォルダ等が存在しない場合、VNC Server起動時に下記のようなエラーが表示されますので注意してください。
# systemctl start vncserver@:1.service
Job for vncserver@:1.service failed. See 'systemctl status vncserver@:1.service' and 'journalctl -xn' for details.