Raspberry Pi 4に Ubuntu server 18.04をインストール

# 概要
Rasberry Pi 4にUbuntu server 18.04をインストールする方法について説明します。
他にも説明している記事はありますが、自分に必要な情報がまとまっている記事がなかったため、作成しました。
基本的には、[公式のインストールガイド](https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview)の通りです。

(追記)
- 2020/12/05
  - Bluetooth, raspi cameraの設定

# 環境
- Rasberry Pi 4 (8GB)
- Ubuntu server 18.04 (64 bit)
- SDカード : [サンディスク 32GB](https://www.amazon.co.jp/gp/product/B06XWMQ81P/ref=ppx_yo_dt_b_asin_title_o02__o00_s00?ie=UTF8&psc=1)
 

# インストール手順
## OSイメージのダウンロード
[ここ](https://ubuntu.com/download/raspberry-pi)からイメージをダウンロードします。*Ubuntu 18.04のDownload 64-bit*を選択します。

## OSイメージの解凍
```
$ xz -dv ubuntu-18.04.4-preinstalled-server-arm64+raspi4.img.xz
```
## OSイメージをSDカードに書き込み
公式では、*Raspberry Pi Imager*を使っていますが、自分はコマンドで直接書き込みました。
また、書き込みの前にデバイス名をチェックする必要があります。デバイス名を間違えると、HDDのデータ等を上書きしてしまう恐れがあります。

```
$ df -h # デバイス名のチェック。こちらの環境では/dev/sde1, /dev/sde2でした
$ sudo umount /dev/sde1
$ sudo umount /dev/sde2
$ sudo dd bs=4M if=ubuntu-18.04.4-preinstalled-server-arm64+raspi3.img of=/dev/sde
```

## Raspiの起動
SDカードをRaspiに挿入し、起動します。
起動後、パスワードを変更する必要があります。デフォルトでは、ユーザ名/パスワード共に***ubuntu***です。その後、任意のパスワードを設定してください。

## Wifiの設定
自分の環境ではWPA2-PSKかつステルスモードでwifiを使用しているので、この環境の設定を行います。

### Network Managerの設定
wifiを使用するためにはNetwork Managerをインストールする必要がります。そのため有線LANを接続し、以下コマンドを実行します。

```
$ sudo apt update
$ sudo apt install network-manager
```
### netplanの設定
Ubuntu 18.04では、netplanを使ってネットワークの設定を行います。

```
$ sudo vi /etc/netplan/50-cloud-init.yaml
```
``` /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth0:
      dhcp4: true
      optional: true
  wifis:
    wlan0:
      dhcp4: true
      optional: true
      access-points:
        "{接続するSSID}":
          auth:
            key-management: psk
            password: "{パスワード}"
```

### 設定の有効化
```
$ sudo netplan apply
```
### ネットワークの接続
接続する際に、ネットワークの名前を確認します。

```
$ sudo nmcli c
NAME                   UUID TYPE DEVICE
netplan-wlan0-{SSID} (略) wifi
```
ネットワーク接続

```
$ sudo nmcli c up netplan-wlan0-{SSID}
```
ステルス機能使用時にデフォルトで接続するための設定

```
$ sudo nmcli c mod netplan-wlan0-{SSID} 802-11-wireless.hidden true
```
`$ ifconfig`で確認し、ネットワークに接続できていれば完了です。
sshはデフォルトで使用できるようになっているため、すぐに使用可能です。


# Bluetoothの設定
Bluetoothを使うには、`pi-bluetooth bluetooth bluez`をインストールすればいいのですが、そのままインストールしようとすると、

```
$ sudo apt install pi-bluetooth bluetooth bluez
...
dpkg: error processing archive /var/cache/apt/archives/bluez-firmware_1.2-4+rpt1~bionic1.0_all.deb (--unpack):
 trying to overwrite '/lib/firmware/brcm/BCM43430A1.hcd', which is also in package linux-firmware-raspi2 1.20200601+arm64-0ubuntu2~18.04.1
Errors were encountered while processing:
 /var/cache/apt/archives/bluez-firmware_1.2-4+rpt1~bionic1.0_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```
というようなエラーが出てしまいます。
解決策を探したところ、[こちら](https://www.hiro345.net/blogs/hiro345/archives/19932.html)のようにすると、問題なくインストールできました。

## pi-bluetoothなどのインストール
```
$ sudo add-apt-repository ppa:ubuntu-pi-flavour-makers/ppa
$ sudo apt update

$ sudo apt -y remove linux-firmware-raspi2
$ sudo apt -y install pi-bluetooth bluetooth bluez
$ cd /
$ sudo tar czf bluez-firmware.tgz lib/firmware usr/share/doc/bluez-firmware
$ list=$(cat << EOS
lib/systemd/system/bthelper@.service
lib/systemd/system/hciuart.service
lib/udev/rules.d/90-pi-bluetooth.rules
usr/bin/bthelper
usr/bin/btuart
usr/share/doc/pi-bluetooth
EOS
)
$ sudo tar czf pi-bluetooth.tgz $list
$ sudo apt -y remove bluez-firmware pi-bluetooth
$ sudo apt -y install linux-firmware-raspi2
$ sudo apt -y install raspberrypi-sys-mods rfkill
$ sudo tar xf pi-bluetooth.tgz
$ sudo tar xf bluez-firmware.tgz
$ sudo systemctl unmask hciuart
$ sudo systemctl enable hciuart
$ sudo reboot
```
## bluetoothの有効化
一般ユーザを使用している場合は、そのユーザでもbluetoothを使えるように権限を付与します

```
$ sudo usermod -a -G bluetooth {ユーザアカウント}
$ sudo reboot
```

この後は`bluetoothctl`コマンドからbluetoothデバイスとのペアリングをすることで使用できます

# Raspiカメラの設定
Raspberry Pi専用カメラを使えるように設定します

## カメラデバイスの有効化
```
$ sudo vi /boot/firmware/config.txt
start_x=1
gpu_mem=256
```
ファイルの最後に上記2行を追加し、リブートします。なお、`gpu_mem`の値は、256でなくてもかまいません。

## userlandのビルド
[Ubuntu wiki](https://wiki.ubuntu.com/ARM/RaspberryPi)によると、[userland](https://github.com/raspberrypi/userland.git)というリポジトリをcloneしビルドすることで`vcgencmd`コマンドが使用可能になります。
ただし64bit版はオフィシャルにはサポートされていないそうです。

自分がcloneしたのは `f73fca015d421b763936667a0b58fe5024d59921` でした。
READMEによると64bit OSの場合は./buildme --aarch64とすればビルド可能とあり、それでビルドができたという記事もありますが、上記バージョンをそのままビルドするとエラーが発生しました。

コミットログを確認したところ、`f97b1af1b3e653f9da2c1a3643479bfd469e3b74`で64bit用のビルドが設定がRevertされていました。
そのためこのコミットで行われた変更を再度戻し、また、それだけではビルドエラーが出たので修正も行いました。

自分が行った変更は[git hub](https://github.com/hiro-han/userland.git)にあげたので参考にしてください。
ビルド方法は以下になります。

```
$ sudo apt install build-essential cmake
$ git clone https://github.com/hiro-han/userland.git
$ cd userland
$ ./buildme --aarch64
```

これで /opt/vc/bin/ に`vcgencmd` コマンドがインストールされます。
なお、自分の環境ではこれで`vcgencmd`コマンドが動作しましたが、`raspistill`コマンドは動作しませんでした。また、他のコマンドについては試していません。

ラズパイカメラを接続した状態で、

```
$ sudo /opt/vc/bin/vcgencmd get_camera
supported=1 detected=1
```
となれば成功です。


# 参考
[公式のインストールガイド](https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview)
[Ubuntuのダウンロード](https://ubuntu.com/download/raspberry-pi)
[wifiの設定](https://machinanette.com/2019/09/07/raspberry-pi-3%E3%81%ABros2%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/)
[Ubuntu wiki](https://wiki.ubuntu.com/ARM/RaspberryPi)
[bluetoothの設定について](https://www.hiro345.net/blogs/hiro345/archives/19932.html)