Ubuntu 18でログイン画面でも画面共有を使いたい

# はじめに
研究室の共有サーバをUbuntu 18にアップデートしましたが，VNCによる画面共有が使えないことに気づきました．調べてみるとディスプレイマネージャがLightDMからGDMに戻ったことで，x11vncが使えなくなったことが原因のようです．

Ubuntu 18の画面共有はVinoを使っており，ログインしないとアクセスできません．つまり，常にログインしっぱなしにしておかないと駄目で，再起動したら現場に行くしかなくなります．

# 解決策
解決策はいろいろあります．

- GDMを消してLightDMを使う　→共有サーバなので変えにくい……
- x11vncだけを使う　→ログインすると真っ暗に
- 他のVNCサーバを使う　→TigerVNCを使ってみたがうまく動作せず
- そもそも画面共有を使わない　→Xのフォワーディングだけで頑張るのはちょっとキツい
- x11vncとvinoを共存させる　→面倒だけどこれならできそう……

# x11vncとvinoを共存させる
結局，これに行き着きました．ログイン画面にいるときはTCP5901でx11vncに接続して，ログイン後にTCP5900でvinoに接続し直します．

## vinoを有効にする
シンプルにvinoをインストールして，GUIで有効にするだけです．
クライアントがmacやWindowsの場合は，暗号化を解除する必要があるので，dconf-editorを入れておきましょう．
dconf-editorを開いたら，`org -> gnome -> desktop -> remote-access`の中にある`require-encryption`をfalseにしておきます．

```bash
sudo apt install vino dconf-editor
```

### GUIで設定できない（デスクトップにアクセスできない）場合……
dconfコマンドで設定すればGUIにアクセス出来ない状態でも設定できます．
まずはネットワーク接続のUUIDを確認して……

```
$ nmcli connection show
NAME        UUID                                  TYPE      DEVICE    
docker0     xxxxxxxxxxxxxxxxxxxxxxxxxx  bridge    docker0   
有線接続 1  yyyyyyyyyyyyyyyyyyyyyyyyyy  ethernet  enp0s31f6 
```

dconf writeでvinoを有効にしたいコネクションを指定します．今回はEthernetを指定したいので，後者のUUIDを指定します．

```
dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['yyyyyyyyyyyyyyyyyyyyyyyyyy']"
```

dconf readで設定が確認できます．

```
$ dconf read /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections
['yyyyyyyyyyyyyyyyyyyyyyyyyy']
```

## x11vncを有効にする

続いて，x11vncをインストールします．

```
apt-get install x11vnc
```

x11vncのパスワードを設定します．
パスを指定しない場合，パスワードのファイルは `/home/<user>/.vnc/passwd` に保存されます．

```
x11vnc -storepasswd
```

## 起動時にx11vncが上がるようにする

VNCをサービスとして取り扱うため，`x11vnc.service`を作成します．
5900ポートはvinoが使っているため，5901を使います．
`/etc/systemd/system/x11vnc.service`を以下のように編集します．

```x11vnc.service
[Unit]
Description=x11vnc (Remote access)
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/<UID>/gdm/Xauthority -display :0 -rfbauth /home/<user>/.vnc/passwd -rfbport 5901 -forever -loop -noxdamage -repeat -shared

[Install]
WantedBy=multi-user.target
```

`<UID>`は，`ps -auxw | grep Xauth`で確認できます．以下のように，`Xauthority`のフルパスがわかればOKです．この例だと1001になります．
たぶん`/run/user/<UID>/gdm/Xauthority`が2つ以上出てくると思うので，もし接続できなければ別を試すと動くかもしれません．（rootで固定だと思っていましたがそうではないっぽい）

```
$ ps -auxw | grep Xauth
root     19522  0.3  0.2 381404 71100 tty2     Sl+  14:17   1:41 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1001/gdm/Xauthority -background none -noreset -keeptty -verbose 3
```

最後に以下を実行して，サービスが動いているか確認します．

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable x11vnc
$ sudo systemctl start x11vnc

$ sudo systemctl status x11vnc
● x11vnc.service - x11vnc (Remote access)
   Loaded: loaded (/etc/systemd/system/x11vnc.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-05-11 18:27:11 JST; 2 weeks 3 days ago
 Main PID: 2144 (x11vnc)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/x11vnc.service
           ├─2144 /usr/bin/x11vnc -auth /run/user/1001/gdm/Xauthority -display :0 -rfbauth /home/ryorsk/.vnc/passwd -rfbport 5901 -forever -loop -noxdamage -repeat -shared
           └─2184 /usr/bin/x11vnc -auth /run/user/1001/gdm/Xauthority -display :0 -rfbauth /home/ryorsk/.vnc/passwd -rfbport 5901 -forever -loop -noxdamage -repeat -shared
```

あとは，`vnc://<addr>:5901`に接続してログインし，`vnc://<addr>:5900`に接続しなおせばOKです．少し面倒ですがこの作業が必要になるのは再起動後くらいなので我慢します．ちなみに上記の作業はCUI環境のみで完結するので，万が一設定し忘れてサーバルームに放り込んでしまっても大丈夫です．

# 参考
http://fx-kirin.com/ubuntu/ubuntu-vnc-server/
https://freefielder.jp/blog/2015/10/ubuntu-vnc-server-on-startup.html
https://qiita.com/lin_noob/items/afadb3a8a0897e4be909#7vncx11vncサーバのインストール