ディスプレイ・キーボード・マウス・LANケーブルなしでラズパイ３のセットアップ（初心者向け）

# はじめに
眠ってたラズパイを復活させようと、久しぶりに初期セットアップしてみました。
ラズパイ自体は安いけど、色々揃えたらお金かかるじゃんって人に参考になれば幸いです。
【重要】初心者向けの内容と言いつつ、Windows向けではありません。Ubuntu他Linuxユーザ向けです。

# きっかけ
ググると、「ディスプレイ・キーボード・マウスなし」でラズパイをセットアップできるという記事はたくさん出ます。
そして、最後の段階でLANケーブルでSSH接続して設定する、なんて記事を多く見かけます（とても参考になりました）。
でも、ラズパイのセットアップのためだけにLANケーブルを買うのは面倒ですし、上から目線で「惜しいなぁ」なんて思ってました。

それに加え、自分のパソコンはBUFFALO WLI-UTX-AG300/CでLANポートが埋まってて、
つまるところ面倒くさいので無線LANだけでイケないかと思い、やってみたらできました。
「ディスプレイ・キーボード・マウス・LANケーブルなしでラズパイ３のセットアップ」です。

今さらな内容ですが、備忘録を兼ねるということで…。
それと、Windows向けではありません。Macなら同じようにできるとは思います（無責任）。

# 作業の流れ
自分を含めた初心者向けの内容だと思うので、これだけでわかる人にはそれで大丈夫です。

　1. 環境構築用PCで、RASPBIAN STRETCHをddでSDカードに書き込む
　2. ラズパイにSDカードを入れないで、環境構築用PCで無線LANのSSIDとパスワードを設定する
　3. ラズパイにSDカードを入れないで、環境構築用PCで固定ipを設定する
　4. ラズパイにSDカードを入れないで、環境構築用PCでSSHを有効にする
　5. ラズパイにSDカードを入れて、起動後、環境構築用PCからSSH接続、ラズパイの各種設定を行う

# 使用したもの（環境）
言葉足らずなのでちゃんと書くと、

* 環境構築用のパソコン（Ubuntu 18.04）
* 無線LANルータ（自分の場合、ソネットから送られてきたONUでインターネット接続兼用のもの）
* SDカードリーダ

を使用しました。
もちろんRaspberry Pi3やPI用のSDカードと電源は揃っているという前提です。

# 公式サイトから最新版RASPBIAN STRETCHをダウンロードする
まずはここからRASPBIAN STRETCHの最新版をダウンロードします。
　https://www.raspberrypi.org/downloads/raspbian/　
DESKTOPでもLITEでも好きな方でいいと思います。
今回は何も考えずにDESKTOPをダウンロードしました。
直接ダウンロードだと重いし途切れるしなので、環境が許せば、Torenntの方が楽です。

# ダウンロードしたZIPを展開する
ダウンロードしたZIPファイルにimgファイルが入っているので、アーカイブマネージャで展開します。
何も考えずにダブルクリックして、imgファイルを適当なところに置くだけです。
今回はダウンロードフォルダにそのまま展開しました。

# SDカードのマウントポイントを調べてアンマウントする
パソコンにSDカードを接続するとそのままマウントされたので、一度アンマウントします。
Ubuntuの場合、スーパーキー（Windowsキー）で「d」と打つと「ディスク」が出てくるので起動します。
「ディスク」ではデバイスの情報が読めます。
今回、SDカードは sdc として認識されていることがわかりました。
詳細は他に譲るとして、SDカードを選択し、「ー」を押してアンマウントします。

terminalでも同じ作業ができます。lsblk と umount を使用します。

まず、SDカードを刺す前と刺した後の２回を比較します。

SDカードを刺す前

```
:~$ lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
（省略）
sda      8:0    0 111.8G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0  95.4G  0 part /
└─sda3   8:3    0  15.9G  0 part [SWAP]
sdb      8:16   0   2.7T  0 disk 
```
SDカードを刺す前と刺した後

```
:~$ lsblk 
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
（省略）
sda      8:0    0 111.8G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0  95.4G  0 part /
└─sda3   8:3    0  15.9G  0 part [SWAP]
sdb      8:16   0   2.7T  0 disk 
sdc      8:32   1   7.6G  0 disk 
└─sdc1   8:33   1   7.6G  0 part 
```
新たに増えた sdc がSDカードだとわかります。
自分の場合、128GBのSSDをルート（＝ sda ）に、３TBのHDD（＝ sdb ）をファイル置き場にしてます。

umount で sdc1 をアンマウントしておきます。

```
:~$ umount /dev/sdc1 
```
# DDコマンドでimgファイルを書き込む
今回、imgファイルはダウンロードフォルダに置いてありますので、
このimgファイルを dd でSDカードに書き込んでいきます。
自分のユーザ名はここでは恥ずかしいので hoge に置き換えてあります。
terminal を使います。一応 ls でファイルを確認して、いざ dd です。
ddコマンドの詳細は他に譲るとして、if=が元のimｇファイル、of=が書き込み先、です。

当記事作成時点の最新版は2018-06-27版ですので、それより新しいものを使う場合は適宜読み替えてください。

```
:~$ cd /home/hoge/ダウンロード/
:~/home/hoge/ダウンロード$ ls
2018-06-27-raspbian-stretch.img  2018-06-27-raspbian-stretch.zip
:~/home/hoge/ダウンロード$ sudo dd bs=4M if=2018-06-27-raspbian-stretch.img of=/dev/sdc status=progress conv=fsync 
[sudo] hoge のパスワード: 
4819255296 bytes (4.8 GB, 4.5 GiB) copied, 196 s, 24.6 MB/s
1150+0 レコード入力
1150+0 レコード出力
4823449600 bytes (4.8 GB, 4.5 GiB) copied, 442.013 s, 10.9 MB/s
```
（ディレクトリ名が日本語やんけコイツ！と思った方、そのツッコミは正しいと思います。）
書き込みが終わるまで数分かかります。ここは辛抱強く我慢です。

# RASPBIANがちゃんと書き込まれたかをなんとなく確認する
パソコンに差し込んでいるSDカードを一度抜き差しします。
するとSDカードがまた自動的にマウントされるのですが、
今度はマウントポイントが /media/(ユーザ名)　になっていますので、そこで ls してみます。

```
:~$ cd /media/hoge
:/media/hoge$ ls
boot  rootfs
:/media/hoge$ cd rootfs/
:/media/hoge/rootfs$ ls
bin   debootstrap  etc   lib         media  opt   root  sbin  sys  usr
boot  dev          home  lost+found  mnt    proc  run   srv   tmp  var
```

boot と rootfs が確認できました。
rootfs の中もちゃんとあるので、正しく書き込みができたと信じて次の作業です。

# 無線LANの設定をする
wpa_supplicant.conf に、今まさに使用している無線LANルータの設定情報を書き込みます。
wpa_supplicant.conf の詳細は他に譲りますが、ラズパイの無線LAN接続設定のファイルです。
まずはファイルがあるか cd で 該当ディレクトリに入って、ls で確認してみます。

```
:/media/hoge/rootfs$ cd /media/hoge/rootfs/etc/wpa_supplicant/
:/media/hoge/rootfs/etc/wpa_supplicant$ ls -a -l
合計 52
drwxr-xr-x   2 root root  4096  6月 27 09:30 .
drwxr-xr-x 111 root root  4096  6月 27 10:22 ..
-rwxr-xr-x   1 root root   937 10月 14  2017 action_wpa.sh
-rwxr-xr-x   1 root root 25619 10月 14  2017 functions.sh
-rwxr-xr-x   1 root root  4696 10月 14  2017 ifupdown.sh
-rw-------   1 root root    72  6月 27 09:30 wpa_supplicant.conf

```
wpa_supplicant.conf がありましたので、一応、cat で中身を見てみます。

```
:/media/hoge/rootfs/etc/wpa_supplicant$ cat wpa_supplicant.conf 
cat: wpa_supplicant.conf: 許可がありません
:/media/hoge/rootfs/etc/wpa_supplicant$ sudo cat wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
```
sudo してなくて怒られますので、sudo を付けましょう。

SSIDの設定情報を書き込みます。SSID と PASSPHRASE は適宜ご自身のものに置き換えてください。
普通は無線LANルータの背面か底面にシールで貼ってあります。

```
:/media/hoge/rootfs/etc/wpa_supplicant$ sudo sh -c 'wpa_passphrase SSID PASSPHRASE >> wpa_supplicant.conf'
```
もう一度、 wpa_supplicant.conf の中を cat で見てみます。

```
:/media/hoge/rootfs/etc/wpa_supplicant$ sudo cat wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="SSID"
	#psk="PASSPHRASE"
	psk=********************************************
}
```
（psk=以下は***でマスクさせていただきました。）
ssid="SSID" には無線LANルータのSSIDが、\#psk="PASSPHRASE" にはそのSSIDのパスフレーズが入ってますが、
このままだと万が一の際に危険ですので、\#psk="PASSPHRASE"の行は消してしまいます。
きっとここでviあたりで編集するのが普通なのでしょうが、僕自身初心者なので、gedit使っちゃいます。
geditはWindowsのメモ帳のように使えて便利です。

```
:/media/hoge/rootfs/etc/wpa_supplicant$ sudo gedit wpa_supplicant.conf 

(gedit:5445): IBUS-WARNING **: 14:38:51.147: The owner of /home/hoge/.config/ibus/bus is not root!

** (gedit:5445): WARNING **: 14:39:05.413: Set document metadata failed: metadata::gedit-spell-language という属性値はセットできません

** (gedit:5445): WARNING **: 14:39:05.413: Set document metadata failed: metadata::gedit-encoding という属性値はセットできません

** (gedit:5445): WARNING **: 14:39:07.071: Set document metadata failed: metadata::gedit-position という属性値はセットできません
```
gedit で開くと怒られますが、普通に編集できるので大丈夫です。
geditはWindowsのメモ帳のように使えるので（二度目）、\#psk="PASSPHRASE"の行を丸ごと消します。
保存するのを忘れずに。（スクショ省略）

もう一度、 wpa_supplicant.conf の中を cat で見てみます。

```
:/media/hoge/rootfs/etc/wpa_supplicant$ sudo cat wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="SSID"
	psk=********************************************
}
```
\#psk="PASSPHRASE"の行がなくなったことがわかります。
（psk=以下は***でマスクさせていただきました。）

これでとりあえずラズパイは無線LAN接続できるようになったはずですが、
このままではDHCPでipアドレスが動的に振られてしまい（その都度違うipアドレス）、
ラズパイのipアドレスがわかりません。
avahiとか難しい話は置いといて、ipアドレスを固定してしまいます。

# ipアドレスを固定する

RASPBIANのipアドレスはそのままでは動的ですので、
ipアドレスの設定ファイルである dhcpcd.conf を編集して、ipアドレスを固定（静的）します。
なぜか気まぐれで cd でホームディレクトリに移動してしまいましたが、
面倒なので直接 dhcpcd.conf の中身を cat で確認してみます。

```
:~$ sudo cat /media/hoge/rootfs/etc/dhcpcd.conf 
# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

# Inform the DHCP server of our hostname for DDNS.
hostname

# Use the hardware address of the interface for the Client ID.
clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
# Some non-RFC compliant DHCP servers do not reply with this set.
# In this case, comment out duid and enable clientid above.
#duid

# Persist interface configuration when dhcpcd exits.
persistent

# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
# Most distributions have NTP support.
option ntp_servers
# Respect the network MTU. This is applied to DHCP routes.
option interface_mtu

# A ServerID is required by RFC2131.
require dhcp_server_identifier

# Generate Stable Private IPv6 Addresses instead of hardware based ones
slaac private

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

# It is possible to fall back to a static IP if DHCP fails:
# define static profile
#profile static_eth0
#static ip_address=192.168.1.23/24
#static routers=192.168.1.1
#static domain_name_servers=192.168.1.1

# fallback to static profile on eth0
#interface eth0
#fallback static_eth0
```
この設定ファイルに、無線LAN接続でのipアドレスは固定してね、ということを書きます。
またしてもgeditを使います。

```
:~$ sudo gedit /media/hoge/rootfs/etc/dhcpcd.conf 
```
geditが立ち上がったら、メモ帳の要領で、一番最後に行を足して、下記内容を追記します。
ちなみにうちのネットワーク構成では、ルータの無線LANが192.168.1.1で、有線LANが192.168.0.1です。
ルータごとに設定が違うはずなので、ルータの説明書を見て、ルータ自身のipアドレスを確認してください。

```
interface wlan0
static ip_address=192.168.1.30/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
```
interface wlan0 は無線LAN接続の場合という意味。
static ip_address=192.168.1.30/24 はipアドレスを192.168.1.30に固定するという意味。
static routers=192.168.1.1 は無線LANルータのipアドレス。
static domain_name_servers=192.168.1.1 はDNSのipアドレスで、普通は無線LANルータが兼ねてます。
ipアドレス192.168.1.30のところ、30に固定したのにはあまり意味がなくて、忘れなければ10でも20でも構いません。
（もちろん、0、1、256は駄目です。）

もう一度、ipアドレスの設定ファイルである dhcpcd.conf を cat で確認してみます。

```
:~ $ sudo cat /etc/dhcpcd.conf 
# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

# Inform the DHCP server of our hostname for DDNS.
hostname

# Use the hardware address of the interface for the Client ID.
clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
# Some non-RFC compliant DHCP servers do not reply with this set.
# In this case, comment out duid and enable clientid above.
#duid

# Persist interface configuration when dhcpcd exits.
persistent

# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
# Most distributions have NTP support.
option ntp_servers
# Respect the network MTU. This is applied to DHCP routes.
option interface_mtu

# A ServerID is required by RFC2131.
require dhcp_server_identifier

# Generate Stable Private IPv6 Addresses instead of hardware based ones
slaac private

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

# It is possible to fall back to a static IP if DHCP fails:
# define static profile
#profile static_eth0
#static ip_address=192.168.1.23/24
#static routers=192.168.1.1
#static domain_name_servers=192.168.1.1

# fallback to static profile on eth0
#interface eth0
#fallback static_eth0

interface wlan0
static ip_address=192.168.1.30/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
```
最終行に４行、先程の内容が追記されているのが確認できました。


ここまでで、RASPBIANは固定ipでの無線LAN接続になったはずです。
しかしこのままではssh接続できません。
ただのping応答マシンでしかないので、sshを有効にします。

# SSHを有効化する

環境構築用PCにはSSHDが入ってて動いてる前提です。
最新版のRASPBIAN STRETCHではSSHが入ってるものの無効化されており、有効にするためには、
boot/ にsshという名前のファイルを作ります。拡張子はなし、ディレクトリでも駄目ですので、touch で作ります。
もうこれは本当に簡単で、一行です。

```
:~$ sudo touch /media/hoge/boot/ssh
```

この状態でいよいよ完成です。

# ラズパイ３にSSH接続してみる

できあがったSDカードをパソコンから取り出し、ラズパイ３に差し込み、電源を入れます。

１分ぐらい待って、いざSSH接続です。ssh ユーザ名＠ipアドレスで接続します。
ラズパイの初期ユーザは、
ユーザ名：　pi
パスワード： raspberry　です。

```
:~$ ssh pi@192.168.1.30
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:2BWnH/BKSXNW5Sv5NCmLu9TIW0UQ24rX5MEjEJYCGNE.
Please contact your system administrator.
Add correct host key in /home/hoge/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/hoge/.ssh/known_hosts:1
  remove with:
  ssh-keygen -f "/home/hoge/.ssh/known_hosts" -R "192.168.1.30"
ECDSA host key for 192.168.1.30 has changed and you have requested strict checking.
Host key verification failed.
```
とここで、想定外というか、初めてSSH接続する場合には出ないメッセージが出ました。
これは、過去に192.168.1.30にSSH接続してて、そのときの相手となんだか違うよっていう意味です。
ここまでの作業が初めての人には関係ないのですが、自分としては一瞬アレ？と思ったので、一応メモとして残しておきます。
エラーメッセージの中にちゃんと対処方法が書かれているので、その通りにします。

```
:~$ ssh-keygen -f "/home/hoge/.ssh/known_hosts" -R "192.168.1.30"
/home/hoge/.ssh/known_hosts updated.
Original contents retained as /home/hoge/.ssh/known_hosts.old
```

バックアップ取って更新したよ的なメッセージのあと、もう一度SSH接続してみます。
初めての人にはここからの作業となります。

```
:~$ ssh pi@192.168.1.30
The authenticity of host '192.168.1.30 (192.168.1.30)' can't be established.
ECDSA key fingerprint is SHA256:2******************************************E.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.30' (ECDSA) to the list of known hosts.
pi@192.168.1.30's password: 
Linux raspberrypi 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 12 06:05:36 2018

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $ 
```
無事に成功しました。

# RASPBIAN（ラズパイ）の設定を変更する

ここから先は、環境構築用パソコンからSSH接続したラズパイで行います。
raspi-config で、初期パスワードの変更、ロケーションなんかの設定をします。
選択の上下は矢印キー。選択はスペースキー。移動はタブキーです。
この設定の詳細は他に譲ります。

```
pi@raspberrypi:~ $ sudo raspi-config

```

変更が終わったら、アップデートしておきます。

```
sudo apt-get upgrade -y
```

これで終了です。