CentOS7にVNCを導入してリモートで操作する方法

この記事は約10分で読めます。
スポンサーリンク

たまには技術系ネタを・・・

CentOS7にVNCサーバ(画面を「見せる側」)の設定を行って、リモートからCentOSを操作できるようにしてみました。

実際に自分が構築する上でネットで試行錯誤した結果です。

「CentOS7 Minimal」を導入した直後からの設定を全て記載しているので、CentOS7の本当に初期の導入ができる人だったら、この手順で画面表示までできるはず。

VNCについて

VNCの詳細については様々なサイトで紹介されているので省略します。

基本的にVNCは以下のコンポーネントにわかれます

  • サーバ:見たい画面の側
  • クライアント:接続する側

今回のシナリオではCentOS7をリモートからGUIで操作したいってユースケースを考えています。

つまり、CentOS7にサーバをインストールします。

前提

今回VNCをCentOS7に導入するに当たって、ネットでの様々な情報を参考にしました。ただ、「完全にステップバイステップ」で導入できる情報が見当たらなかったので今回の執筆にいたりました。

この手順でCentOS7をセットアップすると、少なくとも「とりあえずGUIで操作したい」って要件は満たすことができるはずです。

 

ただ、CentOS7の本当に初期設定は省略します。

要約すると、とりあえずの前提は以下とします。

  • 使用するCentOS7は「CentOS-7-x86_64-Minimal-1804.iso」
  • IPアドレス・Gateway・DNSの設定は済
  • つまり、CentOS7からインターネットへのアクセスができることとする

また、あくまでもセキュリティを意識しないで良い環境を前提に考えているので、セキュリティの設定は一切していません。なので、その辺はしっかり念頭にいれて必要に応じてハードニングしてください。責任は負えません。

CentOS7の初期準備

まずは操作しやすいようにSSHでrootログインができるようにします。つまり、この作業はコンソール上から行うことになります。

sshd_configを修正します。

#vi /etc/ssh/sshd_config

以下の箇所のコメントアウトを外します。

#PermitRootLogin yes

こんな感じです。

PermitRootLogin yes

面倒なので、再起動して反映させます。

#reload

これで「root@IPアドレス」でログインできるようになります。

以降は全てSSHでの作業を想定しています。

tigervnc-serverのインストール

CentOS7にて使用できるVNCサーバ(tigervnc-server)をインストールします。

同時にGNOMEもインストールします。

以下をそのままコピペでも大丈夫です。(#以降)

[root@jump ~]#yum install -y tigervnc-server
[root@jump ~]#yum groupinstall -y "GNOME Desktop"

“Complete!”を確認して、再起動します。

Complete!
[root@jump ~]#reload

VNCの設定

ここからが本題です。

以下の通り、vncuserの設定を行います。このパスワードはVNCでGUIログインする時のパスワードではありません。あくまでもOSのパスワードです。

[root@jump ~]# groupadd vnc
[root@jump ~]# useradd vncuser
[root@jump ~]# passwd vncuser
Changing password for user vncuser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@jump ~]#

次にvncuserにsuしてパスワードを設定します。これが、VNCでGUIログインした時に使用するパスワードです。”view-only”は不要ですのでnを入力。

[root@jump ~]# su - vncuser
[vncuser@jump ~]$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
[vncuser@jump ~]$ exit
logout
[root@jump ~]#

vncuserでプロセスを立ち上げるため、カスタマイズサービススクリプトを作成します。

そのままコピペで大丈夫です。

[root@jump ~]# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
[root@jump ~]# vi /etc/systemd/system/vncserver@:1.service

vncserver@:1.serviceの以下の2行を探します。

ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid

こちらの”<USER>”をvncuserに置き換えます。そして保存します。

ExecStart=/usr/sbin/runuser -l vncuser -c "/usr/bin/vncserver %i"
PIDFile=/home/vncuser/.vnc/%H%i.pid

次に、vncuserのxstartupファイルを修正します。

とは言っても、私の手順ではxstartup自体がないので、新たに作成します。

[root@jump ~]# cd /home/vncuser/.vnc/
[root@jump .vnc]# ls
passwd
[root@jump .vnc]# vi xstartup

以下の2行をそのままコピペしてください。そして保存します。

#!/bin/sh
gnome-session &

後はvncserverをカスタマイズスクリプトで起動できる状態にします。

そして起動。statusが”success”になっているはず。

後ほど説明しますが、これだけだとまだダメです。後ほど説明します。

[root@jump .vnc]# systemctl daemon-reload
[root@jump .vnc]# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@:1.service.
[root@jump .vnc]# systemctl start vncserver@:1.service
[root@jump .vnc]# 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 Sat 2018-09-22 22:00:29 EDT; 7s ago
  Process: 11040 ExecStart=/usr/sbin/runuser -l vncuser -c /usr/bin/vncserver %i (code=exited, status=0/SUCCESS)
  Process: 11037 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 11065 (Xvnc)
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ‣ 11065 /usr/bin/Xvnc :1 -auth /home/vncuser/.Xauthority -desktop jump.mylab.local:1 (vncuser) -fp catalogue:/etc/X11/fontpath.d -geometry 1024x768 -pn -rfbauth /home/...

Sep 22 22:00:26 jump.mylab.local systemd[1]: Starting Remote desktop service (VNC)...
Sep 22 22:00:29 jump.mylab.local systemd[1]: Started Remote desktop service (VNC).

Firewalldを修正します。

[root@jump .vnc]# firewall-cmd --permanent --zone=public --add-service=vnc-server
success

Firewalldをリロードします。

[root@jump .vnc]# firewall-cmd --reload
success

これでVNCクライアントからアクセスできるはず!!!

vnc

真っ黒です!真っ黒です

これで苦労してる人が多いのでは?と思います。なので同じ苦労をしてる人のために(キーワードでGoogleで見つけれるために)何度も言います!

CentosでVNCでログインしようとした時に画面が黒くなる(真っ黒になる)場合、以下を確認しましょう。

まずはvncを停止します。

[root@jump .vnc]# systemctl stop vncserver@:1.service
[root@jump .vnc]#

次にxstartupを確認します。上記の手順だと既にvncuserの.vncディレクトリに移ってるはずですが、念の為以下の通り移動します。

[root@jump .vnc]# cd /home/vncuser/.vnc
[root@jump .vnc]# ls
config  jump.mylab.local:1.log  passwd  xstartup
[root@jump .vnc]#

lsで見てみると・・・そうです。rootでxstartupを作ったんですよね。

これをvncuserにchownします。実行権限も念の為。

[root@jump .vnc]# ls -la
total 16
drwxrwxr-x. 2 vncuser vncuser  80 Sep 22 22:03 .
drwx------. 6 vncuser vncuser 159 Sep 22 22:00 ..
-rw-r--r--. 1 vncuser vncuser 332 Sep 22 22:00 config
-rw-rw-r--. 1 vncuser vncuser 827 Sep 22 22:02 jump.mylab.local:1.log
-rw-------. 1 vncuser vncuser   8 Sep 22 21:55 passwd
-rw-r--r--. 1 root    root     26 Sep 22 21:59 xstartup
[root@jump .vnc]# chown vncuser:vncuser xstartup
[root@jump .vnc]# chmod +x xstartup

これで再度起動してみましょう。

[root@jump .vnc]# systemctl start vncserver@:1.service
[root@jump .vnc]#

vnc2

おおお!真っ黒な画面からGNOMEのGUIに変わりました!

ここから先はVNC関係ない、普通のGNOMEの設定です。

 

さて、そもそも今回VNCを入れたのは、実は理由があります。

Guacamoleサーバーと連携して、外部からアクセスする環境を作りたかった。

Guacamoleとの連携もできたので、後ほど紹介します。

コメント

  1. 匿名 より:

    groupaddしてからユーザーを作成していますが、グループに所属させる作業をしていないように感じるのです。
    私は全くの初心者で違っていたら申し訳ありません。

    あと、最初の起動ではactive (running)になるのですが、shutdown -r するとfailしてしまいます。
    色んな方のやり方を参考にして色々なパターンを試すのですがtiger-vncserverには私の場合なぜかsystemctlが効かず、どのやり方でも一度起動に成功した後、再起動後にFailしてしまいます。
    しかし、ネットではそういう現象を全く見ないので何か非常に初歩的な点で誤っているのだと思います。
    もし、お感じになるところがあればサイトに追記していただければ幸です。
    今後のご健勝をお祈り申し上げております。

  2. いつもお世話になっております。
    すみません、先日うっかり無記名でコメントしてしまった者です。
    このページでご教示いただいているようにやってみたのですが、どうしてもrebootするとVNCが起動しません。
    ]# 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: resources) since Sun 2018-11-25 12:53:19 JST; 58s ago
    Process: 1070 ExecStart=/usr/sbin/runuser -l kyokuto -c /usr/bin/vncserver %i (code=exited, status=0/SUCCESS)
    Process: 1050 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
    別のサーバーでも似た現象があり、ウエブサイトに投稿したように自分では解決したつもりだったのですが今回はダメでした。
    systemctl daemon-reloadしてsystemctl start vncserver@:1.serviceすれば再びrunningになるのですが、そのためにはサーバー提供社のコンパネに行かねばならず、あまり実用的ではありません。

    • CCIE_TOZAI より:

      連絡が遅くなり申し訳ありません。(スパムが多くて、全ての投稿のコメントに目を通すことができない状況です)
      この記事と同じ方法で構築したVNCサーバーを再起動(systemctl stop vncserver@:1.serviceの後にsystemctl start vncserver@:1.service。
      そしてreboot)の両方を試してみたのですが、問題なくVNCが起動しました。
      ただ、journalctlを見ると起動時に以下のエラーは出ています。
      SELinux is preventing /usr/libexec/geoclue from search access on the directory 14458. For complete SELinux messages run: sealert -l 188ec615-736c-418b-9537-d7a3b52d9159
      これはSELinuxを無効にすることで回避できると思います。ただ、それでも私の環境では動作しています。
      起動時に別ターミナルで「journalctl -f」を実行し、ログを追っていくと何らかの手がかりがあるかもしれません。

    • 舟山和秀 より:

      ご返信遅くなり申し訳ありません。
      その後、紆余曲折ありおかげさまで実用に耐えるくらいの運用ができるようになりました。
      本来ならばもう少し早くに、そして詳細をご返信させていただくべきなのですが、事情から運用と疎遠となり、お許しください。
      ご相談をさせて頂きましたことで、ずいぶん心の支えになりました。
      ありがとうございました。

      • CCIE_TOZAI より:

        ご連絡ありがとうございます!

        おお!良かったです!

        今後とも宜しくお願いいたします。

  3. CCIE_TOZAI より:

    追加情報です
    強制的にシステムを停止すると、以下のファイルが残って起動できないことがありました。
    ファイル名:/tmp/.X11-unix/X1
    journalctlのログ:
    Dec 8 04:10:30 jump runuser: Warning: jump.mylab.local:1 is taken because of /tmp/.X11-unix/X1
    Dec 8 04:10:30 jump runuser: Remove this file if there is no X server jump.mylab.local:1

    上記ファイルを削除して、再度systemctl startで成功しました。

タイトルとURLをコピーしました