Raspberry Pi(Zero)をモニター、キーボード使わずにインストールしてSSHする




Raspberry Pi Zero WH(以下ラズパイと略す)を初めて購入しOSのインストールまで行ったときの手順をメモしておく。なおモニターやキーボードは装着せず、SSHを使ったリモート操作となる。


OSイメージのダウンロード

ラズパイに入れるOSイメージをこちらからダウンロードする。
https://www.raspberrypi.org/downloads/raspbian/

今回GUIは使わないのでRaspbian Stretch Liteを選んだ。
ダウンロードした2018-11-13-raspbian-stretch-lite.imgを適当な作業用のディレクトリへ移しておく。


SDカードの場所を確認する

diskutilコマンドでSDカードの場所を確認する。

$ diskutil list


/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         250.7 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +250.7 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            160.3 GB   disk1s1
   2:                APFS Volume Preboot                 45.0 MB    disk1s2
   3:                APFS Volume Recovery                512.4 MB   disk1s3
   4:                APFS Volume VM                      1.1 GB     disk1s4


SDカードを差し込んでから再度実行するとdisk2が現れた。

$ diskutil list

/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         250.7 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +250.7 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            160.3 GB   disk1s1
   2:                APFS Volume Preboot                 45.0 MB    disk1s2
   3:                APFS Volume Recovery                512.4 MB   disk1s3
   4:                APFS Volume VM                      1.1 GB     disk1s4

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.9 GB     disk2
   1:                 DOS_FAT_32 NO NAME                 7.9 GB     disk2s1




OSを焼く

ddコマンドでOSイメージを焼く。

SDカードを指した状態でアンマウントする必要がある。

diskutil unmountDisk /dev/disk2



次のコマンドで書き込んだ。rdisk2のrbs=1mをつけることで100倍速く書き込む事ができるようだ。

sudo dd if=2018-11-13-raspbian-stretch-lite.img of=/dev/rdisk2 bs=1m


Ctrl+Tを押せば進捗状況がかくにんできる。私のMac環境では2分程度で書き込むことが出来た。


spbian-stretch-lite.img of=/dev/rdisk2 bs=1m
load: 1.84  cmd: dd 3631 uninterruptible 0.01u 1.32s
1587+0 records in
1586+0 records out
1663041536 bytes transferred in 113.931717 secs (14596827 bytes/sec)
1780+0 records in
1780+0 records out
1866465280 bytes transferred in 127.921700 secs (14590685 bytes/sec)




SSHの設定を書き込む

SDカードのディレクトリへ移動する。/dev/disk2 ではなく /Volumes/boot/となっていることに中止する。


$ cd /Volumes/boot/



touch ssh で空のsshファイルを作成。llで確認しておこう。


$ ll
total 44286
-rwxrwxrwx  1 Mopipico  staff     1494  3  9  2018 LICENCE.broadcom
-rwxrwxrwx  1 Mopipico  staff    18693  3  9  2018 COPYING.linux
-rwxrwxrwx  1 Mopipico  staff    24087  9 19 18:06 bcm2710-rpi-cm3.dtb
-rwxrwxrwx  1 Mopipico  staff    25311  9 19 18:06 bcm2710-rpi-3-b.dtb
-rwxrwxrwx  1 Mopipico  staff    25574  9 19 18:06 bcm2710-rpi-3-b-plus.dtb
-rwxrwxrwx  1 Mopipico  staff    24115  9 19 18:06 bcm2709-rpi-2-b.dtb
-rwxrwxrwx  1 Mopipico  staff    22589  9 19 18:06 bcm2708-rpi-cm.dtb
-rwxrwxrwx  1 Mopipico  staff    22812  9 19 18:06 bcm2708-rpi-b.dtb
-rwxrwxrwx  1 Mopipico  staff    23071  9 19 18:06 bcm2708-rpi-b-plus.dtb
-rwxrwxrwx  1 Mopipico  staff    23315  9 19 18:06 bcm2708-rpi-0-w.dtb
-rwxrwxrwx  1 Mopipico  staff  4057956 11 12 17:25 start_x.elf
-rwxrwxrwx  1 Mopipico  staff  5120484 11 12 17:25 start_db.elf
-rwxrwxrwx  1 Mopipico  staff   678532 11 12 17:25 start_cd.elf
-rwxrwxrwx  1 Mopipico  staff  2857060 11 12 17:25 start.elf
-rwxrwxrwx  1 Mopipico  staff  4934912 11 12 17:25 kernel7.img
-rwxrwxrwx  1 Mopipico  staff  4688856 11 12 17:25 kernel.img
-rwxrwxrwx  1 Mopipico  staff     9895 11 12 17:25 fixup_x.dat
-rwxrwxrwx  1 Mopipico  staff     9895 11 12 17:25 fixup_db.dat
-rwxrwxrwx  1 Mopipico  staff     2621 11 12 17:25 fixup_cd.dat
-rwxrwxrwx  1 Mopipico  staff     6666 11 12 17:25 fixup.dat
-rwxrwxrwx  1 Mopipico  staff    52116 11 12 17:25 bootcode.bin
-rwxrwxrwx  1 Mopipico  staff     1590 11 13 13:19 config.txt
drwxrwxrwx  1 Mopipico  staff    12800 11 13 14:01 overlays
-rwxrwxrwx  1 Mopipico  staff      145 11 13 14:02 issue.txt
-rwxrwxrwx  1 Mopipico  staff      190 11 13 14:02 cmdline.txt
-rwxrwxrwx  1 Mopipico  staff    18974 11 13 14:02 LICENSE.oracle
drwxrwxrwx  1 Mopipico  staff      512  3 12 17:08 .fseventsd
drwxr-xr-x@ 4 root      wheel      128  3 12 17:08 ..
-rwxrwxrwx  1 Mopipico  staff        0  3 12 17:11 ssh
drwxrwxrwx@ 1 Mopipico  staff     2560  3 12 17:11 .



WiFiの設定

viで wpa_supplicant.conf というファイル名で新規作成し以下の内容を書き込む。
WifiのSSIDWifiのパスワード は自分の環境のものに書き換えること。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
 
network={
 ssid="WifiのSSID"
 psk="Wifiのパスワード"
 key_mgmt=WPA-PSK
}


ここまで出来てようやくSDカードをパソコンから取り出しラズパイにセットするが、デスクトップに表示されているbootアイコンを右クリックしてしっかり安全に取り出そう。

今後WiFi環境が変わったら、ここを書き換えればよいということになる。



SSHで接続

SDカードを差しこんだらPWR INの端子にUSBで電源供給をする。

しばらくすると自動でWiFi接続されるが、接続状態を確認するためルーターの管理画面に入る必要がある。


IPアドレス ホスト名
192.168.100.136 raspberrypi

このように確認できた。

ラズパイの初期設定は次のようになっている。

ユーザー名 パスワード
pi raspberry


$ ssh pi@192.168.100.136
The authenticity of host '192.168.100.136 (192.168.100.136)' can't be established.
ECDSA key fingerprint is SHA256:B6VHDmthKIkhogehogehogehogehogehogehogehogehogehoge
Are you sure you want to continue connecting (yes/no)? 



yesを押してデフォルトパスワードraspberryを入力する。

ターミナル表示が次のように変わったらSSHでラズパイにアクセス成功だ!


pi@raspberrypi:~ $ pwd
/home/pi


今後のためにもpiユーザーのパスワードを変えておこう。

$ passwd pi



SSHを終了させたいときはexitで可能だ。


Hello World

サンプルプログラムが用意されていたので実行してみる。

cd /opt/vc/src/hello_piでフォルダを移動し、./rebuild.shを実行する。

$ cat README

Building on Pi
++++++++++++++

To build the test apps on the pi, first build the libs:
make -C libs/ilclient
make -C libs/vgfont

then by entering each test app directory and run make. E.g.
  cd hello_world
  make
  ./hello_world.bin

Running ./rebuild.sh will rebuild the all libs and and apps.


Building on a different PC
++++++++++++++++++++++++++

If you want to build the samples on a different machine (cross-compile) then set:
SDKSTAGE=<path/to/firmware-directory> and CC=<path/to/cross-compiler>
before running make.


READMEによればhello_worldディレクトリへ移動し、./hello_world.binで実行可能なバイナリが出来上がっているという。

やってみよう。

$ cd hello_world
$ ./hello_world.bin
Hello world!


なんと、Hello world!に成功した!!!!⚡⚡⚡

冗談はさておき、他にもサンプルがたくさん収納されている。バリバリC言語といった感じの難しいコードがあったので機会があれば触れてみたい。


矢印キーが使えない

ラズパイに最初から入っているVimは vim-tiny という最小構成版のようで矢印キーが使えないらしい。

現在のVimをいったんアンインストールする。

$ sudo apt-get --purge remove vim-common vim-tiny


再度Vimをインストールすることで矢印キーが使えるようになった。

$ sudo apt-get install vim


はじめてのラズパイだったが、ここまでで大したトラブルなく1時間程度で設定を完了することができた。



Raspberry Pi Zeroをホスト名でSSHアクセス可能にする


今度ははラズパイをホスト名でSSHアクセス出来るようにしてみた。最終的な解決方法は最下部のまとめに記してある。



ホスト解決の格闘

ssh pi@192.168.100.136 でログインして sudo vi /etc/hosts でホストファイルを編集する。

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspi0 #←ここを書き換えた


初期設定ではrootにパスワードが設定されていないのでroot権限ファイルはsudoコマンド一発で修正できるんだね。


sudo reboot でラズパイを再起動したらすぐにホスト名で接続できると思いきや、なんとできない!
次の記事に解決法が書いてあった。
http://independence-sys.net/main/?p=2116

なるほど、そもそもホスト名でアクセスするには Zeroconfという技術をつかって行っているようで、MACではBonjourがそれに当たるんだね。LinuxではAvahiというソフトウェアを入れることでそれが可能となるようだ。

さっそくライズパイ上で以下コマンドを実行してavahi-daemonをインストールする。

sudo apt-get install avahi-daemon

avahi-daemonは自動起動に設定されるようだ。

とりあえずラズパイ再起動。

sudo reboot

さて、MACからラズパイのホスト名でアクセスしてみよう。

ssh pi@raspi0.local

あれれできないっすねぇ。

pingも通らない。
ping raspi0.local
ping: cannot resolve raspi0.local: Unknown host



ラズパイでavahi-daemonを再起動してみる。
sudo /etc/init.d/avahi-daemon restart
sudo: unable to resolve host raspberrypi
[ ok ] Restarting avahi-daemon (via systemctl): avahi-daemon.service.


すると気になるメッセージが**unable to resolve host raspberrypi**

あれれれ?さっきraspberrypiからraspi0の名前に変えたはずなんだけど。。。

/etc/hostsを再びraspberrypiにもどしてavahi-daemonを再起動してみる。

sudo /etc/init.d/avahi-daemon restart
[ ok ] Restarting avahi-daemon (via systemctl): avahi-daemon.service.


おや、今度はエラーメッセージ無しで通った。

Macからpingで確認。

ping raspberrypi.local
PING raspberrypi.local (192.168.100.136): 56 data bytes
64 bytes from 192.168.100.136: icmp_seq=0 ttl=64 time=12.978 ms
64 bytes from 192.168.100.136: icmp_seq=1 ttl=64 time=12.745 ms
64 bytes from 192.168.100.136: icmp_seq=2 ttl=64 time=12.107 ms
64 bytes from 192.168.100.136: icmp_seq=3 ttl=64 time=10.968 ms
64 bytes from 192.168.100.136: icmp_seq=4 ttl=64 time=12.126 ms
64 bytes from 192.168.100.136: icmp_seq=5 ttl=64 time=14.754 ms
^C
--- raspberrypi.local ping statistics ---
6 packets transmitted, 6 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 10.968/12.613/14.754/1.150 ms


ガンガンとおった!ちなみにローカルネットワークからアクセスする場合は ホスト名.local としなければならないルールがあることを知った。


しかしその後もホスト名をraspi0書き換えてあれこれ試したがrasberrypiの名前以外だとホスト解決できない。調べていくうちになんとホスト名の設定は2つ存在していることがわかった!
https://thepihut.com/blogs/raspberry-pi-tutorials/19668676-renaming-your-raspberry-pi-the-hostname


このファイルのそれぞれのraspberrypiを書き換えなければならなかったのだ。

sudo vi /etc/hostname
sudo vi /etc/hosts



ラズパイリブートして、Macでpingの確認する。

$ ping raspi0.local     
PING raspi0.local (192.168.100.136): 56 data bytes
64 bytes from 192.168.100.136: icmp_seq=0 ttl=64 time=89.859 ms
64 bytes from 192.168.100.136: icmp_seq=1 ttl=64 time=22.888 ms
 64 bytes from 192.168.100.136: icmp_seq=2 ttl=64 time=12.121 ms
64 bytes from 192.168.100.136: icmp_seq=3 ttl=64 time=12.014 ms
^C
--- raspi0.local ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 12.014/34.221/89.859/32.425 ms


今度は通りましたね!!お見事!

今後、SSHでは次のようにして接続できる事になった。

ssh pi@raspi0.local


IPアドレスはいちいち覚えてられないし、IPアドレスが変わってもホスト名でアクセス出来るので設定しておいて損はないと思う。



まとめ

ラズパイに avahi-daemon をインストールすること。

ホスト名は下記2つのファイルを編集すること。

sudo vi /etc/hostname
sudo vi /etc/hosts


ローカル環境でアクセスする場合は下記のようにホスト名.localをつけること。
ssh pi@raspi0.local 




参考

https://projects.raspberrypi.org/en/projects/demo-programs/4
https://blog.cles.jp/item/10152
https://www.raspberrypi.org/downloads/raspbian/
http://independence-sys.net/main/?p=2116
https://thepihut.com/blogs/raspberry-pi-tutorials/19668676-renaming-your-raspberry-pi-the-hostname