Raspberry Pi 3 を購入しました。

Bluetooth, WLAN モジュール内蔵の Raspberry Pi 3 Model B.

技適取得済みで、日本でも使用できます。安定供給されるようになり、 [Amazon で5000円台で入手できる](https://www.amazon.co.jp/gp/product/B01CFHHYF4/) ほど値下がりしたので、ポチッとしてしまいました。

因みに、安価な element14 製ではなく、 RS Components 製です。

開封時の感想として、特にイギリスの香りはしませんでした。そもそもイギリスへ行ったことがないので確認しようがありません。

さて、この投稿では Ubuntu 16.04 LTS の Raspberry Pi 3 用インストール済みイメージを microSD カードに書き込んでセットアップしていきます。

>追記
Ubuntu 16.04 LTS の非公式イメージを使っていた所、突然死することが何度もあり不安定だったので、無難に [Raspbian](https://www.raspberrypi.org/downloads/raspbian/) を使うことをお勧めします :bow:

必要な物
===
- microSD カード (4GB 以上)
- HDMI 接続可能なモニタ
- USB 接続のキーボード
- 5V 2.5A 以上供給可能な電源 (microUSB)
- Ethernet ケーブル

※ HDMI 接続可能なモニタが無い場合は DVI-D or DVI-I 対応モニタ + HDMI DVI-D 変換アダプタで代用する事ができます。Raspberry Pi 3 はデジタル映像音声出力にしか対応していないため、 HDMI DVI-A 変換や HDMI VGA 変換には対応していないので注意が必要です。

OS イメージの書き込み
===
Mac を用いたイメージの書き込みです。

Ubuntu の Raspberry Pi 用 image: https://wiki.ubuntu.com/ARM/RaspberryPi

### microSD カードの特定とアンマウント
`diskutil list` を microSD カードの挿入前と挿入後で実行すると、どれが microSD カードを示すデバイス名なのか容易に判明します。

事故防止の為、外付け記憶媒体は microSD カード以外は外して作業しましょう。

※ `/dev/null` の箇所は `/dev/disk4` 等、書き込み先のデバイスを指定します。

```shell-session
diskutil list
diskutil umountDisk /dev/null
```

### イメージの取得と展開 & 書き込み
書き込み先の `/dev/null` の箇所は、デバイスが `/dev/disk4` の場合、 `/dev/rdisk4` のように `disk` の前に `r` を付けるとバッファを介さない分速く書き込まれます。

```shell-session
wget http://www.finnie.org/software/raspberrypi/ubuntu-rpi3/ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz
xzcat ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz | sudo dd of=/dev/null
```

進捗が知りたい場合は `Ctrl+T` を入力すると進捗状況が表示されます。

### eject
CD ドライブのように物理的に eject されることはありませんが、 microSD カードの為にも、お行儀良く次のコマンドを叩きましょう

```shell-session
diskutil eject /dev/null
```

microSD カードを Raspberry Pi 3 に挿入して、電源投入(micro USB)。

ここでモニタが必要になります。すぐに SSH で繋げる環境にはならないので、画面に表示される映像を想像して入力するのは人間には無理です。諦めてモニタを接続しましょう。

### 起動
ﾌﾞｨｨﾝ... なんて音はしませんが、起動時に一瞬こんな画面になります。
僕の環境だけですかね…？多分問題無いので気にしないようにしてます。
![!?](https://qiita-image-store.s3.amazonaws.com/0/1804/25ecbb8e-7eef-75ac-eadb-16c48befb987.jpeg)

Raspberry Pi のロゴがプロセッサのコア数分だけ表示されたら正常に起動してます。一先ず安心ですね。
![Boot](https://qiita-image-store.s3.amazonaws.com/0/1804/99345dfc-fcce-94f2-30cb-47387a076e96.jpeg)

起動しない場合 (ACT ランプが点灯しない場合) は、 microSD カードの接触不良か microSD カードを焼くのに失敗したか、焼いたイメージが壊れている可能性を疑ってください。

Ethernet ケーブルを接続して SSH でログインするまで
===
DHCP
---
Ethernet ケーブルを接続すれば DHCP で自動的に IP アドレスが振られます。

しかし、 LAN ケーブルを違うネットワークに差し替えると、自動で IP アドレスが切り替わらない事があります。
その際は、手動で DHCP リースを開放して、再度 DHCP クライアントで IP アドレスを取得する必要があります。

```shell-session
sudo dhclient -r eth0
sudo dhclient eth0
```

SSH
---
いきなり SSH しようとしても、切断されてしまいます。

```
$ ssh ubuntu@192.168.xxx.xxx
Connection closed by 192.168.xxx.xxx port 22
```

### サービスは起動していますがエラーログが出ていました
```shell-session
sudo systemctl status ssh
```

### エラーログの一部
```
error: key_load_public: invalid format
error: Could not load host key: /etc/ssh_host_rsa_key
error: key_load_public: invalid format
error: Could not load host key: /etc/ssh_host_dsa_key
error: key_load_public: invalid format
error: Could not load host key: /etc/ssh_host_ecdsa_key
```

鍵の中身を確認してみると、空っぽ。
インストール済みのイメージを配布している都合上、鍵を含めてしまうとセキュリティ上問題があるので、敢えて空のファイルを配置しているのだと思います。

### 無ければ生成しましょう
```shell-session
sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
sudo ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
sudo ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa
sudo ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -N '' -t ed25519
```

sudo 実行時のエラー
---
### 特に何も設定をしていないと `sudo` を使う際に次のエラーが出ます。
```
sudo: unable to resolve host ubuntu
```

`/etc/hosts` に hostname が設定されていないことが原因なので、 `hostname` コマンドでホスト名を確認して `/etc/hosts` に追加します。

### localhost の次に `hostname` を追加。この場合は `ubuntu` がホスト名です。
```text:/etc/hosts&nbsp;(一部)
127.0.0.1 localhost ubuntu
```

### ホスト名を変更する場合
ホスト名を変更する場合は上記の `/etc/hosts` に加えて `/etc/hostname` にも変更が必要です。

```text:/etc/hostname
ubuntu
```

反映させるには再起動する必要があります。

```shell-session
sudo reboot
```

静的 IP アドレス
---
DHCP の場合、 SSH で繋ぐ際にディスプレイに接続して IP アドレスを確認する必要があり手間なので、静的 IP アドレスを割り当てます。

```shell-session
sudo -e /etc/network/interfaces.d/50-cloud-init.cfg
```

### 設定例
```:/etc/network/interfaces.d/50-cloud-init.cfg
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.0.180
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns-nameservers 192.168.0.1
```

### networking.service を再起動します。
```shell-session
sudo systemctl restart networking
```

```
ubuntu@ubuntu:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/sit 0.0.0.0 brd 0.0.0.0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.30/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.180/24 brd 192.168.0.255 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 ****::****:****:****:****/64 scope link tentative
       valid_lft forever preferred_lft forever
4: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:27:eb:**:**:** brd ff:ff:ff:ff:ff:ff
```

`secondary` として設定されました。

公開鍵認証
---
### `****` の所に自分の GitHub ユーザ名を入れると便利です。
```shell-session
curl https://github.com/****.keys >> ~/.ssh/authorized_keys
```

### パスワードを求められず、公開鍵認証が出来ている事が確認できたら、パスワード認証を無効化します。
```shell-session
sudo -e /etc/ssh/sshd_config
```

### no に設定します。
```:/etc/ssh/sshd_config&nbsp;(一部)
# PasswordAuthentication yes
PasswordAuthentication no
```

### ここで何もエラーが表示されなければ OK.
```shell-session
sudo sshd -t
```

### サービス再起動
```shell-session
sudo systemctl restart ssh
```

⚠注意: interface name が変わる問題
===
apt upgrade チョット待った！!
---
この時点で `sudo apt upgrade` するとインターフェース名が `eth0` から `enx` + MAC Address の形式に勝手に変わります。

折角、静的 IP アドレスを eth0 に対して設定したにも関わらず、再設定することになるので手間です。

そこで、事前にインターフェース名が変わらないように設定しておくことをお勧めします。

### `70-persistent-net.rules` の新規作成
```shell-session
sudo -e /etc/udev/rules.d/70-persistent-net.rules
```

`b8:27:eb:**:**:**` の箇所には MAC アドレスを入れます。

```:/etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:27:eb:**:**:**", ATTR{dev_id}=="0x0", ATTR{type}=="1", NAME="eth0"
```

### 再起動すると反映されます
```shell-session
sudo reboot
```

package の upgrade
===
ここまで上手く行けば、きっと大丈夫です。

```shell-session
sudo apt update
sudo apt -y upgrade
```

タイムゾーンの設定
===
デフォルトでは UTC に設定されています。
チューナー鯖にする場合など、タイムゾーンが現地に合っていないと困る場合は設定を変更する必要があります。
http://qiita.com/ww24/items/0adc36c013511524da80

現在の時刻と設定確認
---
```shell-session
$ date
Sun Aug 28 12:37:11 UTC 2016

$ timedatectl
      Local time: Sun 2016-08-28 12:37:16 UTC
  Universal time: Sun 2016-08-28 12:37:16 UTC
        RTC time: n/a
       Time zone: UTC (UTC, +0000)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no
```

タイムゾーンの設定と時刻の確認
---
```shell-session
$ sudo timedatectl set-timezone Asia/Tokyo

$ timedatectl
      Local time: Sun 2016-08-28 21:38:18 JST
  Universal time: Sun 2016-08-28 12:38:18 UTC
        RTC time: n/a
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

$ date
Sun Aug 28 21:38:20 JST 2016
```

次回予告: Bluetooth と WLAN の設定
===
Bluetooth と WLAN モジュールが搭載されているモデルなので、設定して使ってみましょう。

参考
===
- http://raspberrypi.stackexchange.com/questions/43560/raspberry-pi-3-eth0-wrongfully-named-enx