ubuntu 24.04のリモートデスクトップ環境構築検討


# 概要
自宅のubuntu24.04にリモートデスクトップできるようにするために作業した内容のメモです。
理解が浅いので用語の使い方や考察は間違っているかもしれません。

# 環境
- サーバ
  - OS: ubuntu 24.04
  - CPU: Ryzen 7 5700X
  - GPU: RTX4060 Ti 16GB
- クライアント
  - M1 MacBook Air
  - Windows App

# 検討サマリ
以下の３つを比較しました。
- gnome デスクトップ共有
- gnome リモートログイン
- xrdp リモートログイン

経緯としては、gnomeの2種類はubuntu 24.04の標準機能のため、まずそちらを試したのですが、使いにくさがあったので、最終的にはxrdp リモートログインを採用しました。

## gnome デスクトップ共有
ubuntuのSystem > Remote Desktopから有効にできます。
既存のセッションをリモートに共有する仕組みのため、サーバ側でログイン済みのデスクトップセッションがない場合は、使えないため、メインでは使いにくいと判断しました。
また、パスワードが毎回ランダムに変更されてしまうため、使いにくかったです。パスワードを固定する方法はありそうなのですが、いまいち調べても出てきませんでした。

## gnome リモートログイン
gnome デスクトップ共有と同様にubuntuのSystem > Remote Desktopから有効にできます。
こちらはセッションを都度作成し、また、パスワードも固定できそうだったので、デスクトップ共有より良いと感じました。
ただ、既存のセッションがある場合は、それの強制停止を求められたり、強制停止しても反応がなかったり、画面が真っ暗になってしまったりして、動作が不安定だったので、メインでは使いにくいと判断しました。

## xrdp リモートログイン
aptでxrdpをinstallして使います。
サーバ側をある程度適切な状態にしておけば、一番安定してリモートログインに゙成功したので、メインで使うことにしました。

# 試行錯誤詳細
## gnome デスクトップ共有
[こちら](https://coiai.net/901/?query-41-page=3)を参考に、サーバ、クライアントの設定をしたところ、デスクトップ共有できました。
パスワードがランダムに変更されることに途中まで気づいておらず時間がかかりました。

## gnome リモートログイン
gnomeデスクトップ共有のやり方だけだと、Error code 0x277が出て失敗しました。
[こちら](https://www.akiyan.com/blog/archives/2024/10/mac-windows-app-remote-desktop-client-ubuntu-desktop-24-04-lts-error-code-0x207-solution.html)を参考に、rdpファイルを編集したところ、ログインは成功しましたが、画面が真っ暗になることがありました。正しく表示されることもありました。
いろいろ試していると、サーバ側でauto loginを有効にしているかどうか（厳密にはログイン済みかどうかと思われます）と、login済みのアカウントにリモートでログインするかどうかが画面表示に影響しているようでした。

ubuntuにuser1とuser2を用意して試しました。

- 画面が真っ暗になるパターン
  - 1
    - user1にauto loginするようにしてOS起動
    - クライアントからリモートログイン
    - ubuntuのログイン画面が表示されるのでuser1にログイン
    - 既存セッションを強制終了するか聞かれる
    - 強制終了を選択
    - 画面の動きがないのでキャンセルを選択
    - ubuntuのログイン画面に戻るので再度user1にログイン
    - 画面が真っ暗になる
  - 2
    - auto loginをオフにしてOS起動
    - クライアントからリモートログイン
    - 画面が真っ暗になる
- 画面が正常表示されるパターン
  - 1
    - user1にauto loginするようにしてOS起動
    - クライアントからリモートログイン
    - ubuntuのログイン画面が表示されるので**user2**にログイン
    - ubuntuのデスクトップが正常表示される

定性的に言語化すると、auto loginを有効にしたうえで、loginされていないuserにログインすると、うまくいくようです。

## xrdp リモートログイン
gnome リモートログインの挙動がよくわからないのでxrdpを試してみました。

```
sudo apt install xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp # gnomeのリモートデスクトップやリモートログインが有効の場合はエラーが出る。
sudo nano /etc/xrdp/xrdp.ini # portを既存のものと被らないように修正。今回は3391にした。
sudo restart xrdp
```

上記実行後、クライアントからport 3891にアクセスして、ubuntuのアカウントを入力すると、デスクトップにログインできます。
gnome リモートデスクトップと違ってログインが1回で済むので楽です。

gnome リモートログインのようなrdpファイルの編集は不要でした。
デフォルトだとデスクトップが青くなるので、[こちら](https://www.diy-gedankenexperiment.jp/entry/2024/06/16/130755)を参考に、gnomeっぽい見た目に変更しました。
色々試していると、クライアントのアプリからアカウント情報を入力したあとに、何も表示されない場合（暗い画面がでるときもあればウィンドウそのものが出ないときもありました）と正しく表示される場合がありました。
`/etc/gdm3/custom.conf`を編集して`WaylandEnabled=false`のコメントアウトを外さないと画面が暗くなるという情報もありましたが、手元では外しても外さなくても結果が変わらなかったです。

試行錯誤の結果、以下のようなケースでうまく行ったりいかなかったりするようでした。
ubuntuではユーザとしてuser1とuser2を用意しています。


- 画面が表示されないパターン
  - 1
    - user1にauto loginするようにしてOS起動
    - クライアントからリモートログイン
    - アカウントがuser1でもuser2でもウィンドウが表示されない
  - 2
    - user1にauto loginするようにしてOS起動
    - user2に**gnome リモートログイン**（正常にログインでき、画面が表示される）
    - user2に**xrdp リモートログイン**
    - 画面が真っ暗になる
- 画面が正常表示されるパターン
  - 1
    - user1にauto loginするようにしてOS起動
    - user1に**gnome リモートログイン**して既存セッションを強制終了する
      - ubuntuのログイン画面が表示されるのでuser1にログイン
      - 既存セッションを強制終了するか聞かれる
      - 強制終了を選択
      - 接続を終了する
    - user1に**xrdp リモートログイン**
    - ubuntuのデスクトップが正常表示される
  - 2
    - auto loginをオフにしてOS起動
    - user1またはuser2に**xrdp リモートログイン**
    - ubuntuのデスクトップが正常表示される
  
gnome リモートログインが関係するケースはなんとも言えませんが、少なくとも、auto loginをオフにすればどちらのユーザにもxrdpでログインできるようでした。

## gnome vs xrdp
デスクトップ共有は困難が色々多いので、リモートログインについてgnomeとxrdpのどちらがよいか考えます。
可能であれば標準機能のgnomeだけで済ませたいところですが、「auto loginを有効にして、loginされていないアカウントにのみ接続できる」という条件がわかりにいですし、ログインできないアカウント（auto loginしたアカウント）が存在しているのも問題です。
一方、xrdpであれば、auto loginをオフにしていればどのアカウントにも安定してログインできました。auto loginはサーバを直接使うときには便利なので捨てがたいのですが、今回は、リモートでのしようがどちらかというと多いので、許容できる不便さです。標準機能以外のものを使うのは少し抵抗がありますが、ubuntu22.04までは一般的に使われていたようですし、悪いというほどではなさそうです。

ということでxrdpのリモートログインを主として使うことにしました。gnomeもportをずらせば同時に使うことはできるので、もし必要があれば、使い分けるのもありだと思います。

## 挙動の考察
gnomeやxrdpが成功するときの条件が、なぜそうなるのかについては、正直良くわかりません。
ただ、NVIDIAのドライバが悪さをしていそうな気もします。ubuntuのインストール時にも画面表示の問題が起こっていたので。

起こっていること的には、xrdpでログインできるときはgnomeでログインできず、gnomeでログインできるときはxrdpでログインできないようです。
xrdpとgnomeでは画面共有のプロトコルに異なるものを使っているらしい？ので、そのあたりが原因なのかもしれません。
例えば、auto loginしたアカウントにgnomeログインが失敗するのは、auto login時に決定される画面描画のプロトコルがgnomeとマッチしていないためかもしれません。


## 深く検討しなかったこと
Chrome Remote DesktopはAndroidやiOSもクライアントになれるようなので、少し興味がありました。ただgnomeやxrdpの検証にすでにだいぶ時間がかかっていたことと、サーバとクライアントそれぞれにchromeと拡張機能をインストールするのが少し面倒そうに思われたので、今回は対象から外しました。

macではなくwindowsがクライアントの場合はまた事情が違ったかもしれません。windowsの場合、gnomeが採用しているrdpプロトコルにネイティブで対応しているらしい？ので、gnomeですんなり行くかもしれません。
# おわりに
ubuntuのリモートデスクトップに思ったよりも手こずりました。
とりあえずはxrdpをメインに使って様子を見ようと思います。