Coral Edge TPU (USB type) を Pi4 + Ubuntu Server 19.10.1 (64 bit) で動作させる : 前編

* 旬なネタが降ってきてくれたおかげで、今年も無事に
[Qiita Advent Calendar](https://qiita.com/advent-calendar/2019/) に参加することができました。

* 今年は、ようやく日本で遊ぶことができるようになった
**Pi4** を使って戯れてみたいと思います。
	* 長くなったので、前後編に分割します。
		* [後編はこちら](https://qiita.com/andromedroid/items/51ead20df009053bdd24)
	* 前編では、Pi4 に Ubuntu Server 19.10.1 を install し、  
	初期設定を完了するまでを行います。

* 2020/02/15 追記:
	* [Ubuntu 18.04.4](http://ftp.jaist.ac.jp/pub/Linux/ubuntu-cdimage/ubuntu/releases/18.04.4/release/) がリリースされ、  
	Pi4 でも **bionic (LTS)** が利用可能になったため、  
	そちらでも通用する内容に一部修正しました。

## 12/13 日のこと

* 今年は Advent Calendar に乗り遅れちゃったなぁなどと思う、
ある日の朝、
	* [ドーン！ → Ubuntu Weekly Topics](https://gihyo.jp/admin/clip/01/ubuntu-topics/201912/13)
		* 吉田史さん！いつも旬なニュースをありがとうございます :bow: 

* Pi4 向けの 64 bit OS の選択肢は、これまでにもいくつかありましたが、
4 GB RAM モデルで **USB の動作がおかしくなる**不具合が報告されており、
今回の Ubuntu Server 19.10.1 では、それが改善されているとのこと。

* 早速、見てみます。

## Ubuntu Server 19.10.1 for Pi4

* [公式配布サイト](https://ubuntu.com/download/raspberry-pi)
	* 一応、32 bit OS 版もあるようです。
	* _You can install a desktop if you like_
		* Server なのにこの心遣い…泣けますね。

* とりま、download しましょう。

~~~
$ export URL='http://ftp.jaist.ac.jp/pub/Linux/ubuntu-cdimage/ubuntu/releases/19.10.1/release'
$ export IMG='ubuntu-19.10.1-preinstalled-server-arm64+raspi3.img.xz'
$ wget -c -t 0 ${URL}/${IMG}
... downloading ... then finished.
$ md5sum $IMG
00a09c3cbf45245dcc43132ba7cf671c
~~~

* 19.10.1 ではなく 18.04.4 を利用する場合はこちら

~~~
$ export URL='http://ftp.jaist.ac.jp/pub/Linux/ubuntu-cdimage/ubuntu/releases/18.04.4/release'
$ export IMG='ubuntu-18.04.4-preinstalled-server-arm64+raspi3.img.xz'
$ wget -c -t 0 ${URL}/${IMG}
... downloading ... then finished.
$ md5sum $IMG
2d26ee632a949d8a7f4474350d31b303
~~~

## install to your micro SD (@ Mac)

* micro SD に image を焼いていきます。
	* 基本的には Raspbian と同じなので、  
	皆様は既に勝手を十分にご存知だと思いますが、  
	私の Mac 環境での手順を記載しておきます。

* micro SD を入れる前に、
disk の device file 名を確認しておきます。

~~~
$ ll /dev/disk*
brw-r-----  1 root  operator    1,   0 12 14 13:54 /dev/disk0
brw-r-----  1 root  operator    1,   1 12 14 13:54 /dev/disk0s1
brw-r-----  1 root  operator    1,   2 12 14 13:54 /dev/disk0s2
brw-r-----  1 root  operator    1,   3 12 14 13:54 /dev/disk0s3
~~~

* micro SD を入れた後、再度 disk の device file 名を確認します。

~~~
$ ll /dev/disk*
brw-r-----  1 root  operator    1,   0 12 14 13:54 /dev/disk0
brw-r-----  1 root  operator    1,   1 12 14 13:54 /dev/disk0s1
brw-r-----  1 root  operator    1,   2 12 14 13:54 /dev/disk0s2
brw-r-----  1 root  operator    1,   3 12 14 13:54 /dev/disk0s3
brw-r-----  1 root  operator    1,   4 12 14 14:46 /dev/disk1
brw-r-----  1 root  operator    1,   6 12 14 14:46 /dev/disk1s1
~~~

* `/dev/disk1` が新たに現れたので、これが  
挿入した SD の device file だと分かります。
	* image 書き込みの準備のために unmount しておきます。

~~~
$ diskutil unmount /dev/disk1s1
~~~

* img を SD に焼きます。
	* `/dev/rdiskX` の部分は環境によって数字が異なります。  
	間違えると **System Disk や大切なデータを破壊してしまうため、**  
	十分にご注意ください。
		* Mac では dd の出力先は /dev/disk の代わりに  
		[**/dev/rdisk** を指定する方が書き込み速度が速いようです。](https://research.itplants.com/?p=1575)

~~~
$ export DISK='/dev/rdiskX'
$ unxz -c $IMG | sudo dd of=${DISK} bs=16m; sync; echo finished
~~~

* $IMG 変数は先程 download したものを使用しています。
* `finished` と出たら、SD を取り出して Pi4 に挿入します。

## Pi4 の起動

* 普通に起動します。
	* Ubuntu Server for RasPi では、login name が  
	`pi` ではなく `ubuntu` なのでご注意ください。

* 初期 password も `raspberry` ではなく `ubuntu` ですが、
初回起動時は打ち込んでも通らない場合があります。
	* 焦りますが、boot 処理が一段落してから  
	再トライすると通りますので、ご安心ください。
	* ログインに成功すると、新しい password への変更を求められます。

## WLAN の設定 : netplan.io

* Ubuntu Desktop ではおなじみの NetworkManager が、なんと
Ubuntu Server では入っていないということで、少し狼狽しました。

* どうやら Ubuntu Server の Network Setting は
**netplan.io** というやつが仕切っているようなので、
無線 LAN の設定をしていきます。

~~~
~$ sudo cp -a /etc/netplan/50-cloud-init.yaml /etc/netplan/51-wifi-init.yaml
~$ sudo vi /etc/netplan/51-wifi-init.yaml
~~~

* example を参考に必要な変更を行います。
	* 以下はルーターが **IPv4** で **DHCP** 運用、  
	無線 AP が **WPA2-PSK** の場合の設定例です。
	* `wlan0` の行、変えるのを結構忘れがちなのでご注意を。

~~~
~$ cat /etc/netplan/51-wifi-init.yaml 
network:
  wifis:
    wlan0:
      dhcp4: yes
      dhcp6: no
      access-points:
        "your-ssid":
          password: "your-secret-passphrase"
  version: 2
~~~

* 設定後、変更を適用し、再起動します。
	* ↓ exit は ~/.bash_history に  
	コマンドログを記帳するためにしています。

~~~
~$ sudo netplan apply
~$ sudo reboot; exit
~~~

* 再起動後、無事に接続できていました。

~~~
~$ networkctl list
IDX LINK             TYPE               OPERATIONAL      SETUP     
  1 lo               loopback           carrier          unmanaged 
  2 eth0             ether              no-carrier       configuring
  3 wlan0            wlan               routable         configured

3 links listed.

~$ ip a show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether dc:a6:32:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.117/24 brd 192.168.1.255 scope global dynamic wlan0
       valid_lft 85510sec preferred_lft 85510sec

$ netplan ip leases wlan0
# This is private data. Do not parse.
ADDRESS=192.168.1.117
NETMASK=255.255.255.0
ROUTER=192.168.1.1
SERVER_ADDRESS=192.168.1.1
T1=43200
T2=74044
LIFETIME=86400
DNS=192.168.1.1
~~~

## apt の設定

* package を最新にするため、apt の設定を行います。

* RasPi の CPU は ARM の Cortex-A シリーズなので、
通常の PC とは package server が異なります。

	| CPU architecture | package server |
	|:----------------:|:--------------:|
	| x86_64 (amd64) | jp.archive.ubuntu.com |
	| aarch64, armhf | ports.ubuntu.com |

* default の更新 server である ports.ubuntu.com は
世界中のたくさんの人が利用するので、mirror に変更しましょう。
	* ※文末に mirror server との response 比較しています。

* 日本の mirror である jp.archive.ubuntu.com でも
ARM 用の [ubuntu-ports/](http://jp.archive.ubuntu.com/ubuntu-ports/) が用意されているのですが、[LTS しかない](http://jp.archive.ubuntu.com/ubuntu-ports/dists/)
ので、もっともご近所の[台湾の mirror](http://ftp.ubuntu-tw.org/ubuntu-ports/) を使わせて頂きます。
	* 台湾さんありがとうございます！

~~~
~$ cd /etc/apt/ && sudo gzip -k sources.list && cd -
~$ sudo vi /etc/apt/sources.list
~~~

* こんな感じになれば OK です。↓

~~~
~$ cat /etc/apt/sources.list | grep ^deb
deb http://ftp.ubuntu-tw.org/ubuntu-ports eoan main restricted universe multiverse
deb http://ftp.ubuntu-tw.org/ubuntu-ports eoan-updates main restricted universe multiverse
deb http://ftp.ubuntu-tw.org/ubuntu-ports eoan-backports main restricted universe multiverse
deb http://ftp.ubuntu-tw.org/ubuntu-ports eoan-security main restricted universe multiverse
~~~

* 続いて apt update, upgrade します。  
まだリリースされて間もないので、ほとんど更新はありませんでした。

~~~
~$ sudo apt update && sudo apt upgrade
~~~

## apt install lubuntu-desktop

* せっかく desktop package の案内もされていますし、  
まだ LXQt に移行してからの Lubuntu を試したことが無かったので、  
ここでは **Lubuntu Desktop** を入れてみました。

~~~
~$ sudo apt install lubuntu-desktop
~~~

* deb packages の fetch が終わった頃に、こんな CUI Dialog が出ます。

~~~
 ┌─────────────────────────────────────┤ Configuring gdm3 ├──────────────────────────────────────┐
 │ A display manager is a program that provides graphical login capabilities for the X Window    │ 
 │ System.                                                                                       │ 
 │                                                                                               │ 
 │ Only one display manager can manage a given X server, but multiple display manager packages   │ 
 │ are installed. Please select which display manager should run by default.                     │ 
 │                                                                                               │ 
 │ Multiple display managers can run simultaneously if they are configured to manage different   │ 
 │ servers; to achieve this, configure the display managers accordingly, edit each of their      │ 
 │ init scripts in /etc/init.d, and disable the check for a default display manager.             │ 
 │                                                                                               │ 
 │ Default display manager:                                                                      │ 
 │                                                                                               │ 
 │                                             gdm3                                              │ 
 │                                             sddm                                              │ 
 │                                                                                               │ 
 │                                                                                               │ 
 │                                            <Ok>                                               │ 
 │                                                                                               │ 
 └───────────────────────────────────────────────────────────────────────────────────────────────┘ 
~~~

* こちらを参考にし、ここでは gdm3 を選択して進めました。
	* [Ubuntuでディスプレイマネージャを切り替える理由と方法](https://ja.clccomputers.com/why-how-switch-display-manager-ubuntu)

* その後はほったらかしで、40 分ほどで終了。

~~~
Processing triggers for libgdk-pixbuf2.0-0:arm64 (2.40.0+dfsg-1build1) ...
Processing triggers for rygel (0.38.1-2ubuntu3.3) ...
Processing triggers for libc-bin (2.30-0ubuntu2) ...
Processing triggers for systemd (242-7ubuntu3.2) ...
Processing triggers for dbus (1.12.14-1ubuntu2) ...
~$ 
~~~

* Lubuntu Desktop を install した後の
16 GB SD の Disk 使用量はこのくらいです。

~~~
~$ df -h | sort | grep ^/dev/mmcblk
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p1  253M  132M  121M  53% /boot/firmware
/dev/mmcblk0p2   15G  4.9G  8.8G  36% /
~~~

* 8 GB SD でも余裕で入りそうですね！

* 再起動して、Lubuntu さんが立ち上がるのを待ちます。

~~~
~$ sudo reboot; exit
~~~

## Lubuntu さんのお出まし

* いつもより少し長めの起動の後、無事に DM が表示されました。
	* gdm3 を選択すると、見慣れた Ubuntu ぽいログイン画面が表示されます。

* ログイン直後のスクショがこちら↓
	![desktop_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275706/1527afc9-9f87-951f-e6d9-ec14f2ea28d3.png)
	* …Windows 95 かな？

* Ctrl + Alt + t で QTerminal が起動しました。
	![desktop_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275706/73a06454-0fc9-aa18-9f62-dece216f7c98.png)
	* うむ、User Interface としては、**これで十分ですね！**

---

## 次回予告

* [次回](https://qiita.com/andromedroid/items/51ead20df009053bdd24)は、Coral Edge TPU と接続して、  
他の環境とのベンチマークを行なっていきたいと思います。

---

## 備考

* Pi4 で作業している際に wlan0 がよく切れました。
	* dmesg で error: -110 がたくさん出ていたので、  
	driver がまだ不安定なのか、はたまた  
	5V2A の iPad の AC アダプターが力不足なのか…。

* reboot すると、またゴキゲンに繋がるのですが、
時間が経つとほぼ必ず発生するので、有線 LAN に変更しました…。

* 2020/02/15 追記
	* 久しぶりに 19.10 で起動すると wlan0 が繋がらなかったのですが、
	[こちらの対応](https://unix.stackexchange.com/questions/458406/network-manager-works-but-wlan-is-unavailable-for-nmcli) :arrow_down: をすると（？）無事に繋がりました。

		~~~
		$ sudo wpa_cli -i wlan0

		> ADD_NETWORK
		> SET_NETWORK 0 ssid "AP_NAME"
		> SET_NETWORK 0 psk "passphrase"
		> ENABLE_NETWORK 0
		> quit
		~~~

		* 18.04 では今の所そのようなことは無いので、  
		安定志向の方は 18.04 をお勧めします…

---

## おまけ

### ports.ubuntu.com vs ftp.ubuntu-tw.org

* 一応 response を見てみました。

~~~
~$ nslookup ports.ubuntu.com 8.8.8.8
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
Name:	ports.ubuntu.com
Address: 91.189.88.150
Name:	ports.ubuntu.com
Address: 2001:67c:1360:8001::22

~$ ping -c 4 91.189.88.150
PING 91.189.88.150 (91.189.88.150) 56(84) bytes of data.
64 bytes from 91.189.88.150: icmp_seq=1 ttl=50 time=248 ms
64 bytes from 91.189.88.150: icmp_seq=2 ttl=50 time=263 ms
64 bytes from 91.189.88.150: icmp_seq=3 ttl=50 time=250 ms
64 bytes from 91.189.88.150: icmp_seq=4 ttl=50 time=264 ms

--- 91.189.88.150 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 248.189/256.149/263.774/7.211 ms
~~~

~~~
~$ nslookup ftp.ubuntu-tw.org 8.8.8.8
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
ftp.ubuntu-tw.org	canonical name = ftp.ubuntu-tw.net.
ftp.ubuntu-tw.net	canonical name = ncnu.ftp.ubuntu-tw.net.
Name:	ncnu.ftp.ubuntu-tw.net
Address: 163.22.17.70
Name:	ncnu.ftp.ubuntu-tw.net
Address: 2001:e10:6840:17::70

~$ ping -c 4 163.22.17.70
PING 163.22.17.70 (163.22.17.70) 56(84) bytes of data.
64 bytes from 163.22.17.70: icmp_seq=1 ttl=47 time=49.7 ms
64 bytes from 163.22.17.70: icmp_seq=2 ttl=47 time=61.9 ms
64 bytes from 163.22.17.70: icmp_seq=3 ttl=47 time=51.0 ms
64 bytes from 163.22.17.70: icmp_seq=4 ttl=47 time=61.2 ms

--- 163.22.17.70 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 49.743/55.976/61.928/5.619 ms
~~~

* たぶんこれが一番早いと思います。

---

## EOF