はじめに (対象読者・この記事でわかること)
本記事は、AlmaLinux を本番環境や開発環境で使用しているシステム管理者・DevOps エンジニアを対象としています。Linux ディストリビューションは CentOS から AlmaLinux へ移行した方や、リモートデスクトップ環境を軽量に構築したい方に最適です。
この記事を読むことで、以下が実現できるようになります。
- TigerVNC を AlmaLinux にインストールし、最小限の設定で動作させる方法
systemdのユニットファイルを作成し、VNC サーバーをサービス化する手順- 起動、停止、再起動、ログ確認、起動時自動起動の設定方法
背景として、従来の xinetd や手動起動スクリプトでは管理が煩雑になるケースが増えており、systemd で統一的に制御できることのメリットを実感できる内容にしています。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。
- AlmaLinux(CentOS 系 Linux)の基本的なパッケージ管理(
dnf) systemdの概念と基本コマンド(systemctl)- X Window System の概念と VNC の基本的な仕組み
TigerVNC を systemd サービスとして起動する概要と背景
リモートデスクトップは、開発作業やトラブルシューティングに欠かせないツールです。AlmaLinux では tigervnc-server が公式リポジトリに含まれており、簡単にインストールできます。しかし、単にパッケージを入れるだけでは起動時に手動でコマンドを叩く必要があり、サーバーの再起動後に自動で起動させる仕組みが求められます。
systemd は Linux の init システムとして、プロセスの起動・停止・監視・自動再起動等を統一的に管理できるため、VNC サーバーをサービス化するのに最適です。サービス化することで、以下の利点が得られます。
- 自動起動:サーバーが再起動しても VNC が自動で立ち上がる。
- ログ統合:
journalctlにより標準出力・標準エラーが一元管理でき、トラブル時の情報取得が容易。 - 依存関係管理:
display-manager.serviceなど他のサービスとの起動順序を制御できる。
本稿では、ユーザーごとに異なるディスプレイ番号と解像度を設定しつつ、セキュリティ上のベストプラクティス(ファイアウォール設定や SELinux の考慮)も併せて解説します。
TigerVNC を systemd サービス化する具体的な手順
ステップ 1:TigerVNC のインストールと基本設定
Bash# EPEL リポジトリが無い場合は有効化 sudo dnf install -y epel-release # TigerVNC サーバーパッケージをインストール sudo dnf install -y tigervnc-server # VNC パスワードを設定(ユーザーは例として `vncuser` を使用) sudo useradd -m vncuser sudo passwd vncuser # 必要に応じて SSH ログイン用パスワードも設定 # vncuser に切り替えて VNC パスワードを作成 sudo su - vncuser -c "mkdir -p ~/.vnc && chmod 700 ~/.vnc && vncpasswd" # パスワード入力後、閲覧権限は 600 が自動設定されます
ポイント:
vncpasswdで作成される~/.vnc/passwdは 600 権限で保護されます。vncuserは VNC 用の限定アカウントにしておくと、権限分離がしやすくなります。
ステップ 2:X セッションのデフォルト設定
/etc/sysconfig/vncservers にユーザーごとの設定を書き込みます。
Bash# ファイルを編集(例: vi) sudo vi /etc/sysconfig/vncservers
以下の内容を追記(vncuser が :1 番のディスプレイで起動):
VNCSERVERS="1:vncuser"
VNCSERVERARGS[1]="-geometry 1920x1080 -depth 24"
-geometryで画面解像度、-depthで色深度を指定。- 複数ユーザーがいる場合は
VNCSERVERSにカンマ区切りで追加可。
設定後、/etc/systemd/system/vncserver@.service がテンプレートユニットとして利用されます。
ステップ 3:systemd ユニットファイルの確認と有効化
AlmaLinux の tigervnc-server パッケージには vncserver@.service というテンプレートが同梱されていますが、設定が正しく反映されているか確認します。
Bash# ユニットファイルの内容を確認 sudo systemctl cat vncserver@.service
期待される内容は以下のようになります(抜粋):
[Unit]
Description=Remote desktop service (VNC)
After=network.target
[Service]
Type=forking
User=%i
PAMName=login
PIDFile=/home/%i/.vnc/%H:%i.pid
ExecStartPre=/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :
ExecStart=/usr/bin/vncserver %i
ExecStop=/usr/bin/vncserver -kill %i
ここで %i がディスプレイ番号を指すテンプレート変数です。User=%i は 1:vncuser の vncuser を自動的に設定します。
次に、サービスを有効化し起動します。
Bash# ユニットのリロード sudo systemctl daemon-reload # サービスの有効化(起動時自動) sudo systemctl enable vncserver@1.service # サービスの起動 sudo systemctl start vncserver@1.service # ステータス確認 sudo systemctl status vncserver@1.service
active (running) が表示されれば成功です。journalctl -u vncserver@1.service でログも確認できます。
ステップ 4:ファイアウォールと SELinux の設定
ファイアウォール
VNC のデフォルトポートは 5900 + ディスプレイ番号です。1 番の場合は 5901。
Bash# firewalld が有効な場合 sudo firewall-cmd --permanent --add-port=5901/tcp sudo firewall-cmd --reload
SELinux
tigervnc は SELinux のポリシーで vnc_home_t コンテキストが必要です。デフォルトで自動付与されますが、手動で確認・修正する場合:
Bash# コンテキスト確認 ls -Z /home/vncuser/.vnc # 必要なら relabel sudo restorecon -R -v /home/vncuser/.vnc
ハマった点やエラー解決
1. systemctl start vncserver@1.service が失敗し、Failed to start Remote desktop service (VNC) と出る
原因:/etc/sysconfig/vncservers の記述ミス、特に VNCSERVERS のフォーマットエラー。
解決策:
VNCSERVERSが"1:vncuser"のようにクオートで囲まれているか確認。VNCSERVERARGS[1]で余計な空白や不正文字が入っていないか検証。- 修正後は
systemctl daemon-reloadとsystemctl restart vncserver@1.serviceを実行。
2. SELinux が avc: denied エラーを出す
原因:VNC が ~/.vnc ディレクトリ以下に書き込み権限が無い、またはファイルコンテキストが user_home_t のまま。
解決策:
Bash# 正しいコンテキストへ変更 sudo chcon -R -t vnc_home_t /home/vncuser/.vnc # 永続的に設定したい場合はポリシーモジュールを作成 sudo semanage fcontext -a -t vnc_home_t "/home/vncuser/.vnc(/.*)?" sudo restorecon -R -v /home/vncuser/.vnc
3. 接続時に「Authentication failed」と表示される
原因:~/.vnc/passwd のパーミッションが緩すぎる(例: 644)。
解決策:
Bashchmod 600 /home/vncuser/.vnc/passwd
まとめ
本記事では、AlmaLinux 上で TigerVNC を systemd 管理下のサービスとして設定・起動する手順を詳細に解説しました。
- TigerVNC のインストールと VNC パスワード設定
/etc/sysconfig/vncserversでディスプレイ番号とユーザーを紐付けsystemdテンプレートユニットvncserver@.serviceを有効化し自動起動- ファイアウォールと SELinux の注意点、典型的なエラーと対策
これにより、サーバー再起動後も自動でリモートデスクトップが立ち上がり、ログやステータス管理が一元化されます。今後は、TLS 経由の VNC 接続や、Nginx をリバースプロキシとして利用した WebSocket 経由のセキュア化など、さらに高度な運用手法にも挑戦してみてください。
参考資料
- TigerVNC Official Documentation
- AlmaLinux 公式リポジトリ – tigervnc-server パッケージ情報
- systemd Service Files – Arch Wiki (参考になる概念説明)
- SELinux System Administration Guide – Red Hat Docs
