Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

CentOS Linux

CentOS7でVNC-Serverを使ってリモートデスクトップ環境を構築する手順

投稿日:2020年5月22日 更新日:

(0)目次&概説

(1) 記事の目的
 (1-1) 目的
 (1-2) 前提条件
(2) 実施手順
 (2-1) 必要資源のインストール
  (2-1-1) “tigervnc-server”のインストール
  (2-1-2) “X Window System”のインストール
  (2-1-3) “GNOME Desktop”のインストール
 (2-2) VNCServerの設定
  (2-2-1) 設定ファイルの雛形をコピー
  (2-2-2) 設定ファイルの修正
  (2-2-3) 設定ファイルの反映
 (2-3) VNCユーザ毎の設定
  (2-3-1) パスワードの設定
  (2-3-2) xstartupファイルの作成
 (2-4) パケットフィルタリング設定
 (2-5) VNCサービスの起動
  (2-5-1) VNCサービス起動
  (2-5-2) VNCサービスの起動確認
  (2-5-3) VNCサービスの自動起動設定
 (2-6) クライアントからの接続
(3) エラー対応の備忘録
 (3-1) エラー対応1:Can’t open PID file
 (3-2) エラー対応2:ウィンドウが起動するも画面が真っ黒

(1) 記事の目的

(1-1) 目的

CentOS7環境にGNOMEデスクトップ環境を導入する方法について記述します。
↓こんな感じでクライアントからサーバのデスクトップを遠隔操作する事が目標。

目次にもどる

(2) 実施手順

(2-1) 必要資源のインストール

GNOMEデスクトップ環境を利用する場合は下記パッケージをインストールします。各コンポーネントの関係性等はこちら「VNC ServerとGNOMEデスクトップの概念や基本的な仕組みについて」にて記載しています。

(2-1-1) “tigervnc-server”のインストール
# yum install tigervnc-server 

(図211)

目次にもどる

(2-1-2) “X Window System”のインストール
# yum groupinstall "X Window System" "Desktop"

(図212)

目次にもどる

(2-1-3) “GNOME Desktop”のインストール

このパッケージにはGNOME3のセッション確立のための「gnome-session」といったGNOME関連のモジュールが含まれています。

# yum groupinstall "GNOME Desktop"

(図213)

目次にもどる

(2-2) VNCServerの設定

(2-2-1) 設定ファイルの雛形をコピー

ディレクトリ「/lib/systemd/system/」配下に設定ファイルの雛形が置いてあるので、それを所定のディレクトリ「/usr/lib/systemd/system/」配下にコピーします。
下記のコマンドで[Your Number]となっている箇所は自身の利用予定のディスプレイ番号(※伽婦カyの例では「1」を使用)を採番して実行します。この番号は後にディスプレイ番号等にも利用されまして、もし「1」を採番した場合は規則によりディスプレイ番号は5900+1=「5901」になります。

# cp /lib/systemd/system/vncserver@.service /usr/lib/systemd/system/vncserver@:[Your Number].service

(図221)

目次にもどる

(2-2-2) 設定ファイルの修正

設定ファイルをviエディタで開いて修正します。

# vi vncserver@:[Your Number].service

(図222)

修正箇所は<USER>となっている箇所を自身のVNC利用ユーザに置き換えます。キャプチャの例では「admin」というユーザ名に置き換えています。

■修正前

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple

# 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_wrapper <USER> %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

■修正後

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple

# 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_wrapper admin %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

(図222)

(参考)Type=forkingやType=simpleの意味

Type=simple ・「ExecStart=」に記述したプロセスがサービスにおける主プロセスと見なされます。
・サービスを起動して継続動作している間、プロンプト側では応答が無く、Ctrl+Cを押下するまで入力待ちにならない形で起動します(※フォアグラウンドで処理継続)
Type=forking ・「ExecStart=」に記述したプロセスの「子プロセス」がサービスにおける主プロセスと見なされます。
・サービスを起動して継続動作している間、プロンプトは入力待ちに戻り、サービス自体はバックグラウンドで起動し続ける。
Type=oneshot ・処理を実行し、プロンプトは入力待ちに戻り、サービス等は何も残らずに完了します。一時的なパラメータの設定等、ワンタイムで終わる処理に用います。
Type=dbus ・起動するサービスがD-Busに接続する場合、Type=dbusに設定する事でsystemdにより認知され、トラッキングされます(依存サービスも含めて)。

目次にもどる

(2-2-3) 設定ファイルの反映
# systemctl daemon-reload

(図223)

目次にもどる

(2-3) VNCユーザ毎の設定

(2-3-1) パスワードの設定

このような「ユーザ単位」に行う設定は、rootではなく「VNCを利用するユーザ」にて実施するので、一度rootからexitして「VNCを利用するユーザ」にスイッチします(※私の場合はexitするとVNCユーザである”admin”に戻るので単にexitのみ)

# exit

次のコマンドでパスワード設定を行います。

$ vncpasswd

(図231)

目次にもどる

(2-3-2) xstartupファイルの作成

①xstartupファイルを作成する階層に移動

$ cd ~/.vnc/

②xstartupファイルの作成

$ vi xstartup

(図232)

③GNOMEの利用設定の追加
ファイルが開いたら下記のGNOME利用設定を追加します。

#!/bin/sh
gnome-session &

(図233)

④xstartupファイルに権限の設定を追加
chmodコマンドでVNCサーバの利用ユーザ(※私の例ではadmin)に対して、xstartupシェルの実行権限の付与を行います。

$ chmod +x xstartup

(図234)
※上記コマンドの実行前後で「ls -l」によりファイルのパーミッションを見比べる事で、権限が正しく付与されたか?をチェックしています。

 
目次にもどる

(2-4) firewalldの設定

※長くなるので、別記事「CentOS7でfirewalldを用いてポートの開放を行う方法について」にて記載。

目次にもどる

(2-5) VNCサービスの起動

(2-5-1) VNCサービス起動

次のコマンドでVNCサービスの起動を行います。

# systemctl start vncserver@:[Your Number].service

今回の例ではadminユーザの番号は「1」に指定したので、次のようになります。

# systemctl start vncserver@:1.service

 

(2-5-2) VNCサービスの起動確認

起動の確認は次のコマンドで行います。

# systemctl is-active vncserver@:1.service

(図251)

(2-5-3) VNCサービスの自動起動設定

また、今後のためにも次のコマンドでVNCサーバサービスの自動起動設定を実施しておきます。

# systemctl enable vncserver@:1.service

目次にもどる

(2-6) クライアントからの接続

今回は「Tiger VNC Viewer」を利用します
下記の5901はポート番号で、5900+ディスプレイ番号(1)=5901を指定します。

目次にもどる

目次にもどる

(3) エラー対応の備忘録

(3-1) エラー対応1:Can’t open PID file

(3-1-1) 事象概要

上記(2-1) ~(2-4)までの各種設定を実施したのち、「systemctl start vncserver@:1.service」によるvncserverのサービス起動が失敗(failed)となり、「journalctl -xe」コマンドでエラーの内容を見ると「Can’t open PID file」のエラー文言が出ていました。

May 11 21:57:03 ik1-411-37776.vs.sakura.ne.jp runuser[1164]: pam_unix(runuser-l:session): session opened for user admin by (uid=0)
May 11 21:57:03 ik1-411-37776.vs.sakura.ne.jp runuser[1164]: A VNC server is already running as :1
May 11 21:57:03 ik1-411-37776.vs.sakura.ne.jp sshd[1153]: Failed password for root from 218.92.0.205 port 13751 ssh2
May 11 21:57:06 ik1-411-37776.vs.sakura.ne.jp runuser[1164]: New 'ik1-411-37776.vs.sakura.ne.jp:11 (admin)' desktop is ik1-411-37776.vs.sakura.ne.jp:11
May 11 21:57:06 ik1-411-37776.vs.sakura.ne.jp runuser[1164]: Starting applications specified in /home/admin/.vnc/xstartup
May 11 21:57:06 ik1-411-37776.vs.sakura.ne.jp runuser[1164]: Log file is /home/admin/.vnc/ik1-411-37776.vs.sakura.ne.jp:11.log
May 11 21:57:06 ik1-411-37776.vs.sakura.ne.jp runuser[1164]: pam_unix(runuser-l:session): session closed for user admin
May 11 21:57:06 ik1-411-37776.vs.sakura.ne.jp systemd[1]: Can't open PID file /home/admin/.vnc/ik1-411-37776.vs.sakura.ne.jp:1.pid (yet?) after start: No such file or directory
May 11 21:57:06 ik1-411-37776.vs.sakura.ne.jp systemd[1]: Failed to start Remote desktop service (VNC).
-- Subject: Unit vncserver@:1.service has failed

(図311)

目次にもどる

(3-1-2) 原因

正確には原因が特定できていないのですが、サービスの設定ファイル内で指定している「Type=XXX」(※サービスの起動判定)が「forking」(バックグラウンド起動)になっていると、起動に失敗して上記のエラーが出ていたようです。

(図312)

目次にもどる

(3-1-3) 対処方法

設定ファイル内の「Type=XXX」を「Type=simple」に指定すると正常に起動できるようになりました。

(図313)

目次にもどる

(3-2) エラー対応2:ウィンドウが起動するも画面が真っ黒

(3-2-1) 事象概要

上記(2-1) ~(2-5)までの各種設定を実施したのち、クライアント端末からTigerVNC Viewerを用いてリモート接続を試行すると、ウィンドウは起動するも画面が「真っ黒」となりデスクトップが表示されていない。

(図321)

目次にもどる

(3-2-2) 原因

gnome-sessionを起動できていない事が原因でした。
根本原因としては最初のパッケージインストールの段階で「GNOME Desktop」のインストールが漏れていたため、gnome-session等のシェルスクリプトも存在していなかったため、起動対象のgnome-sessionが見つからないためエラーとなっていました。

(図322)

目次にもどる

(3-2-3) 対処方法

「GNOME Desktop」をインストールする事により起動に成功しました。

yum groupinstall "GNOME Desktop"

下記は”GNOME Desktop”のインストール時に導入される名前がgnome-xxxxのパッケージですが、今回起動したい「gnome-session」も含まれている事が確認できます。

(図323)

目次にもどる

(3-3) その他:障害調査の方法

もしリモートデスクトップが正常に起動しない場合の確認ポイントをいくつか記載します。

(3-3-1) サービスの起動ログの確認

「systemctl start vncserver@:[Your Number].service」でVNCサーバのサービス起動を行うと、「/home/[VNC User]/.vnc」配下に起動のログファイルが作成されます。もしエラーが出たらこのログをチェックする事でヒントが見つかる可能性があります。

ログは以下のパスに格納されています。

$ cd ~/.vnc

(図331)①

下記は実際のログの例です。私はここのログを見てgnome-sessionが起動していない事に気がつきました。

 vncext:   VNC extension running!
 vncext:   Listening for VNC connections on all interface(s), port 5901
 vncext:   created VNC server for screen 0
/home/admin/.vnc/xstartup: line 2: gnome-session: command not found

( 図331)②

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-CentOS, Linux

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Linux:定期的に再起動するスクリプト

Linuxサーバーを定期的に再起動するスクリプトを紹介します。定期的に再起動するという処理はシステム構築においては、運用の中で定義される「死活監視」に関連してくる話になります。 ●シェルとは?シェルス …

Linuxのprocディレクトリとは?用途や中身について

  <目次> (1) Linuxのprocディレクトリとは?用途や中身について  (1-1) procディレクトリとは?  (1-2) procディレクトリの中身 (1) Linuxのpro …

GitHubのアカウント作成の手順と初期設定をご紹介

  <目次> (1) GitHubのアカウント作成の手順と初期設定をご紹介  (1-1) STEP1:GitHubアカウント作成  (1-2) STEP2:SSH Keyの設定 (1) Gi …

C++をLinuxでコンパイルする方法について

  <目次> (1) C++をLinuxでコンパイルする方法について  (1-1) STEP0:【事前準備】ターミナル機能の準備(ターミナル、Teraterm、Putty)  (1-2) S …

Linuxで環境変数を永続化させる方法と手順について

<目次> (1) Linuxで環境変数を永続化させる方法と手順について  (1-1) 実現方法  (1-2) 設定手順 (1) Linuxで環境変数を永続化させる方法と手順について Linuxにおいて …

  • English (United States)
  • 日本語
Top