LANケーブルだけでRaspberryPi2へUbuntuのインストール・初期設定

## やりたいこと
ディスプレイ・キーボード・マウスなし、ネット環境はWi-Fiしかない環境で、LANケーブルだけでRaspberryPi2へUbuntuのインストールと初期設定を行う


## お願い
試行錯誤してやっているので間違っている部分や勘違いしている部分があるかもしれません:sweat_drops:
もし見つけられたらご指摘いただけると嬉しいです:smiley:


## 環境
- Mac OS X High Sierra
- Raspberry Pi 2
- Ubuntu 18.04.2 LTS（ラズパイにインストールしたUbuntuのバージョン）
- ディスプレイ・キーボード・マウスなし
- ネット環境はWi-Fiのみ（有線LANなし）
- PLANEX 無線LAN子機 GW-USNANO2A
- SD Card 32GB
- LANケーブル（ストレートケーブル）


## 全体の流れ
- Ubuntuインストール
  - 公式サイトからラズパイ用のUbuntuをダウンロード
  - SDカードにUbuntuを書き込み
  - ラズパイにSDカードを挿入して電源をオン
- Macからラズパイに接続
  - MacとラズパイをLANケーブル（ストレートケーブル）で繋ぐ
  - ラズパイにIPアドレスを割り当てるため、Mac側で設定
  - MacからARPのキャッシュテーブルを参照してラズパイのIPアドレスを確認
  - MacからSSHでラズパイに接続
- 初期設定
  - Wi-Fi設定


## 手順
### Ubuntuインストール

- 公式サイトからラズパイ用のUbuntuをダウンロード
- SDカードにUbuntuを書き込み
- ラズパイにSDカードを挿入して電源をオン

[Install Ubuntu Server on a Raspberry Pi 2 or 3 | Ubuntu](https://www.ubuntu.com/download/iot/raspberry-pi-2-3)

こちらの公式サイトの通りに進めればOK

```bash
# バージョン確認
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```


### Macからラズパイに接続
まずはLANケーブル（ストレートケーブル）でMacとラズパイを接続します。
そのままではIPアドレスが割り当てられないので（？ここ理解が曖昧です:sweat_drops:）、Mac側の機能を使ってIPアドレスが割り当てられるようにします。

### ラズパイにIPアドレスを割り当てるため、Mac側で設定

- `システム環境設定 -> 共有`で「インターネット共有」にチェックを入れる
- 「相手のコンピュータが使用するポート」は「Ethernet」にチェックを入れる

Macのインターネット共有の機能は、MacをWi-Fiのアクセスポイントにする機能です。
そのため、インターネット共有しているMac自身がNAT変換をしDHCPサーバとして動作するようになるため、それに繋がっているラズパイにも自動的にIPアドレスを割り当ててくれます。

### MacからARPのキャッシュテーブルを参照してラズパイのIPアドレスを確認
```bash
# 接続されている全てのホストの情報を表示
$ arp -a
```

`192.168.2.x`のIPアドレスが割り当てられるようです。


### MacからSSHでラズパイに接続
```bash
# SSHで接続
# ssh ubuntu@[ラズパイのIPアドレス]
$ ssh ubuntu@192.168.2.1
```

ユーザ名とパスワードは公式サイトにも記載がありますが以下の通りです。
初回はログインしてすぐにパスワードを変更するように求められますので、変更しましょう。

```
ユーザ名: ubuntu
パスワード: ubuntu
```

## 初期設定
### Wi-Fi設定
有線のままでは煩わしいので、コマンドラインからWi-Fiの設定をします。


#### まずは周辺のアクセスポイントをスキャンしてみる
```bash
# Wireless tools for Linux をインストール
sudo apt install wireless-tools

# Wi-Fiのインターフェース名を確認
# 「wlan0」がインターフェース名
$ iwconfig
wlan0     IEEE 802.11  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          
eth0      no wireless extensions.

lo        no wireless extensions.

# アクセスポイントをスキャン
# いくつかSSIDが出てこればOK、接続したいSSIDを控えておく
# sudo iwlist [インターフェース名] scan
sudo iwlist wlan0 scan | grep ESSID
```


#### SSIDとパスワードを登録、ブート時に自動的に接続するようにする

調べると、よく`/etc/network/interfaces`に設定を書き込むという方法が出てくるのですが、このUbuntuのバージョン（18.04.2）では`netplan`コマンドを使って設定するように変更になっているようです。

```bash
# 「/etc/network/interfaces」を開くと、「ifupdown は netplan に置き換えられました」と書いてある
$ cat /etc/network/interfaces 
# ifupdown has been replaced by netplan(5) on this system.  See
# /etc/netplan for current configuration.
# To re-enable ifupdown on this system, you can run:
#    sudo apt install ifupdown
```

`netplan`コマンドを使って設定していきます。


```bash
$ ll /etc/netplan/
total 16
drwxr-xr-x  2 root root 4096 May 10 05:35 ./
drwxr-xr-x 99 root root 4096 May  9 23:30 ../
-rw-r--r--  1 root root  478 May 10 05:35 50-cloud-init.yaml
```

設定ファイルは`50-cloud-init.yaml`しか無いようなので、このファイルを編集していきます。
今回は以下のように編集。

```/etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    version: 2
    wifis:
        wlan0:
            access-points:
                "[接続するSSID]":
                    password: "[パスワード]"
            dhcp4: true
            dhcp6: true
```

書き方の詳細は[公式サイト](https://netplan.io/examples)が参考になります。

- パスワードは平文でそのまま記載
- インデントがずれると反映したときにエラーになるので間違えないように

```bash
# 設定を反映（反映自体は再起動は不要）
$ sudo netplan apply

# 起動時にきちんと自動的にWi-Fiに繋がるかを確認するため、一旦再起動
$ sudo reboot
```

<font color="red">しばらく時間を置いてからSSHで接続しようとするも、入れない…</font>:disappointed_relieved:

仕方なく仮設的にラズパイにディスプレイを接続して確認したところ、**なぜか直にログインするとWi-Fiネットワークに接続されるらしい。**
ログイン前に接続してほしいなー。

現状を確認してみると、NetworkManagerとnetworkdが両方ブート時に自動起動している状態。

```bash
$ systemctl is-enabled systemd-networkd
enabled

$ systemctl is-enabled network-manager
enabled

$ systemctl status systemd-networkd
● systemd-networkd.service - Network Service
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-05-10 12:57:05 UTC; 51min ago
     Docs: man:systemd-networkd.service(8)
 Main PID: 1135 (systemd-network)
   Status: "Processing requests..."
    Tasks: 1 (limit: 2151)
   CGroup: /system.slice/systemd-networkd.service
           └─1135 /lib/systemd/systemd-networkd

May 10 13:33:15 ubuntu systemd-networkd[1135]: wlan0: Gained carrier
May 10 13:33:15 ubuntu systemd-networkd[1135]: wlan0: Lost carrier
May 10 13:33:15 ubuntu systemd-networkd[1135]: wlan0: Gained carrier
May 10 13:33:16 ubuntu systemd-networkd[1135]: wlan0: DHCPv4 address 192.168.128.113/24 via 192.168.128
May 10 13:33:25 ubuntu systemd-networkd[1135]: wlan0: Lost carrier
May 10 13:33:25 ubuntu systemd-networkd[1135]: wlan0: DHCP lease lost
May 10 13:33:25 ubuntu systemd-networkd[1135]: wlan0: Gained carrier
May 10 13:33:25 ubuntu systemd-networkd[1135]: wlan0: Lost carrier
May 10 13:33:25 ubuntu systemd-networkd[1135]: wlan0: Gained carrier
May 10 13:33:26 ubuntu systemd-networkd[1135]: wlan0: DHCPv4 address 192.168.128.113/24 via 192.168.128

$ systemctl status network-manager
● NetworkManager.service - Network Manager
   Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-05-10 12:59:13 UTC; 49min ago
     Docs: man:NetworkManager(8)
 Main PID: 1193 (NetworkManager)
    Tasks: 3 (limit: 2151)
   CGroup: /system.slice/NetworkManager.service
           └─1193 /usr/sbin/NetworkManager --no-daemon

May 10 13:33:05 ubuntu NetworkManager[1193]: <warn>  [1557495185.4893] device (wlan0): re-acquiring supplicant interface (#3).
May 10 13:33:05 ubuntu NetworkManager[1193]: <error> [1557495185.6193] sup-iface[0xe4a148,wlan0]: error adding interface: wpa_supplicant couldn't grab this interface.
May 10 13:33:05 ubuntu NetworkManager[1193]: <info>  [1557495185.6198] device (wlan0): supplicant interface state: starting -> down
May 10 13:33:15 ubuntu NetworkManager[1193]: <warn>  [1557495195.4973] device (wlan0): re-acquiring supplicant interface (#4).
May 10 13:33:15 ubuntu NetworkManager[1193]: <error> [1557495195.6348] sup-iface[0xe4a1b0,wlan0]: error adding interface: wpa_supplicant couldn't grab this interface.
May 10 13:33:15 ubuntu NetworkManager[1193]: <info>  [1557495195.6351] device (wlan0): supplicant interface state: starting -> down
May 10 13:33:25 ubuntu NetworkManager[1193]: <warn>  [1557495205.4977] device (wlan0): re-acquiring supplicant interface (#5).
May 10 13:33:25 ubuntu NetworkManager[1193]: <error> [1557495205.6387] sup-iface[0xe4a218,wlan0]: error adding interface: wpa_supplicant couldn't grab this interface.
May 10 13:33:25 ubuntu NetworkManager[1193]: <info>  [1557495205.6390] device (wlan0): supplicant interface state: starting -> down
May 10 13:33:25 ubuntu NetworkManager[1193]: <info>  [1557495205.6393] device (wlan0): supplicant interface keeps failing, giving up
```

**NetworkManagerが思いっきりコケてる！**

`/etc/netplan/50-cloud-init.yaml`で`renderer: networkd`だけ指定すればnetworkdの方を使ってくれるかなと思ったら上手くいかなかった。

NetworkManagerを使わないよう、自動起動をオフにする。

```bash
# NetworkManagerの自動起動をオフにする
$ sudo systemctl disable network-manager
Synchronizing state of network-manager.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable network-manager
Removed /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.

# 自動起動設定がオフになっていることを確認
$ systemctl is-enabled network-manager
disabled

# 再び再起動
$ sudo reboot
```

しばらくしてSSHで接続できることを確認！やった！:sparkles:

Wi-Fiのルータから取得したIPアドレスが割り当てられているのが確認できる。

```bash
$ iwconfig
wlan0     IEEE 802.11  ESSID:"[接続しているSSID]" # <- きちんと指定のSSIDに接続されている
          Mode:Managed  Frequency:2.462 GHz  Access Point: F4:CB:52:F3:43:C2   
          Bit Rate=150 Mb/s   Tx-Power=20 dBm   
          Retry short limit:7   RTS thr=2347 B   Fragment thr:off
          Power Management:off
          Link Quality=70/70  Signal level=-36 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:92   Missed beacon:0

eth0      no wireless extensions.

lo        no wireless extensions.

$ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 416  bytes 30148 (30.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 416  bytes 30148 (30.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.128.113  netmask 255.255.255.0  broadcast 192.168.128.255 # <- きちんとIPが割り当てられている
        ether 00:22:cf:f5:c8:95  txqueuelen 1000  (Ethernet)
        RX packets 109  bytes 14707 (14.7 KB)
        RX errors 0  dropped 2  overruns 0  frame 0
        TX packets 83  bytes 15529 (15.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

ちなみにMacから`nmap`でスキャンすると、

```bash
$ nmap 192.168.128.113 -p 22
Starting Nmap 7.70 ( https://nmap.org ) at 2019-05-11 00:10 JST
Nmap scan report for ubuntu (192.168.128.113)
Host is up (0.0072s latency).

PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
```

割り当てられた`192.168.128.113`でSSH接続が可能なことが確認できる。

#### [余談] ネットワークマネージャーの種類とまとめ
- **Netplan**
  - ネットワークの設定を抽象化
  - 設定はYAML形式で記述する
  - 設定ファイルは`/etc/netplan/*.yaml`
  - バックエンドとして「NetworkManager」や「networkd」を使う

> - WiFiとWWANに関しては、NetworkManagerが制御する
> - その他の制御デバイスに関しては、特定のデバイスを指定しない限り、デフォルトでnetworkdが制御する

> [Netplanとは - komeの備忘録](https://www.komee.org/entry/2018/06/08/163000)

- **/etc/network/interfaces**
  - NetworkManagerが登場する以前の設定方法
  - `wpa_passphrase`コマンドで出力した情報を`/etc/wpa_supplicant/wpa_supplicant.conf`の設定ファイルに保存、`/etc/network/interfaces`に設定ファイルのパスを指定して読み込ませる  
  [Linuxで無線LANをコマンドで接続する(raspi 用) - それマグで！](http://takuya-1st.hatenablog.jp/entry/2015/05/17/155229)

- **NetworkManager**

```bash
$ systemctl status network-manager
$ systemctl start network-manager
$ systemctl stop network-manager

# 自動起動設定の確認
$ systemctl is-enabled network-manager
enabled

$ nmcli
```


- **networkd**

```bash
$ systemctl status systemd-networkd
$ systemctl start systemd-networkd
$ systemctl stop systemd-networkd

# 自動起動設定の確認
$ systemctl is-enabled systemd-networkd
enabled
```

### 参考にしたサイト

- [OSXのインターネット共有はDHCPが必ずついてくる - Qiita](https://qiita.com/honeniq/items/7e825ca6414c39374484)
- [Ubuntu18.04でのネットワーク設定方法【CUI】 | ガジェット好きの日記](https://mongonta.com/f347-howto-setup-ipaddress-on-ubuntu-server-and-core/)
- [Ubuntu 18.04: ネットワークを設定する - Narrow Escape](https://www.hiroom2.com/2018/05/29/ubuntu-1804-network-ja/#sec-1)
- [nmapでpingスキャン、ポートスキャン - mikedaの日記](https://mikeda.hatenablog.com/entry/20090314/1237108855)