前提記事

Linuxをリモート操作したいけど、設定が複雑で諦めかけていませんか?この記事では、最もシンプルかつ確実にVNC(Virtual Network Computing)接続を実現する方法を解説します。
複雑なsystemdの設定に悩む必要はありません。各行が何のためにあるのかを一つずつ理解すれば、誰でもVNCサーバーの自動起動をマスターできます。この記事は設定ファイルのコピペではなく、理解を目的としています。理解すれば、自身の環境に合わせてカスタマイズできるでしょう。
なぜsystemdを使うのか?
VNCサーバーの自動起動には、ユーザーがログインした後にVNCサーバーを起動する方法と、OS起動と同時に自動で起動するsystemdを使う方法があります。systemdを使うメリットは以下の通りです。
- OS起動と同時起動: ユーザーがログインしていなくても、PCを起動すれば自動的にVNCサーバーが動きます。
- 安定したプロセス管理: サービスが予期せず終了した場合でも、
systemdが監視し、設定によっては自動的に再起動を試みることができます。
サービスファイルの内容
今回解説するsystemdサービスファイルは以下の通りです。このファイルを/etc/systemd/system/vncserver_yourusername.service(例: /etc/systemd/system/vncserver_user.service のように、yourusernameの部分をVNCセッションで使いたいユーザー名に置き換えてください) のように保存します。
[Unit]
Description=Remote desktop service (VNC)
After=network.target
[Service]
Type=forking
User=yourusername
Group=yourusername
WorkingDirectory=/home/yourusername
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :2 > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver -localhost no :2
ExecStop=/usr/bin/vncserver -kill :2
[Install]
WantedBy=multi-user.target
各行の完全解説
ここから、サービスファイルの各行が何を示しているのか、その意味や目的を具体的に見ていきましょう。それぞれの項目が「必須」なのか「任意」なのかも明確に示します。
[Unit] セクション
[Unit]これは、systemdサービスファイルを構成するセクションの「見出し」です。この行は必須です。このセクションには、サービスに関する一般的な情報や、他のサービスとの関係が記述されます。systemdに決められたキーワードであり、[Hoge]のような任意の文字列にはできません。ファイルの中で必ずしも一行目である必要はありません。
Description=Remote desktop service (VNC)これは、このサービスが何をするものなのかを説明するテキストです。systemctl status vncserver_yourusername.serviceコマンドなどでサービスの状況を見たときに表示される、人間が読んでわかる説明文です。これは任意ですが、記述することが強く推奨されます。
After=network.targetこれは、このサービスが起動するタイミングを指定しています。この行は任意です。
- 意味: このサービスは、
network.targetという別のサービスが起動を完了した「後で」起動すべきであることをsystemdに指示しています。 - 具体例: VNCサーバーはネットワークがないと機能しません。
network.targetは、systemdによって定義された「コンピューターのネットワークが使える状態」を示す標準の目印(ターゲット)です。この設定により、VNCサーバーはネットワークが利用可能になってから起動します。network.targetは、/usr/lib/systemd/system/network.targetのようなパスにファイルとして存在し、systemdの開発者によって定義された共通の「決められた名前」です。
[Service] セクション
[Service]これは、systemdサービスファイルの別のセクションの開始を示す見出しです。このセクションには、実際にサービスがどのように実行されるかに関する、具体的な設定が記述されます。この行は必須です。
Type=forkingこれは、サービスが起動する際の「動作の種類」をsystemdに伝える設定です。この項目は必須です。
- 意味:
forkingは、ExecStartで指定されたコマンドが起動時に自分自身をバックグラウンドに「放り出し」(フォークし)、元の起動元のプロセスは終了するタイプを示します。systemdはこのフォークされたバックグラウンドプロセスのPID(プロセスID)を特定し、サービスが起動したと判断します。 - 理由:
/usr/bin/vncserverスクリプトは、内部でVNCサーバー本体のプロセスを起動し、そのプロセスをバックグラウンドに送ってから自分自身は終了するという挙動をするため、このタイプが適合します。
User=yourusernameこれは、このサービスがどのユーザーの権限で実行されるかを指定します。この行は任意です。
- 意味: ここに指定したユーザー名(例:
taku)のユーザーID(UID)と、そのユーザーのプライマリグループIDに切り替えてサービスを実行します。 - 具体例:
User=yourusernameと指定した場合、VNCサーバーはyourusernameユーザーとして動作します。これにより、/home/yourusername/.vnc/passwdのようなユーザーのホームディレクトリ内のファイルにアクセスできるようになります。この行を省略すると、サービスは通常rootユーザーの権限で実行されます。 - 注意点: ここには必ずシステムに存在するユーザー名を指定してください。存在しないユーザー名を指定すると、サービスは起動に失敗します。
Group=yourusernameこれは、このサービスがどのグループの権限で実行されるかを指定します。この行は任意です。
- 意味: ここに指定したグループ名(例:
taku)のグループID(GID)に切り替えてサービスを実行します。 - 具体例:
Group=yourusernameと指定した場合、VNCサーバーはyourusernameユーザーのプライマリグループとして動作します。通常はUserと同じユーザー名を指定します。この行を省略すると、指定されたユーザーのプライマリグループが自動的に適用されます。 - 注意点: ここには必ずシステムに存在するグループ名を指定してください。存在しないグループ名を指定すると、サービスは起動に失敗します。
WorkingDirectory=/home/yourusernameこれは、systemdがこのサービスを起動する際に、どのディレクトリを「作業ディレクトリ」とするかを指定しています。この行は任意です。
- 意味: ここに指定したディレクトリ(例:
/home/yourusername)が、サービス内でコマンドが実行される際の基準となります。 - 具体例: VNCサーバーのログファイル(
~/.vnc/hostname:2.logなど)はユーザーのホームディレクトリ内に作成されるため、この設定でVNCサービスがユーザーのホームディレクトリを基準に動作していることを明確にします。省略した場合、デフォルトの作業ディレクトリは通常/(ルートディレクトリ) になります。
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :2 > /dev/null 2>&1 || :'これは、サービスが起動するメインのコマンド(ExecStart)を実行する直前に実行されるコマンドを指定します。この項目は任意です。
- 意味:
systemdはサービスを起動する前に、/usr/bin/vncserver -kill :2コマンドを実行します。これは、もし同じディスプレイ番号(:2)でVNCサーバーが既に動いていたら、それを強制的に終了させるためのものです。 - 具体例: 以前VNCサーバーがクラッシュして残骸が残っていたり、誤って手動でVNCサーバーを起動してしまったりした場合など、起動を妨げる可能性のある古いVNCセッションを「お掃除」してくれます。
> /dev/null 2>&1: この部分で、vncserver -killコマンドが画面に出力するメッセージ(例: 「VNCサーバーを終了しました」)を非表示にします。|| :: この部分は、もしvncserver -killコマンドが失敗しても(例: そもそもVNCサーバーが動いていなかった場合など)、systemdがこのステップでエラーを吐かずに、次のExecStartに進むようにするためのシェルスクリプトの記法です。
ExecStart=/usr/bin/vncserver -localhost no :2これは、サービスが起動する際に systemd が実行するメインのコマンドを指定します。この項目は必須です。
- 意味:
/usr/bin/vncserverコマンドを、以下のオプションを付けて実行します。-localhost no: 他のコンピューター(Macなど)からのVNC接続を許可します。これを設定しないと、同じLinuxマシンからしか接続できません。:2: VNCサーバーをディスプレイ番号2で起動します。これにより、VNCクライアントからはポート番号5902を使って接続することになります(VNCはポート5900 + ディスプレイ番号を使用するため)。
ExecStop=/usr/bin/vncserver -kill :2これは、サービスが停止される際に systemd が実行するコマンドを指定します。この項目は任意です。
- 意味: サービスを停止するときに、
/usr/bin/vncserver -kill :2コマンドを実行し、指定されたディスプレイ番号のVNCサーバープロセスを終了させます。 - 目的: サービスを安全に終了させ、関連するプロセスをクリーンアップするために使用されます。
systemdは、このコマンドがエラーなく終了した場合に、サービスが正常に停止したと判断します。 - 実行される条件:
systemctl stop vncserver_yourusername.serviceと明示的に停止コマンドを実行したとき。systemctl restart vncserver_yourusername.serviceを実行し、サービスが起動していた場合。- システムシャットダウン時または再起動時、サービスが起動していた場合。
- サービスが属する「ターゲット」が停止されたり、システムの動作レベルが変更されたりした場合。
- 実行されないケース:
- サービスが一度も正常に起動しなかった場合。
- サービスプロセスが
systemdの関与なしにクラッシュしたり、kill -9のような強制終了コマンドで外部から終了させられたりした場合。
[Install] セクション
[Install]これは、systemdサービスファイルの別のセクションの開始を示す見出しです。このセクションは任意です。このセクションは、systemctl enableコマンドが実行されたときにのみ参照されます。
WantedBy=multi-user.targetこれは、systemctl enableコマンドが実行された際に、このサービスをどの「ターゲット」に紐付けるかを指定します。この項目は任意です。
- 意味:
multi-user.targetは、systemdが定義する「ネットワークが利用可能で、複数のユーザーがログインできる状態」(GUIなしのサーバーモードに相当)を示す標準的なターゲットです。これは古いLinuxの「ランレベル3」に相当します。 - 目的: この行があることで、
systemctl enable vncserver_yourusername.serviceを実行すると、システムがmulti-user.targetの状態になったときに、このサービスが自動的に起動するように設定されます。 - 注意点: この行を設定しないと、
systemctl enableコマンドはエラーとなり、システム起動時に自動的にサービスが起動しません。手動でsystemctl startコマンドを実行することは可能です。
VNCサーバー自動起動設定の手順 (まとめ)
- VNCパスワードの設定: ターミナルで
vncpasswdと入力し、VNC接続用のパスワードを設定します。 - ファイアウォール(UFW)の開放: Bash
sudo ufw allow 5902/tcp sudo ufw enable sudo ufw status verbose # 設定が反映されたか確認 - VNCサーバーサービスファイルの作成と保存:
yourusernameの部分を、VNCセッションで使いたいユーザー名に置き換えてください。 Bashsudo nano /etc/systemd/system/vncserver_yourusername.service上記の「サービスファイルの内容」を貼り付けて保存します。 systemdの設定を再読み込み: Bashsudo systemctl daemon-reload- VNCサービスを自動起動可能にする(有効化): Bash
sudo systemctl enable vncserver_yourusername.service - VNCサービスを今すぐ起動: Bash
sudo systemctl start vncserver_yourusername.service - サービスのステータスを確認: Bash
sudo systemctl status vncserver_yourusername.service出力の中にActive: active (running)と表示されれば成功です。
これで、あなたのLinuxシステムが起動するたびに、VNCサーバーが自動的に立ち上がるようになります。 vnc://<LinuxのIPアドレス>:5902 で接続して、快適なリモート操作を始めましょう!