linux:vnc

VNC(Virtual Network Computing)

TigerVNC 001

 VNC(Virtual Network Computing)は、リモートデスクトップを実現するクロスプラットフォームのソフトウェアである。
VNCサーバが動作するOS(Windows CE/98/Me/2000/XP/2003、Linux、Solaris)をVNCクライアントが動作する
OS(Windows CE/98/Me/2000/XP/2003、Linux、Solaris、Javaが作動する全てのOS、μVNCやiVNCは携帯用)
から遠隔操作することができる。

Virtual Network Computing | Wikiwand も参照

tigervnc-server パッケージをインストールする🤔

$ sudo dnf install tigervnc-server

メタデータの期限切れの最終確認: 0:16:48 時間前の 2022年08月28日 04時04分24秒 に実施しました。
依存関係が解決しました。
========================================================================================================================
 パッケージ                       アーキテクチャー       バージョン                       リポジトリー            サイズ
========================================================================================================================
インストール:
 tigervnc-server                  x86_64                 1.12.0-6.fc36                    updates                 259 k
依存関係のインストール:
 tigervnc-selinux                 noarch                 1.12.0-6.fc36                    updates                  24 k

トランザクションの概要
========================================================================================================================
インストール  2 パッケージ

ダウンロードサイズの合計: 284 k
インストール後のサイズ: 682 k
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/2): tigervnc-selinux-1.12.0-6.fc36.noarch.rpm                                         32 kB/s |  24 kB     00:00    
(2/2): tigervnc-server-1.12.0-6.fc36.x86_64.rpm                                          70 kB/s | 259 kB     00:03    
------------------------------------------------------------------------------------------------------------------------
合計                                                                                     60 kB/s | 284 kB     00:04     
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                1/1 
  scriptletの実行中: tigervnc-selinux-1.12.0-6.fc36.noarch                                                          1/2 
  インストール中   : tigervnc-selinux-1.12.0-6.fc36.noarch                                                          1/2 
  scriptletの実行中: tigervnc-selinux-1.12.0-6.fc36.noarch                                                          1/2 
  インストール中   : tigervnc-server-1.12.0-6.fc36.x86_64                                                           2/2 
  scriptletの実行中: tigervnc-server-1.12.0-6.fc36.x86_64                                                           2/2 
  検証             : tigervnc-selinux-1.12.0-6.fc36.noarch                                                          1/2 
  検証             : tigervnc-server-1.12.0-6.fc36.x86_64                                                           2/2 

インストール済み:
  tigervnc-selinux-1.12.0-6.fc36.noarch                       tigervnc-server-1.12.0-6.fc36.x86_64                      

完了しました!

現在のファイヤウォールの内容を確認する🤔
firewalld (Linux)

$ firewall-cmd --list-services

dhcpv6-client mdns samba-client ssh

vnc-server のファイヤウォール定義は以下のようになっている🤔

$ 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>

ファイヤウォールに vnc-server の設定を行う🤔

$ sudo firewall-cmd --permanent --add-service=vnc-server

success

ファイヤウォール設定を有効化するためにリロードする🤔

$ sudo firewall-cmd --reload

success

設定が適用されていることを確認する🤔

$ firewall-cmd --list-services

dhcpv6-client mdns samba-client ssh vnc-server

VNC 接続時に適用されるデフォルト設定を行う(例: GNOME セッション、解像度 1366×768)

$ cat << "EOF" | sudo tee -a /etc/tigervnc/vncserver-config-defaults
session=gnome
geometry=1366x768
EOF

session=gnome
geometry=1366x768

画面番号 :1 のログインユーザーを設定する(例: tomoyan)🤔

$ echo ":1=tomoyan" | sudo tee -a /etc/tigervnc/vncserver.users

:1=tomoyan

VNC 接続時パスワードを設定する(この設定を行わないとサービスが起動出来ない)🤔

$ vncpasswd

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used

vnc-server サービスの有効化と起動を行い、正常に起動することを確認する😀

$ sudo systemctl enable --now vncserver@:1
$ systemctl status vncserver@:1.service

 vncserver@:1.service - Remote desktop service (VNC)
     Loaded: loaded (/usr/lib/systemd/system/vncserver@.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2022-10-07 10:26:31 JST; 1min 29s ago
    Process: 2756 ExecStartPre=/usr/libexec/vncsession-restore :1 (code=exited, status=0/SUCCESS)
    Process: 2768 ExecStart=/usr/libexec/vncsession-start :1 (code=exited, status=0/SUCCESS)
   Main PID: 2775 (vncsession)
      Tasks: 0 (limit: 19016)
     Memory: 1016.0K
        CPU: 38ms
     CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
             ‣  2775 /usr/sbin/vncsession tomoyan :1

10月 07 10:26:31 WICKED-BEAT systemd[1]: Starting vncserver@:1.service - Remote desktop service (VNC)...
10月 07 10:26:31 WICKED-BEAT systemd[1]: Started vncserver@:1.service - Remote desktop service (VNC).

$ systemctl status vncserver@:1.service
 vncserver@:1.service - Remote desktop service (VNC)
     Loaded: loaded (/usr/lib/systemd/system/vncserver@.service; enabled; preset: disabled)
     Active: inactive (dead) since Sat 2023-03-04 16:24:58 JST; 25s ago
   Duration: 1.083s
    Process: 3001 ExecStartPre=/usr/libexec/vncsession-restore :1 (code=exited, status=0/SUCCESS)
    Process: 3010 ExecStart=/usr/libexec/vncsession-start :1 (code=exited, status=0/SUCCESS)
   Main PID: 3017 (code=exited, status=0/SUCCESS)
        CPU: 56ms

 3月 04 16:24:57 highway-x.fireball.local systemd[1]: Starting vncserver@:1.service - Remote desktop service >
 3月 04 16:24:57 highway-x.fireball.local systemd[1]: Started vncserver@:1.service - Remote desktop service (>
 3月 04 16:24:58 highway-x.fireball.local systemd[1]: vncserver@:1.service: Deactivated successfully.

vnc パスワードの設定をしていない可能性があるので設定する🤔

$ vncpasswd

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used

vncserver を起動し直してステータスを確認する🤔

$ sudo systemctl start vncserver@:1
$  systemctl status vncserver@:1.service

 vncserver@:1.service - Remote desktop service (VNC)
     Loaded: loaded (/usr/lib/systemd/system/vncserver@.service; enabled; preset: disabled)
     Active: active (running) since Sat 2023-03-04 16:31:50 JST; 3s ago
    Process: 3220 ExecStartPre=/usr/libexec/vncsession-restore :1 (code=exited, status=0/SUCCESS)
    Process: 3232 ExecStart=/usr/libexec/vncsession-start :1 (code=exited, status=0/SUCCESS)
   Main PID: 3239 (vncsession)
      Tasks: 0 (limit: 9402)
     Memory: 1.0M
        CPU: 67ms
     CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
             ‣ 3239 /usr/sbin/vncsession tomoyan :1

 3月 04 16:31:50 highway-x.fireball.local systemd[1]: Starting vncserver@:1.service - Remote desktop service >
 3月 04 16:31:50 highway-x.fireball.local systemd[1]: Started vncserver@:1.service - Remote desktop service (>

 この方法では、接続要求が発生するごとにメモリーを消費するので経済的です。この方法では、接続するとログイン画面表示されるので、ユーザーとパスワード入力してログインします。
 ルートのログインを許可することも可能ですが、標準の設定ではそのようにはなっていないのでおすすめはしません。

  1. スーパーサーバー(xinetd)のパッケージをインストールする。
    $ sudo yum install xinetd
  2. リモートデスクトップ(vnc)のパッケージをインストールする。
    CentOS
    $ sudo yum install vnc vnc-server

    Fedora

    $ sudo yum install tigervnc-server-minimal
    

    メタデータの期限切れの最終確認: 3:23:49 時間前の 2022年08月28日 00時36分21秒 に実施しました。
    パッケージ tigervnc-server-minimal-1.12.0-6.fc36.x86_64 は既にインストールされています。
    依存関係が解決しました。
    行うべきことはありません。
    完了しました!
    

  1. サービスのポートを指定するために、以下の設定ファイルを修正する。(行追加)
    $ sudo vi /etc/services
    vncserver       5900/tcp                        # VNC Server
  2. スーパサーバーが起動するプログラムを設定するために、以下の設定ファイルを作成する。
    $ sudo vi /etc/xinetd.d/vncserver
    service vncserver
    {
        disable         = no
        nice            = 10
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -geometry 1600x960 -depth 16 --securitytypes=none
        log_on_success  += DURATION
        log_on_failure  += HOST
    }

    注意:
     service vncserver の部分は /etc/services に追記したサービス名と一致していなければならない。
     画面サイズ 1600×960 はお好みに応じて変更してください。

  3. vnc のパスワードファイルを作成する。
    $ sudo vncpasswd /etc/vncserver_passwd
    Password: <-- パスワードを入力 
    Verify:   <-- パスワードを入力 
  4. Xvnc がパスワードファイルを参照できるようにパーミッションを設定する。
    $ sudo chmod 644 /etc/vncserver_passwd
  5. GDM(Gnome Display Manager)の設定を変更するために、以下の設定ファイルを修正する。(該当セクションに以下の内容を追記)
    $ sudo vi /etc/gdm/custom.conf
    [daemon]
    RemoteGreeter=/usr/libexec/gdmgreeter
    
    [xdmcp]
    Enable=true # XDM認証有効化

     おすすめしないが、管理者ログインを許可したいのなら以下の設定を追加する。

    [security]
    AllowRemoteRoot=true

    Fedoraの場合は以下のように修正する。

    [security]
    DisallowTCP=false
    
    [xdmcp]
    Enable=true # XDM認証有効化
  6. サービスのポートをファイヤウォールで許可するために、以下の設定ファイルを修正する。
    /etc/sysconfig/iptables (行追加)
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5900 -j ACCEPT
  7. OS 起動時にスーパーサーバーが自動起動するように、以下のコマンドを実行する。
    $ sudo chkconfig xinetd on
  8. 設定の変更を反映させるために、以下のコマンドを実行する。
    CentOS6、Fedoraの場合
    $ sudo restart prefdm
    $ sudo service xinetd restart
    $ sudo service iptables restart

    CentOS 5 の場合はrestart prefdmではなく以下を実行する。

    $ sudo gdm-restart
    $ sudo service xinetd restart
    $ sudo service iptables restart

    Fedora 16

    $ sudo systemctl restart xinetd.service

    Fedora 18 以降

    $ sudo systemctl restart gdm.service
  9. クリップボードを共有するために、ユーザーがログオンした際に以下のコマンドが自動実行されるように設定する。
     メニューより [システム]-[設定]-[他の個人設定]-[セッション] を開いて、自動起動するプログラムに以下のコマンドを追加する。
    vncconfig -nowin

 CentOS 6で以下のようなトラブルが発生する場合:

  • vnc 経由で管理者権限を必要とするアプリケーションが起動しない。
  • スーパーユーザーでアプリケーションを実行すると以下のエラーが発生する。
    No protocol specified
    Could not parse arguments: ディスプレイをオープンできません:

 解決方法:

  1. /etc/X0.hosts を作成してホスト名を追加する。
    ※“green.fireball.local:1.0” の場合は X1.hosts のようにディスプレイ番号に応じて作成する必要がある。
    $ sudo vi /etc/X0.hosts

    /etc/X0.hosts の内容

    localhost
  2. prefdm を再起動する。
    $ sudo restart prefdm

 CentOS 5で以下のようなトラブルが発生する場合:

  • vnc 経由で管理者権限を必要とするアプリケーションが起動しない。
  • スーパーユーザーでアプリケーションを実行すると以下のエラーが発生する。
    Xlib: connection to "green.fireball.local:0.0" refused by server
    Xlib: No protocol specified

 解決方法:

  1. /etc/X0.hosts を作成してホスト名を追加する。
    ※“green.fireball.local:1.0” の場合は X1.hosts のようにディスプレイ番号に応じて作成する必要がある。
    $ sudo vi /etc/X0.hosts

    /etc/X0.hosts の内容

    green.fireball.local
  2. gdm を再起動する。
    $ sudo gdm-restart

 リモートサーバーに接続して長時間処理などを実行しておきたい場合は、Xvnc のセッションが保持されるように設定しておくと便利である。
 以下では前述の設定に追記することを前提に説明する。

  1. セッション保持用のサービスのポートを指定するために、以下の設定ファイルを修正する。
    $ sudo vi /etc/services (行追加)
    vncsrvkeep01    5901/tcp                        # VNC Server(keep session 01)
    vncsrvkeep02    5902/tcp                        # VNC Server(keep session 02)
    vncsrvkeep03    5903/tcp                        # VNC Server(keep session 03)
    vncsrvkeep04    5904/tcp                        # VNC Server(keep session 04)
    vncsrvkeep05    5905/tcp                        # VNC Server(keep session 05)
  2. スーパサーバーが起動するプログラムを設定するために、以下の設定ファイルを修正する。
    $ sudo vi /etc/xinetd.d/vncserver (設定追加)
    service vncsrvkeep01
    {
        disable         = no
        nice            = 10
        flags           = REUSE
        socket_type     = stream
        wait            = yes
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -geometry 1600x960 -depth 16 --PasswordFile=/etc/vncserver_passwd
        log_on_success  += DURATION
        log_on_failure  += HOST
    }
    service vncsrvkeep02
    {
        disable         = no
        nice            = 10
        flags           = REUSE
        socket_type     = stream
        wait            = yes
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -geometry 1600x960 -depth 16 --PasswordFile=/etc/vncserver_passwd
        log_on_success  += DURATION
        log_on_failure  += HOST
    }
    service vncsrvkeep03
    {
        disable         = no
        nice            = 10
        flags           = REUSE
        socket_type     = stream
        wait            = yes
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -geometry 1600x960 -depth 16 --PasswordFile=/etc/vncserver_passwd
        log_on_success  += DURATION
        log_on_failure  += HOST
    }
    service vncsrvkeep04
    {
        disable         = no
        nice            = 10
        flags           = REUSE
        socket_type     = stream
        wait            = yes
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -geometry 1600x960 -depth 16 --PasswordFile=/etc/vncserver_passwd
        log_on_success  += DURATION
        log_on_failure  += HOST
    }
    service vncsrvkeep05
    {
        disable         = no
        nice            = 10
        flags           = REUSE
        socket_type     = stream
        wait            = yes
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -geometry 1600x960 -depth 16 --PasswordFile=/etc/vncserver_passwd
        log_on_success  += DURATION
        log_on_failure  += HOST
    }

    注意:
     service vncsrvkeep01~05 の部分は /etc/services に追記したサービス名と一致していなければならない。
     画面サイズ 1600×960 はお好みに応じて変更してください。

  3. vnc のパスワードファイルを作成する。
    $ sudo vncpasswd /etc/vncserver_passwd
    Password: <-- パスワードを入力 
    Verify:   <-- パスワードを入力 
  4. Xvnc がパスワードファイルを参照できるようにパーミッションを設定する。
    $ sudo chmod 644 /etc/vncserver_passwd
  5. サービスのポートをファイヤウォールで許可するために、以下の設定ファイルを修正する。
    CentOS
    $ sudo vi /etc/sysconfig/iptables (行修正)
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5905 -j ACCEPT

    Fedora

    $ sudo firewall-cmd --permanent --add-port=5901-5905/tcp
  6. 設定の変更を反映させるために、以下のコマンドを実行する。
    CentOS
    $ sudo gdm-restart
    $ sudo service xinetd restart
    $ sudo service iptables restart

    Fedora

    $ sudo systemctl restart gdm.service
    $ sudo systemctl restart xinetd.service
    $ sudo firewall-cmd --reload

 この方法では、ユーザー1人につきポート5901より1ポートを消費します。また、VNCSERVERARGSの定義数が増えるとメモリーを多く消費します。

/etc/sysconfig/vncservers の以下の箇所を参考に最終行に設定を追加

# VNCSERVERS="2:myusername"
# VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -nohttpd -localhost"

VNCSERVERS="1:tomoyan 2:hogehoge"
VNCSERVERARGS[1]="-geometry 1024x768 -nolisten tcp -nohttpd"
VNCSERVERARGS[2]="-geometry 1280x1024 -nolisten tcp -nohttpd"

-localhost オプションが指定されているとリモートから接続することができないので注意。

VNCSERVERS="ディスプレイ番号: ユーザ名"
VNCSERVERARGS[ディスプレイ番号]="-geometry 1024x768 -nolisten tcp -nohttpd"
$ su - tomoyan
パスワード:
$ vncpasswd
Password:
Verify:
$ su - hogehoge
パスワード:
$ vncpasswd
Password:
Verify:
$ su -
パスワード:
# service vncserver start
VNC サーバー を起動中: 1:tomoyan
VNC サーバー を起動中: 2:hogehoge
~省略~

VNCサーバが起動すると以下の設定ファイルが作成されるので設定を変更する。
/home/tomoyan/.vnc/xstartup

#vncconfig -iconic &
vncconfig -nowin &
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
# twm &			→ 最終行の twm & をコメントアウト
gnome-session &		# → gnomeを起動するように変更

/home/hogehoge/.vnc/xstartup も同様に修正する。
VNCサーバを再起動すると設定が反映される。

# service vncserver restart

 VNCサーバを利用するには以下のポートの開放が必要である。

tcp	port 5900	マシン コンソールに接続する場合
tcp	port 5901	ディスプレイ番号:1 に接続する場合
tcp	port 5902	ディスプレイ番号:2 に接続する場合
...
  • linux/vnc.txt
  • 最終更新: 2023/09/01 12:54
  • by ともやん