Edited at

Raspberry Pi 3 を購入しました。

More than 1 year has passed since last update.

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

技適取得済みで、日本でも使用できます。安定供給されるようになり、 Amazon で5000円台で入手できる ほど値下がりしたので、ポチッとしてしまいました。

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

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

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


追記

Ubuntu 16.04 LTS の非公式イメージを使っていた所、突然死することが何度もあり不安定だったので、無難に 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 等、書き込み先のデバイスを指定します。

diskutil list

diskutil umountDisk /dev/null


イメージの取得と展開 & 書き込み

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

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 カードの為にも、お行儀良く次のコマンドを叩きましょう

diskutil eject /dev/null

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

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


起動

ブィィン... なんて音はしませんが、起動時に一瞬こんな画面になります。

僕の環境だけですかね…?多分問題無いので気にしないようにしてます。

Raspberry Pi のロゴがプロセッサのコア数分だけ表示されたら正常に起動してます。一先ず安心ですね。

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


Ethernet ケーブルを接続して SSH でログインするまで


DHCP

Ethernet ケーブルを接続すれば DHCP で自動的に IP アドレスが振られます。

しかし、 LAN ケーブルを違うネットワークに差し替えると、自動で IP アドレスが切り替わらない事があります。

その際は、手動で DHCP リースを開放して、再度 DHCP クライアントで IP アドレスを取得する必要があります。

sudo dhclient -r eth0

sudo dhclient eth0


SSH

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

$ ssh ubuntu@192.168.xxx.xxx

Connection closed by 192.168.xxx.xxx port 22


サービスは起動していますがエラーログが出ていました

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

鍵の中身を確認してみると、空っぽ。

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


無ければ生成しましょう

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 がホスト名です。


/etc/hosts (一部)

127.0.0.1 localhost ubuntu



ホスト名を変更する場合

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


/etc/hostname

ubuntu


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

sudo reboot


静的 IP アドレス

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

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 を再起動します。

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 ユーザ名を入れると便利です。

curl https://github.com/****.keys >> ~/.ssh/authorized_keys


パスワードを求められず、公開鍵認証が出来ている事が確認できたら、パスワード認証を無効化します。

sudo -e /etc/ssh/sshd_config


no に設定します。


/etc/ssh/sshd_config (一部)

# PasswordAuthentication yes

PasswordAuthentication no


ここで何もエラーが表示されなければ OK.

sudo sshd -t


サービス再起動

sudo systemctl restart ssh


⚠注意: interface name が変わる問題


apt upgrade チョット待った!!

この時点で sudo apt upgrade するとインターフェース名が eth0 から enx + MAC Address の形式に勝手に変わります。

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

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


70-persistent-net.rules の新規作成

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"



再起動すると反映されます

sudo reboot


package の upgrade

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

sudo apt update

sudo apt -y upgrade


タイムゾーンの設定

デフォルトでは UTC に設定されています。

チューナー鯖にする場合など、タイムゾーンが現地に合っていないと困る場合は設定を変更する必要があります。

http://qiita.com/ww24/items/0adc36c013511524da80


現在の時刻と設定確認

$ 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


タイムゾーンの設定と時刻の確認

$ 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 モジュールが搭載されているモデルなので、設定して使ってみましょう。


参考