Ubuntu18.04LTSでWiFiがなくても古いiPadをサブモニターにする

※わかりづらいと思ったのでタイトルを変えました

[前回](https://qiita.com/faz479704/items/64e61bc630f59a568732)の結果、VNCを利用することでiPad 3をUbuntuのサブモニターとして使えるようになったが、この方法は同一の無線ネットワークに繋がっていないと実現できない。

家の中なら問題にはならないが、たとえば外に持っていった時、フリースポットがあればまだしも(~~それでも抵抗あるが~~クライアント間での接続は許していないようですね)、WiFiが全く無い場所だとiPadはただのお荷物になってしまう。

そこでWiFiが無くてもiPadをサブモニターとして利用できるよう

- サブモニターにする方法は変えない(VNC利用)
- ネットワークは**無線ネットワーク経由での接続ではなく、UbuntuをホットスポットとしてiPadからubuntuのホットスポットへ接続する形とする**
- また、Ubuntuからはインターネットにも繋がるようにする
- ホットスポット接続＝ほぼ直結になることで、サブモニターの動作が多少なりとも良くなることを少しだけ期待

ことを考え、試行錯誤して実現できた結果を一例として以下に示す。

## ホットスポット化
Ubuntu18.04で無線LANのアダプタをホットスポットにするには、以下の操作をする。

1. [設定]→[Wi-Fi]→(右上のハンバーガー)→[Wi-FiアクセスポイントをONにする]
2. 表示された(＋不穏なメッセージが含まれた)ダイアログで「オン」を押すと、このホットスポットへ繋ぐための情報が表示される(ネットワーク名、暗号化方式、パスワード)。
3. iPadの[設定]→[Wi-Fi]で、上記ネットワーク名を選択して接続する。

ところが何度やってもパスワードエラーとなって接続できない。ここではひとまずUbuntuのホットスポットに接続出来ることを確認したかったので、邪道だけどパスワードを無効化する方法を模索。

1. [alt+f2]→[nm-connection-editor]を実行
2. 「Hotspot」の行でダブルクリック(または歯車ボタン)
3. [Wi-Fiセキュリティー]タブを開き、セキュリティーを[なし]にして「保存」　
4. [設定]→[Wi-Fi]でWi-Fiアクセスポイントを「オフ」にする
5. 無線ネットワークのアクセスポイントのリストに切り替わったら、再度(右上のハンバーガー)→[Wi-FiアクセスポイントをONにする]→ダイアログで「オン」
6. ホットスポットのネットワーク名だけが表示される(はず)
7. iPadの[設定]→[Wi-Fi]で、上記ネットワーク名を選択して接続する。

今度は接続できたので、暗号化に関わるところで何か問題があることは確実。古いものなので、アダプタが新しい方式に対応していないとかそんなところなのかなと勝手に想像。

なお、IPアドレスを確認するのに、つい癖で

```
$ ifconfig
```
と打ったら、「Command `ifconfig` not found」と出て驚いた。

なので、すぐさま

```
$ sudo apt install net-tools
```
しておいた。

## vino
### ホットスポットでは繋がらない？
ネットワークは繋がったので、設定の再確認ということでPC側で[設定]→[共有]→[画面共有]を開いたところ、

![qiita_20201109_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/9d702c9c-1674-b84b-22d2-6a09d3ae6ff4.png)

なんとネットワークのところがｘになっていた。しかも、ｘを押す＝削除以外に他に出来ることが無いので、この画面からはもうどうにも出来なさそう。

ということでいつもの通りネットの海に漕ぎ出して、ぐぐりまくる。

### 設定値その１:gsettings
暗号化処理を無効化するのに「gsettingsコマンド」でrequire-encryptionを変更したが、これを含めvinoに関する設定値を以下のコマンドで確認できた。

```
$ gsettings list-recursively org.gnome.Vino
org.gnome.Vino notify-on-connect true
org.gnome.Vino alternative-port uint16 5900
org.gnome.Vino disable-background false
org.gnome.Vino use-alternative-port false
org.gnome.Vino icon-visibility 'client'
org.gnome.Vino use-upnp false
org.gnome.Vino view-only false
org.gnome.Vino prompt-enabled false
org.gnome.Vino disable-xdamage false
org.gnome.Vino authentication-methods ['vnc']
org.gnome.Vino network-interface ''
org.gnome.Vino require-encryption false
org.gnome.Vino mailto ''
org.gnome.Vino lock-screen-on-disconnect false
org.gnome.Vino vnc-password 'xxxxxxx'
$
```
一見、それっぽい「network-interface」は自分自身につなぐ場合に「lo」を設定するもので、通常は空にするものとのこと。コレ以外はそれっぽくないので、この方向は諦めた。

(参考)
https://help.ubuntu.com/community/VNC/Servers

### 設定値その２:dconf
dconfでは

```
org.gnome.setting-daemon.plugins.shareing.service.enabled-connections
```

というキーがあり、この値に「vinoが使用するネットワークI/FのUUIDを列挙する」と良いらしい。

まず、ネットワークI/Fの「UUID」は以下のコマンドで確認した。

```
$ nmcli con show
NAME            UUID                                  TYPE      DEVICE  
(無線接続)　　　  XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  wifi      -- 
Hotspot         YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY  wifi      wlxxxx0      
有線接続 1       ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ  ethernet  --      
```
次に、今の設定値を確認する。

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

無線接続のUUIDのみ登録されていたので、登録済みUUIDとホットスポットのUUIDをカンマで繋いで登録した(dconfは一部追加や一部削除はできないようなので)。

```
$ dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX','YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY']"
$ dconf read /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections
['XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX','YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY']
```

dconf editorでも同様の値であることは確認した。

改めて[設定]→[共有]→[画面共有]を開くと・・・

![qiita_20201109_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/5902b659-1b49-4de0-a82e-f06008c569b9.png)

うわー、すっごい駄目くさーい。

一縷の望みを抱きながら、ホットスポットをオンにする・・・！

・・・お疲れ様でした(つながりませんでした)

### vinoの動き
改めて、vinoの動きを追ってみた。

まず、ホットスポットから無線ネットワークに戻して、プロセスとlistenしているポート番号を確認した。

```
$ ps -alx | grep vino
0  1000  2333  1337  20   0 587904 30408 poll_s Ssl  ?          0:00 /usr/lib/vino/vino-server
0  1000  3585  1872  20   0  15456  1120 pipe_w S+   pts/0      0:00 grep --color=auto vino
$ netstat -pl | grep 2333
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      2333/vino-server    
tcp6       0      0 [::]:5900               [::]:*                  LISTEN      2333/vino-server    
```
vino-serverなるプロセスが動いていて、5900番ポートで待ち受けていることがわかる。なお、vino-serverの親PIDを見ると

```
$ ps -alx | grep 1337
4  1000  1337     1  20   0  77228  8348 ep_pol Ss   ?          0:00 /lib/systemd/systemd --user
：
```
ということでsystemdからキックされていることもわかった。

ここでホットスポットに切り替え、再度確認すると

```
$ ps -alx | grep vino
$ netstat -pl | grep 59
$
```
vino-serverはおらず、5900番ポートで待ち受けているプロセスもいなくなっていた。ここで再度、無線接続に戻すとvino-serverが再起動し(プロセスIDは異なる)、5900番ボートで待受状態に戻っていた。

ということで[画面共有]をオンにしておくと、ネットワークI/Fの状態を見てvino-server(VNCサーバ)を上げ下げしていることはわかった。dconfでホットスポットのUUIDを登録していてもvinoが終了してしまうということは、UUIDだけでなくホットスポットかどうかもチェックもしていそうだ。

加えて、vino-serverはsystemdから起動されていることからsystemctlで制御されているのかとgrep叩きまくったが、vinoって単語は見つからず。となるとgnomeがなんかしているように思えてきて、これ以上追いかけて深みにハマるだけだなと。

惜しいなぁ、もう少しで出来そうなのに。

### vinoの手動起動
vinoの待受状態を今一度見てみると

```
$ netstat -pl | grep 2333
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      2333/vino-server    
tcp6       0      0 [::]:5900               [::]:*                  LISTEN      2333/vino-server    
```

ということで、ポート番号は指定しているものの、IPアドレスは固定になっていないようだ。となると、[画面共有]の設定による自動上げ下げはさせず、vinoが起動したままになっていれば、無線切断＆ホットスポットからでも繋がるのではないか、と推測。

そこで、

1. [設定]→[共有]→[画面共有 アクティブ]をクリック
2. 画面共有ウインドウの左上のスイッチを一旦「オフ」にしてｘを押す
3. 「画面共有 有効」に切り替わっていることを確認
4. [端末]で「ps -alx | grep vino」を実行して、vino-serverがいないことを確認

した上で、vino-serverを手動実行した。

```
$ /usr/lib/vino/vino-server
09/11/2020 17時14分24秒 Autoprobing TCP port in (all) network interface
09/11/2020 17時14分24秒 Listening IPv6://[::]:5900
09/11/2020 17時14分24秒 Listening IPv4://0.0.0.0:5900
09/11/2020 17時14分24秒 Autoprobing selected port 5900
09/11/2020 17時14分24秒 Advertising security type: 'TLS' (18)
09/11/2020 17時14分24秒 Re-binding socket to listen for VNC connections on TCP port 5900 in (all) interface
:
:
$ ^C
$ ps -alx | grep vino
0  1000  4051  1872  20   0 587896 30284 signal Tl   pts/0      0:00 /usr/lib/vino/vino-server
$ netstat -pl | grep vino
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      4051/vino-server    
tcp6       0      0 [::]:5900               [::]:*                  LISTEN      4051/vino-server    
$
```

ここでまた無線をホットスポットに切り替え、再度iPadからホットスポットに向けて接続。接続できたら、VNC ViewerでホットスポットのIPアドレスを指定してConnectすると・・・

iPadのVNCに映った！！
どうやらこれでいけそうだ。

### vinoの自動実行設定
毎度のパターンになるが、毎回、端末からコマンドを打つのは美しくないので

- systemctlからの起動
- ログイン時の自動起動

の２つを考えた。

前者のsystemctlだが、以下のサイトを参考に設定した。

(参考)
https://askubuntu.com/questions/636270/vino-vnc-server-unable-to-start-on-startup

しかし、systemctlでenableにした後にstatusで確認したところ、vinoがディスプレイが見つからないとかのエラーで落ちてしまっていた。vinoのオプションやsystemctlを少々模索してみたが、すぐには解決しなそうなので一旦諦めた。

一方、後者のログイン時の自動起動だが、あれやこれやしてるときに以下のvino-serverのdesktopファイルを見つけた。

```
$ cd /usr/share/applications/
$ sudo nano vino-server.desktop
---
[Desktop Entry]
Name=Desktop Sharing
Comment=GNOME Desktop Sharing Server
Keywords=vnc;share;remote;
Exec=/usr/lib/vino/vino-server --sm-disable
Icon=preferences-desktop-remote-desktop
NoDisplay=true
Terminal=false
Type=Application
X-GNOME-Autostart-Phase=Applications
X-GNOME-AutoRestart=true
X-GNOME-UsesNotifications=true
X-Ubuntu-Gettext-Domain=vino
---
```

試しにNoDisplayをtrueからfalseにしたところ、ランチャーに「デスクトップ・・」というアイコンが出てきた。vino-serverがいない状態でこのアイコンをダブルクリックしたところ、vino-serverが立ち上がってVNCで接続できたので、このEXECの値を利用する。

そして、[アプリケーションを表示する]→[自動起動するアプリケーションの設定]を開き、[追加]をクリック。

- 名前：(適当に)vino-server
- コマンド：/usr/lib/vino/vino-server --sm-disable
- 説明：(適当に)Desktop Sharing

![qiita_20201109_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/07e859e6-e918-66d3-7057-0efd2d5ee257.png)

保存したら、一旦ログオフ＆ログイン。

ログイン後、vino-serverが自動起動していることを確認した後、無線ネットワーク経由およびホットスポット経由の両方でVNCが繋がることを確認できた。

## まとめ
紆余曲折したが、まとめると。

### タブレットを無線ネットワーク経由でサブモニター化(前回)
1. PCとタブレットを無線ネットワークに接続する
2. PCの[設定]→[共有]→[画面共有]でパスワードなどを設定し、左上のスイッチを「オン」にしてアクティブにする
3. タブレットのVNC ViewerからPCの「無線ネットワークのIPアドレス」を指定して接続し、VNC上で画面共有出来ることを確認
4. 一旦切断し、PCの仮想ディスプレイの設定をする
5. PCで仮想デスクトップを有効にして画面を拡張する
6. この画面領域が広がった状態でVNCをつなぐことで、タブレットをサブモニター化！

### タブレットをホットスポット接続でもサブモニター化(今回)

1. PCの[設定]→[共有]→[画面共有]で左上のスイッチを「オフ」にしてアクティブから「有効」にする
2. vino-serverを自動起動に登録する
3. PCの無線アダプタをホットスポットにする
4. タブレットからPCのホットスポットに接続する
5. PCで仮想デスクトップを有効にして画面を拡張する
6. タブレットのVNC ViewerでPCの「ホットスポットのIPアドレス」を指定して接続し、VNC上で画面共有出来ることを確認。これでWiFiの無い環境でもタブレットをサブモニター化！

## 雑感
- これが正しい道とは思えないけれど、最初の目的を果たすところまで何とかたどり着けたので良かった。

## だが、しかし
ホットスポットをオンにすると、以下のダイアログが表示される。

![qiita_20201109_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/d8432060-e95d-1e00-023f-92e9da3ef255.png)
 
ということで、このメッセージの通り、ホットスポットをオンにすると無線ネットワークが切れてしまうので、目的に挙げていた

- また、Ubuntuからはインターネットにも繋がるようにする

が果たせていないことになる。

さて、どうしたらよいものか・・・