ヘッドレスなラズパイゼロをケーブルの類を一切使わずにセットアップ

モニターもキーボードも付いてないヘッドレスなラズパイ Raspberry Pi Zero WH をLANケーブルすら使わずにセットアップする方法です。今回のセットアップ目標は、ラズパイをインターネットに接続し、更に外部パソコンからSSH接続できるところまでとします。

目次

前提

  • セットアップ対象のラズパイは Raspberry Pi Zero WH
  • ラズパイはモニター無しキーボード無し、そして LANケーブルも無し
  • ラズパイのネットワーク環境:
    • Wi-Fiネットワーク接続。接続先SSID名はMyRouterとする。
    • 静的IPアドレス: 192.168.179.10
    • デフォルトゲートウェイ: 192.168.179.1
    • サブネットマスク: 255.255.255.0
    • DNS: 192.168.179.1
  • ラズパイに接続する外部パソコンはLinux
  • セットアップ手順:
    1. ラズパイのOSセットアップ (OSはRaspbian Stretch Lite版)
    2. ラズパイからインターネット接続
    3. ラズパイへ外部パソコンからSSH接続 (Wi-Fiローカルネットワーク経由 and USBで直接接続)

用意するモノ

Raspbian のインストール

RaspbianのOSイメージを作成

外部パソコン上で以下の手順を実行します:

  • Raspberry Pi 公式サイトからRaspbian Stretch Lite版のOSイメージのzipファイル2019-04-08-raspbian-stretch-lite.zipをダウンロード。今回はターミナル操作のみなのでLite版で十分です。一応チェックサムを確認:
$ sha256sum ./2019-04-08-raspbian-stretch-lite.zip

03ec326d45c6eb6cef848cf9a1d6c7315a9410b49a276a6b28e67a40b11fdfcf  ./2019-04-08-raspbian-stretch-lite.zip
OK!
  • ダウンロードしたzipを解凍し、OSイメージ(2019-04-08-raspbian-stretch-lite.img)を抽出。

  • パソコンにSDカードを挿す。

  • SDカードのパスを特定しておく (例:/dev/mmcblk0) :

$ sudo fdisk -l
  • SDカードのパーティションを綺麗に掃除:
$ sudo fdisk /dev/mmcblk0

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

コマンド (m でヘルプ): m

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table


コマンド (m でヘルプ): d
パーティション番号 (1,2, default 2): 1

Partition 1 has been deleted.

コマンド (m でヘルプ): d   
Selected partition 2
Partition 2 has been deleted.

コマンド (m でヘルプ): w
The partition table has been altered.
  • SDカードをアンマウント:
$ sudo umount /dev/mmcblk0*

NOTE: アンマウントした時に何らかのエラーが出るかもしれませんが、ここはスルーしてもOK。

  • OSイメージを焼く:
$ sudo dd bs=1M if=./2019-04-08-raspbian-stretch-lite.img of=/dev/mmcblk0

NOTE: OSイメージが焼き終わったら、SDカードをパソコンから抜き差しして再マウントし、SDカードにrootfs/boot/の2つのパーティションが作られていることを確認してください。

ラズパイの通電&起動確認

ここからラズパイの設定を弄っていくことになりますが、ちょっとその前に、ここでラズパイがデフォルトの状態で通電&起動するか確認しておきましょう。SDカードをラズパイに差し替え、基盤の PWR と書いてある方のUSB挿入口に電源ケーブルを挿します。すると、ラズパイが自動的に起動します。ここで緑色のLEDが点滅していれば起動確認はOKです。(もしここで緑色LEDが点滅しなければ、残念ながらSDカードもしくは基盤の故障の可能性があります)

ラズパイ通電確認

通電確認が終わったらもう一度、SDカードをラズパイからパソコンの方に挿し直してください。ラズパイを設定していきましょう。

SSHの有効化

Raspbianの最新のバージョンではSSHがデフォルトで無効になっているので、それを有効化する必要があります。とはいってもSSHの有効化はとても簡単で、OSイメージを焼いたSDカードのboot/ディレクトリにsshという空ファイルを設置するだけです:

$ sudo touch /SDカードのパス/boot/ssh

Wi-Fiの設定

利用するWi-Fiのネットワーク設定値を標準出力します:

$ sudo wpa_passphrase MyRouter <WIFIパスワード>

network={
    ssid="MyRouter"
    #psk="生のWIFIパスワード"
    psk=暗号化されたWIFIパスワード
}

TIP: もし接続予定のWi-Fiネットワークが他にもある場合は、そちらも同じように出力しておきます。

上記で出力された設定値をコピーし、wpa_supplicant.confに追記します。

rootfs/etc/wpa_supplicant/wpa_supplicant.conf

# 環境を日本に設定
country=JP

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

# 追記!
network={
    ssid="SSID名"
    psk=暗号化されたWIFIパスワード
}

IPアドレスを固定

ラズパイのIPアドレスを固定します。IPアドレスを固定しておけば、後々ラズパイをWi-Fi中継器として利用する時などに便利です。固定IPアドレスの設定はDHCPクライアントデーモンの設定ファイルdhcpcd.confに記述します。

rootfs/etc/dhcpcd.conf

...

interface wlan0
static ip_address=192.168.179.10/24
static routers=192.168.179.1
static domain_name_servers=192.168.179.1

ラズパイの起動

SDカードを再びラズパイに挿し替え、ラズパイに電源ケーブルを挿して起動してください。起動後数十秒ほどでネットワークに繋がります。

ラズパイにpingが飛ぶか確認:

$ ping 192.168.179.10
PING 192.168.179.10 (192.168.179.10) 56(84) bytes of data.
64 bytes from 192.168.179.10: icmp_seq=1 ttl=64 time=21.1 ms
...

OK!

ラズパイへSSH接続

次は外部パソコンから無線LAN経由でSSHで接続してみましょう。 ユーザ名pi、パスワードraspberry(デフォルト)でSSHログインできます:

$ ssh pi@192.168.179.10

...
pi@raspberrypi:~ $ 

SSHログインをパスワード方式から鍵認証方式へ (重要)

セキュリティのため、デフォルトのパスワード方式のSSHログインを安全な鍵認証方式へ切り替えておくことを強く推奨します。設定手順は以下の通り。

まずは外部パソコン上でキーペアを生成:

$ mkdir ~/.ssh/rpi/ && cd ~/.ssh/rpi/
$ ssh-keygen -t rsa
$ ls

id_rsa (秘密鍵)  id_rsa.pub (公開鍵)

公開鍵をラズパイへ転送:

$ scp ~/.ssh/rpi/id_rsa.pub pi@192.168.179.10:/tmp

ラズパイへSSHログイン:

$ ssh pi@192.168.179.10

公開鍵を許可公開鍵一覧に追加:

pi@raspberrypi:~ $ cd ~
pi@raspberrypi:~ $ mkdir .ssh
pi@raspberrypi:~ $ cat /tmp/id_rsa.pub >> .ssh/authorized_keys
pi@raspberrypi:~ $ chmod -R go= .ssh

ラズパイのSSHサーバ設定を変更:

/etc/ssh/sshd_config

...

PermitRootLogin no # rootログインの禁止
PubkeyAuthentication yes # 鍵認証方式を有効化
PasswordAuthentication no # パスワード認証方式を無効化

SSHサーバの再起動:

pi@raspberrypi:~ $ sudo /etc/init.d/ssh restart

一旦ラズパイから抜ける:

pi@raspberrypi:~ $ exit

確認のため、外部パソコンから普通にSSHログインを試してみましょう:

$ ssh pi@192.168.179.10

Permission denied (publickey).

OK、ちゃんとパスワード方式でのログインは拒否されてますね。

では次に秘密鍵を使ったSSHログインを試してみましょう:

$ ssh -i ~/.ssh/rpi/id_rsa pi@192.168.179.10

...

pi@raspberrypi:~ $ ping www.google.co.jp
PING www.google.co.jp (172.217.24.131) 56(84) bytes of data.
64 bytes from nrt20s01-in-f131.1e100.net (172.217.24.131): icmp_seq=1 ttl=49 time=74.8 ms
...

成功! インターネット接続もうまく行ったことがわかります。

USBで直接ラズパイにSSH接続する方法

ラズパイゼロ(Raspberry Pi Zero)には、USBで直接ラズパイに接続するUSB OTGモードというものがあります。この接続方法はWi-Fiなどのネットワーク接続が不要で、いちいちSDカードを取り出さなくても直接ラズパイの中身を弄れるためとても重宝します。

設定は簡単です。

まず、avahi-daemonをラズパイとパソコン(Linux)の両方にインストールします。これを入れることでraspberrypi.localというサーバ名でラズパイへアクセスできるようになります。ちなみにRaspbian(Stretch)には最初からインストールされていますので、パソコン側だけ入れれば良いでしょう。

ラズパイ側とパソコン側の両方でavahi-deamonをインストール:

$ sudo apt install avahi-daemon

次にラズパイ側のファイルを少し弄ります。

ラズパイ側の config.txt というファイルの末尾にdtoverlay=dwc2を1行追加します:

/boot/config.txt

...

dtoverlay=dwc2

また、 cmdline.txt というファイルのrootwaitの直後に modules-load=dwc2,g_ether を追加します:

/boot/cmdline.txt

dwc_otg.lpm_enable=0 (中略) rootwait modules-load=dwc2,g_ether

ラズパイの基盤のUSBと書いてある方のUSBポートにUSBケーブルを挿してパソコンと接続、ラズパイを起動します。

パソコン側からraspberrypi.localというサーバ名指定でSSH接続してみましょう:

pi@raspberrypi:~ $ ssh -i ~/.ssh/rpi/id_rsa pi@raspberrypi.local

IPアドレスを指定しなくても接続できました。

以上で今回の目標達成です。

次回は、このラズパイを使ってWi-Fi中継器(リピーター)を作ってみたいと思います。

品薄の Raspberry Pi Zero W を楽天で探してみる

芽萌丸IOT研究会 @iot
芽萌丸のIOT関連アカウント。ラズパイとか色々。