Ubuntu22.04へのVNC接続でGNOMEデスクトップ環境を使う

Ubuntu22.04でVNCサーバーを立ち上げて、クライアントからGNOMEデスクトップ環境を使う方法です。
chatGPT(GPT-4o)とGemini2.5上に調べてもらったのですが、かなり苦戦したので実行した内容を **覚書** として簡単にまとめます。

### 苦労したポイント
* 22.04ではTigerVNCでGNOMEデスクトップを使うのはうまくいかず断念
* x11vncを使って、GUIデスクトップをリモート表示する方向で実現する
* Ubuntuにはモニタ接続が必須

## 開発環境
* ホスト: Ubuntu 22.04.5 LTS

## VNCサーバーの設定

x11vncは、現在稼働しているXセッションを共有するため、ログイン済みのアクティブなデスクトップに接続する場合に有用です。
ただし、Ubuntu 22.04でデフォルトのGDM3 (GNOME Display Manager 3) とWaylandの組み合わせでは、ログイン画面の共有やユーザーセッションへの接続に課題があるので、X.orgセッションで起動する必要があります。
ここでは、Waylandを無効化し、X.orgセッションでログインしているデスクトップに接続する方法をとります。

### x11vncをインストール

```shell-session
$ sudo apt update
$ sudo apt install x11vnc
```

### Waylandの無効化とX.orgの使用

GDM3でWaylandを無効化し、X.orgをデフォルトにするために設定ファイル (/etc/gdm3/custom.conf) を編集します。

```shell-session
$ sudo vi /etc/gdm3/custom.conf
```

以下の行を探し、コメントアウトを解除(行頭の#を削除)します。

```ini:変更前
#WaylandEnable=false
```
```ini:変更後
WaylandEnable=false
```

### パスワードを設定

```shell-session
$ x11vnc -storepasswd
```

### パスワード認証を有効にしてVNCサーバーを起動

```shell-session
$ x11vnc -rfbauth ~/.vnc/passwd -display :0 -forever -noxdamage
```

## ufw(Uncomplicated FireWall)の設定

デフォルトでは、**VNCのポート(5900番台)**はファイアウォールでブロックされていることが多いので、ポートを開放します。

### 現在のUFW状態を確認

```shell-session
$ sudo ufw status verbose
```
このとき、"Status: inactive"ならまだUFWは有効化されていません。

### VNC用ポートを開ける

今回はディスプレイ:0なのでポート5900を開けます。
```shell-session
$ sudo ufw allow 5900tcp
```

### UFWを有効化

```shell-session
$ sudo ufw enable
```

### UFWのステータス確認

```shell-session
$ sudo ufw status numbered
```
確認結果の例。この例ではSSH接続とSambaによるファイル共有用のポートも開放しています。
```
状態: アクティブ

     To                         Action      From
     --                         ------      ----
[ 1] Samba                      ALLOW IN    Anywhere                  
[ 2] 22/tcp                     ALLOW IN    Anywhere                  
[ 3] 5901/tcp                   ALLOW IN    Anywhere                  
[ 4] 5900/tcp                   ALLOW IN    Anywhere                  
[ 5] Samba (v6)                 ALLOW IN    Anywhere (v6)             
[ 6] 22/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 7] 5901/tcp (v6)              ALLOW IN    Anywhere (v6)             
[ 8] 5900/tcp (v6)              ALLOW IN    Anywhere (v6)             
```

## VNCクライアントからの接続
VNCクライアントからは、**vnc://<サーバーのIPアドレス>:5900** で接続します。
(この例ではIPアドレス192.168.1.36に接続)

![スクリーンショット 2025-05-10 15.10.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/a035b814-63d0-4a21-ac6f-176a867e9bb8.png)

接続画面
![スクリーンショット 2025-05-10 15.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/df513ee5-195b-453e-af53-ba0a47cbacd3.png)

## ログイン時に自動起動するように設定

x11vncは、ログインして表示されているデスクトップセッション(:0)を共有するため、システム起動時ではなく、ユーザーがデスクトップにログインした際に自動起動させるのが一般的な方法です。
GNOMEデスクトップ環境では、「自動起動アプリケーション」という機能を使って、ログイン時にコマンドを実行させて自動起動させることができます。

### 「自動起動するアプリケーションの設定」を開く

GNOMEのアプリケーションメニューを開き、「自動起動するアプリケーションの設定(Startup Applications)」というツールを起動します。

![スクリーンショット 2025-05-10 15.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/ce171b0c-0cc9-4662-83bd-229629a62560.png)

### 自動起動エントリの追加

「自動起動するアプリケーションの設定」ウィンドウが開いたら、「追加」ボタンをクリックします。
新しいエントリの設定ウィンドウが表示されますので、以下の情報を入力します。

* 名前(Name): VNCサーバーであることが分かる任意の名前をつけます。
* コマンド(Command): ここに、x11vnc コマンドを入力します。パスワードファイルのパスはフルパスで指定しておきます。
```
x11vnc -rfbauth /home/<ユーザー名>/.vnc/passwd -display :0 -forever -noxdamage
```
* コメント(Comment): オプションで、このエントリの説明を記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/df45d6f1-92b5-47cf-b1af-1cbe8c9c8c5b.png)

入力が終わったら、「追加」ボタンをクリックします。「自動起動するアプリケーションの設定」ウィンドウに戻ったら、追加したエントリが表示されていることを確認し、ウィンドウを閉じます。設定は自動的に保存されます。

![スクリーンショット 2025-05-10 15.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/990b548a-a826-4f48-9b08-047111addf02.png)

## HDMIエミュレータを使用してモニターを省略
リモート接続で使用する場合は、モニターを接続せずHDMIに挿してEDIDを偽装する **HDMIエミュレータ(ドングル)** を使用するのが設置スペースも省略できて便利です。HDMIエミュレータは2個で600円程度で購入できますので、これを使用するのもよいかもしれません。今回は以下の商品で動作することを確認しました。

https://amzn.to/4j24rWH

#### 作業は以上になります。お疲れ様でした。