VNCでRaspberryPi4を操作できるようにする

需要があるかどうかはわからないが、自己満で初めての記事を書く。

RaspberryPiでVNCを構築する記事は調べれば出てくるがその殆どはTigerVNCを利用している。しかし、基本的にはTigerVNCはLAN内だけでしか接続できない。RaspberyPiOSに標準で搭載されているRealVNCは外出時でも接続ができたり、友人も接続する(同時に接続はできないが)ことが可能である。そこで`RealVNC`の環境をUbuntuで構築していく。

注意:この記事の内容は2021年9月時点のものです


## 前提条件
- Raspberry pi 4 Model B 8GB RAM
- Ubuntu Server 21.04 64bit
- ラズパイがインターネットに接続できている
- 接続先のPCはWindows10 21H1

## デスクトップ環境のインストール
RealVNCはデスクトップ環境があることが前提なので入れておく。
ubuntu-desktopやLubuntuなど様々な物があるので、好みに合わせる。今回はXubuntuを入れる。
パッケージの一覧を更新

```
sudo apt update
```
デスクトップ環境のインストール。結構時間かかる

```
sudo apt install xubuntu-desktop
```
インストールが完了したら再起動しておく

```
sudo reboot
```
###参考
- [Raspberry Pi 4 で Xfce デスクトップ環境を構築する方法](https://mseeeen.msen.jp/setting-ubuntu-desktop-environment-on-raspberry-pi/#%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89)

##RaspberryPiにVNCserverを入れる
RaspberryPiOSに標準で入っているものにはライセンスが付与されているが、自前で入れるとライセンスはないのでアカウントが必要になってくる。
[Sign up or sign in](https://manage.realvnc.com/en/?_ga=2.123864394.1903340106.1630797353-1700664404.1629037521)でRealVNCのアカウントを作る。
- plan to use VNC Connect forは personal use
- Phone numberは無くてもok

できたら、[__ここ__](https://archive.raspberrypi.org/debian/pool/main/r/realvnc-vnc/)からrealvnc-vnc-serverのarm64となっている最新ものをダウンロードして、インストールする。
![downloadserver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977143/248a60ab-056a-ed4d-1d32-52ee0339534f.png)
次にRealVNCに必要なファイルのパスをリンクする。これをしないと正しく動作しない。

```
sudo ln /usr/lib/aarch64-linux-gnu/libbcm_host.so /usr/lib/libbcm_host.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libvcos.so /usr/lib/libvcos.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libmmal.so /usr/lib/libmmal.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libmmal_core.so /usr/lib/libmmal_core.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libmmal_components.so /usr/lib/libmmal_components.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libmmal_util.so /usr/lib/libmmal_util.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libmmal_vc_client.so /usr/lib/libmmal_vc_client.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libvchiq_arm.so /usr/lib/libvchiq_arm.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libvcsm.so /usr/lib/libvcsm.so.0
sudo ln /usr/lib/aarch64-linux-gnu/libcontainers.so /usr/lib/libcontainers.so.0
```
全てできたら、vncserverの2つのサービスを有効化、起動する

```
sudo systemctl enable vncserver-x11-serviced.service
sudo systemctl enable vncserver-virtuald.service

sudo systemctl start vncserver-x11-serviced.service
sudo systemctl start vncserver-virtuald.service
```
そして、次のコマンドを実行する

```
sudo vnclicensewiz
```
すると次の画面が出るので指示に従って、先程作ったアカウントでログインする
![licensing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977143/fb6c573e-2718-4fe8-71ff-247bbb938a16.png)
これで、RealVNCのセットアップは完了。

###HDMIを取り外しても使えるようにする
ただ、このままではラズパイにHDMIを繋げたままでないとVNCの接続ができないので、HDMIを取り外しても使えるようにする。

```
sudo vim /etc/gdm3/custom.conf

#WaylandEnable=false この行の#を消してコメントを解除する
```

```
sudo vim /boot/firmware/config.txt

##下の5つを追記する##
dtoverlay=vc4-fkms-v3d-pi4
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=82
hdmi_drive=2
```
hdmi_modeは、[RaspberyPiDocumentation](https://www.raspberrypi.org/documentation/computers/config_txt.html#hdmi-mode)のThese values are valid if hdmi_group=2 (DMT)の一覧からモニターに合わせて選ぶ。
例えば1920x1080,60Hzなら82、1280x720,60Hzなら85である

最後に再起動しておく。HDMIを外すなら、その際に外す。
これでHDMIを取り外してもVNCで使える。
#### 参考
[RealVNC Server on UBUNTU 20.10 (ARM64) on Raspberry Pi 4 (8GB) (2021 UPDATE) - YouTube](https://youtu.be/LTVtKiz2KGE)

## PCにVNCViewerを入れる
[Download VNC® Viewer](https://www.realvnc.com/en/connect/download/viewer/windows/)からexeファイルをダウンロードして、インストール。
インストール後、先程作ったアカウントでログイン。自分のラズパイを選んで開けばラズパイをリモートで操作できる。
LAN内だけであればログインせずにipアドレスを入力しても繋げる事もできる。

![Screenshot_20210908-151557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977143/7aa68a5b-692a-e7b5-1725-70db9a787eb1.png)
アプリを入れればAndroidからも。