はじめに
2017/2にRaspberry Pi Zeroの国内販売が始まり、2021年11月にRaspberry Pi Zero 2 Wが発表され、セットアップ手順もより便利になっているので、久しぶりに更新しました。
本稿では、電源を入れるだけでリモートログインできる状態にし、ヘッドレス運用ができることを目標として、セットアップ方法の紹介をします。
まず、本稿の前半にシンプルなWifi接続またはUSB On-The-Go(以下USB OTGと記載)接続によるセットアップ方法を記載します。
上記のセットアップを行うと、以下のようにRaspberry Pi Zero(W)を使用できます。
-
USBケーブル一本で電源供給+ネットワーク接続
(内側のMicroUSBコネクタをPCに接続し、データ転送と電源供給をする。USB機器は使用できない)
-
USB or GPIOで電源供給、内臓WifiまたはBluetoothでネットワーク接続
(外側のMicroUSBコネクタから電源を供給。内側のMicroUSBコネクタが空くのでUSB機器を使用可)
また、本稿の後半に、過去に記載した「マウス、キーボード、モニタを用意して行う」セットアップを残しました。記載が2017年のRaspbian OS Stretch時と古い記載ですが、流れは掴めると思いますのでご容赦ください。UART-USBケーブルを用いたシリアルコンソール経由でのセットアップでも参考になるかと思います。
BuildrootやYoctoOSといった無駄なパッケージを極力省いた組み込み向けOSを使用する場合は、確実に動作確認できるので、知っておくのは損はないと思います。
参考までに、筆者はRaspberry Pi Zero Wを用いて、主に下記のデバイスを作っています。
「サイクルコンピューターをガチで作ってみたら、割とできてしまったという話」
本稿では、テキストエディタはvimを使っていますが、適宜使い慣れたもの(nano等)に変えてください。
【前半】Wifi・USB接続によるセットアップ
用意するもの
- Micro USBケーブル
- Micro SDカード
- 用途にもよりますが、4GBだとあっという間に使い切るので、8GB以上は欲しいです。
- ガッツリ使うなら高耐久(サンディスクMAX ENDURANCE 高耐久 microSD™ カードなど)なものを。
- Raspberry Pi OS Imager (ダウンロード先)
- 書き込み時に、ホスト名、SSH、Wifi、タイムゾーン、キーボードレイアウトの指定が可能です。よって、Raspberry Piの初回起動後に行うraspi-configで上記の設定は不要となります。
- Raspberry Pi 4でSSD等を用いたUSBブートでもそのまま使える方法です。
- USB Wifiアダプタ(オプション)
- 無印Raspberry Pi ZeroでWifiを使う場合、あるいは、Raspberry Pi Zero Wでサポートされていない5GHzのWifiをどうしても使いたい、デュアルWifiにしたい場合に必要です。
- 2.4GHz帯のみ対応のアダプタはドライバ追加なしで動く場合が多いようです。自分はWN-G150UMW(rtl8192cu)を用意しました。
- 一方、5GHz帯が使えるアダプタの対応は進んでいないようなので、別途ドライバのインストール必要です。一例を別記事で記載しています。
Raspberry Pi OSイメージの書き込み
Raspberry Pi OS Imagerによるインストール方法を紹介します。
まずは起動します。(今後、この画面を「メインメニュー画面」とします)
作業の流れは単純で、左の「CHOOSE OS」ボタンでOSイメージを指定、中央の「CHOOSE STRAGE」ボタンで書き込み先を指定、Raspberry Pi OSの事前設定を行い、右の「WRITE」ボタンで書き込みを実行、と言う流れになります。
書き込みイメージの選択
メインメニュー画面の「CHOOSE OS」ボタンを押し、書き込みイメージを選択します。
基本は一番上の「Raspberry Pi OS (32-bit)」を選択します。デフォルトでは、Raspberry Pi OS with desktopとなっています(容量が1GBであることに注目)。
Raspberry Pi OS Liteや、Raspberry Pi OS with desktop and recommended softwareを選択したい場合は、1つ下の「Raspberry Pi OS (other)」を選択します。
詳しくは、オフィシャルサイトのOperating system imagesを参照してください。
また、下の方に、メディアをフォーマットする「ERASE」や、指定したimgファイルを書き込む「Use custom」ボタンがあります。
※余談ですが、Etcherというソフトウェアでも、SDカード等のメディアにOSイメージの書き込みが汎用的に可能です。ただし、後述のRaspberry Pi OS環境に特化した事前の設定機能はありません。
書き込みストレージの選択
SDカードをPCに接続し、メインメニュー画面の「CHOOSE STRAGE」ボタンを押し、該当のSDカードを選択します。
名称や容量を見て、注意深く選択してください。
Raspberry Pi OSの事前設定
メインメニュー画面で、CTRL + SHIFT + x を押すと設定画面が現れます。
macOSだと、事前に下記のダイアログが出てきて、Yesを選択して、管理者ユーザー・パスワードを入力すると、現在接続されているWifiとパスワードを自動で設定してくれます。
以下、各項目を順に解説します。
設定の事前保存
「Image customizetion options」で、「for this sessions only」(今回限り)か、「to always use」(保存して次回以降も使用)を指定できます。
ホスト名・SSH
下記のように、左端のチェックボックスを有効にし、ホスト名、SSHのパスワードまたは認証鍵の公開鍵を入力します。ホスト名は、Raspberry Piの実機ごとに変えてください。
一番上にある「Disable overscan」はHDMI出力しない限りは考慮不要です。
Wifi
必要に応じて、SSIDとPasswordを入力し、Wifi countryをお使いの国を入力します。(国ごとに使用するWifiのチャンネルが異なる模様)
複数のアクセスポイントの設定をしたい場合は、初回稼働後raspi-config
で追加設定します。
ロケール
必要に応じて、タイムゾーン、キーボードレイアウトを入力します。
タイムゾーン未設定だとUTC(協定世界時、日本時間から9時間遅れ)になります。キーボードレイアウトは、キーボードを接続しない限り初期設定の「us」のままで良いと思います。
最後の「Skip first-run wizard」はデスクトップ版を初回起動した際に出てくるpiwizのことだと思います。不要になると思うので初回ログイン後、sudo apt remove piwiz
でアンインストールしておきましょう。
書き込み時のオプション、設定の保存
特にここは変えなくていいと思います。
設定が終わったら、最下部の「SAVE」ボタンで終了し、メインメニュー画面に戻ります。
Raspberry Pi OSイメージの書き込み
メインメニュー画面の「WRITE」ボタンを押し、OSイメージを書き込みます。
macOSの場合、SDカード等のメディアの書き込みに管理者ユーザー・パスワードが必要ですので、ダイアログが表示されます。その後、OSイメージファイルのダウンロードと書き込みが始まります。
(オプション) USB経由でのインターネット接続を有効にする
こちらは、必要に応じて設定してください。
Raspberry Pi側の設定
Raspberry Pi OSイメージの書き込みが終了したら、一旦MicroSDカードをMacから外し、再度接続します。bootというドライブが現れるはずです。
bootドライブ内のcmdline.txtに "modules-load=dwc2,g_ether" を追加します。
新しい行ではなく、1行目の最後に追加になります。
$ vim /Volumes/boot/cmdline.txt
(以下、コード表示だと折り返しなしの1行となり見辛いので、引用という形で表現しています。末尾までカーソルを移動させて、空白を入力後、ペーストします。)
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh quiet splash plymouth.ignore-serial-consoles modules-load=dwc2,g_ether
次に、config.txtの末尾に"dtoverlay=dwc2"を追加します。
$ echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt
Mac側の設定
母艦PC側でUSB接続のインターネット共有を有効にします。
まず母艦PCとRaspberry Pi Zeroをデータ転送ができるUSBケーブルで接続します。その際、内側のMicroUSBコネクタに繋いでください。電源が入り、起動します。
macOSの場合、「設定>ネットワーク」で「RNDIS/Ethernet Gadget」が出現しているのを確認し、
「設定>共有」の「インターネット共有」を開き、「RNDIS/Ethernet Gadget」にチェックを入れた状態で「インターネット共有」を有効にしてください。
母艦はandroidスマートフォンでも代用可能です。内側のMicro USBコネクタをUSBテザリングがONになったスマートフォンへ接続、外側のMicro USBコネクタから電源を供給します。ターミナルのアプリは別途用意してください。IPアドレスを調べる方法は後述しています。
初回起動時は再パーティションをしているので、SSHでログインできるようになるまで若干時間がかかります。
$ ssh pi@(ホスト名).local
ユーザー名はpi、ホスト名およびパスワードはRaspberry Pi OS Imagerで設定した内容になります。
もし変更しなかった場合、ホスト名はraspberrypi.local、初期パスワードはraspberryになります。
この時点でネットワーク接続ができるので、raspi-config
でI2C/SPI/UART等のInterface等を適宜変更して初回設定は終了です。
$ sudo raspi-config
Bluetoothによる接続を設定したい場合は、さらに読み進めてください。
(オプション)Bluetoothテザリングによるネットワーク設定
こちらも必要に応じて設定してください。
まずはBluetoothのペアリングをします。
母艦(PC or スマートフォン)のBluetoothをオンにし、Bluetoothテザリングができる状態にします。Raspberry Pi Zero側で下記コマンドを実行すると、Macアドレスが取得できるので、控えておきます。
2022/4/4追記
mac OS Montereyから、Bluetoothによるテザリングは行えなくなりました。
適宜読み飛ばしてください。
$ hcitool scan
Scanning ...
XX:XX:XX:XX:XX:XX (ホスト名)
次にbluetoothctl
コマンドで実際にペアリングをします。
$ bluetoothctl
(スマートフォンとペアリングする際は以下3行を入力)
[bluetooth]# agent DisplayOnly
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# scan on
[NEW] Device XX:XX:XX:XX:XX:XX XX-XX-XX-XX-XX-XX
[bluetooth]# pair XX:XX:XX:XX:XX:XX
(先ほどのMACアドレスを貼り付ける or 先頭1文字入力してタブ補完)
※母艦側でペアリング許可のダイアログが出るはずですので、許可します
[bluetooth]# trust XX:XX:XX:XX:XX:XX(接続先のアドレスに置き換える)
[bluetooth]# exit
2023/5/13追記
テザリングはbt-panスクリプトを用います。ただし、配布元 (https://github.com/mk-fg/fgtk/blob/master/bt-pan) が2022/12にpython2系のスクリプトは削除という理由で公開停止してしまったため、現在は入手できません。ただ、ライセンスがWTFPL(どうとでも勝手にしやがれクソッタレ・公衆利用許諾(契約)書))であるため、python3に対応した版を公開しました。
参考: bt-panがない
$ wget https://gist.githubusercontent.com/hishizuka/d66189ec81316945c33531f7d4ddc68d/raw/319621b045254002beb774c701eafe0fc21c0f02/bt-pan
$ vim bt-pan
$ chmod 755 bt-pan
$ sudo ./bt-pan client XX:XX:XX:XX:XX:XX(接続先のアドレスに置き換える)
※dbusがないとエラーが出た場合はpython-dbus(Buster以前のバージョンではpython-dbusに変更)を別途インストール
$ sudo apt-get install python3-dbus
接続が成功すると母艦側でも確認のダイアログが出るはずです。IPアドレスを調べるには、Raspberry Pi Zero上でifconfig
コマンドでbnep0を探します。
$ ifconfig
bnep0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.xxx.xxx Bcast:192.168.xxx.xxx Mask:255.255.255.0
(以下略)
運用方法は各自工夫してください。
接続方法(bluetoothテザリング)
- 起動時に自動接続したい場合は、/etc/rc.localに
bt-pan
コマンドを記述 - 一定間隔で自動接続させたい場合はcronを利用 (消費電力が懸念)
- 手動で再接続したい場合は、GPIOのボタンで実装、あるいはPiTFT使用の場合はデスクトップにショートカット配置かGUIの機能に
bt-pan
コマンドを組み込む
IPを知る方法
- Bonjourを使う。母艦側にbonjour等zeroconfが入っていれば(Androidはアプリあり)、接続形態に関わらず、普通にホスト名.localで接続できます。
-
nmap -sP 192.168.xxx.*
等でスキャンする。(xxxはお使いのネットワークアドレスを入れてください) - bt-panで接続した直後にIPアドレスをどこかに送信する。
- LCDディスプレイやPiTFT等でIPアドレス表示の機能を用意しておく
- IPを固定する。母艦側のネットワークに縛られますので注意。
$ sudo vim /etc/network/interfaces
(192.168.2.*のネットワークにいる前提で、IPアドレスを192.168.2.2に固定する例)
allow-hotplug bnep0
iface bnep0 inet static
address 192.168.2.2
netmask 255.255.255.0
gateway 192.168.2.1
参考
Raspberry Pi OS Imagerが行ってくれる箇所を手動で行う場合の内容を記載します。
いずれも、MicroSDカードを再接続した状態で出現するbootというドライブがある状態の操作になります。
SSHを有効にする
boot内にsshという空のファイルを配置すれば、初回起動時にsshdサービスが有効になります。
$ touch /Volumes/boot/ssh
Wifiの設定(初回起動前)
boot内にwpa_supplicant.confを配置すれば、初回起動時に/etc以下にコピーされ、有効になります。
下記の設定例はパスワードは平文なので、気になる人はここでの設定はやめておいた方がいいです。
また、複数のアクセスポイントの指定も可能です。
$ vim /Volumes/boot/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
key_mgmt=WPA-PSK
ssid="アクセスポイント名"
psk="パスワード"
}
network={
key_mgmt=WPA-PSK
ssid="アクセスポイント名"
psk="パスワード"
}
Wifiの設定(起動後)
sudo raspi-config
の「1 System Options」>「S1 Wireless LAN」で設定できます。複数のアクセスポイントを設定したい場合は、都度追加します。
反映されたかどうかは sudo vim /etc/wpa_supplicant/wpa_supplicant.conf
を実行し、末尾に入力した内容があるか確認してください。
以上が前半の説明になります。お疲れ様でした!
【後半】マウス、キーボード、モニタを用意して行うセットアップ
(USB OTGがまだできなかった2016/1ごろに記載した内容です)
※画像は2016/1時点のもので古いですが、大枠は変化ないので特に差し替えていません。
用意するもの
- 「【前半】Wifi・USB接続によるセットアップ」の「用意するもの」で記載したMicro USBケーブル、Micro SDカード、USB Wifiアダプタ等。
- SDカードはイメージ書き込み済みとします。
- Micro USBケーブルは電源として使います。外側のMicro USBコネクタに繋ぎます。
- 上記の写真の例は、別途用意したACアダプター付きUSBハブに繋ぎ、電源を得ています。
- USBハブ・USBキーボード・USBマウス
- 手元にあるもので
- USBハブはUSB OTGアダプタを介して、内側のMicro USBコネクタに繋ぎます。
- HDMI入力端子があるモニタ・HDMIケーブル:
- ない場合はDVI変換等を行い、モニタに映せるようにしましょう。
※USB-UARTケーブルがあれば、別端末よりセットアップが可能になりますので、USBハブ、USBキーボード、USBマウス、モニタ、HDMIケーブルは不要になります。一方、下記のネットワークの接続はコンソールで行ってください。
初回起動
MicroSDカードをRaspberry Pi Zeroに装着し、HDMIモニタ、USBハブを繋ぎ、最後にUSB電源を繋いで電源をONにします。電源ON後、直ちにコンソールの起動画面が出て、しばらくするとデスクトップ画面が立ち上がります。
(ちょっと感動しました)
ネットワークの接続
デスクトップ画面が無事に出てきたら、右上の無線LANマークより無線LANに接続します。いったん接続すると、以後設定が保存されます。
ifconfig
コマンドでMACアドレスを調べ、ルーター側でDHCP固定割当の設定をしたほうが後々SSHから入る場合に楽ですね。
この時点で他のマシンからログインして作業ができるようになります。
続きは下記「初期設定 (コンソール編)」になります。
初期設定 (コンソール編)
SSHでRaspberry Pi Zeroに接続した状態で進めてください。
Rasberry Piのお作法に倣い、raspi-config
コマンドを実行します。以下のスクリーンショットは他のマシンからSSH接続で行った例です。
※後述の「初期設定 (デスクトップ編)」からも大体の設定ができます。
$ sudo raspi-config
カーソル上下でメニューの選択、タブキーで下部の左右メニューに移動、Escキーで戻るになります。
パーティション拡張
※最近のバージョンは初回起動時に自動で行うようになっているので、読み飛ばして下さい。
メニューの一番上、"1 Expand Filesystems"を選択します。
一旦リブートします。容量確認はdf -h
等で行ってみてください。
パスワード変更
"2 Change Password"から行います。
デスクトップ起動ではなく、コンソール起動に切り替え
"3 Boot Options"を選択し、B1 Console を選択します。オートログインも合わせて指定できますがお好みで。なお、コンソールで起動した状態からデスクトップを起動したい場合は startx
コマンドを使います
ロケール設定
"5 Internationalisation Options"を選択し、次に表示されるメニューのうち、"I1 Change Locale"を選択します。
英語しか使わない場合、デフォルトのen_GB.UTF-8 UTF-8でもいいですが、お好みになりますが、デフォルトでよく使われるen_US.UTF-8 UTF-8に変更します。
また、後述にリンクで示した日本語を表示、入力したい場合は日本語ロケールである ja_JP.EUC-JP EUC-JP と ja_JP.UTF-8 UTF-8 も選択します。(コンソールのみ複数選択可で、後述のデスクトップから設定を行う場合は複数選択できないようです)
最後にデフォルトのロケールを聞いてくるので、en_US.UTF-8 UTF-8にしておきます。ここで日本語を選択すると、ターミナル等でも日本語が表示されますので、お好みで。
タイムゾーン
"5 Internationalisation Options"から、"I2 Change Timezone"を選択します。
日本の設定をしたい場合は、Asia -> Tokyoとします。
キーボード
ヘッドレス運用をする場合、設定を省略しても構いませんが、"5 Internationalisation Options"から、"I3 Change Keyboard Layout"から行えます。
デフォルトは英語キーボードの設定です。製品固有のキーを使いたい場合は詳細なモデルを別途指定すれば使用できると思われます。
汎用的な日本語キーボードの場合、Generic 105-key (Intl) PC から言語を Other を選択し、言語一覧から Japanese を選択、日本語キーボードの種類一覧から Japanese を選びます。
その他
ホスト名変更、SSHの起動、SPIやI2CのON/OFFは"9 Advanced Options"から行います。SSHはデフォルトでオンになっています。お好みに合わせて変更してください。
ここまで一通りの設定が終了したら再起動します。
初期設定 (デスクトップ編)
デスクトップ画面のPreferences -> Raspberry Pi Configuration から上記の「初期設定 (コンソール編)」と大体の設定ができます。ロケール設定だけ言語の複数選択ができませんでした。
システムのアップデート
再起動後、システムをアップデートします。
$ sudo apt-get update
$ sudo apt-get upgrade
ついで、必要なパッケージをインストールします。(自分はvimとscreenがまず必要なので)
$ sudo apt-get install screen vim
以上、USB電源を入れるのみでネットワークに接続され、SSHからログインできるRaspberry Pi Zeroのできあがりです。いろいろ使い倒しましょう!
デスクトップ日本語対応
デスクトップやVNCを使う時に、日本語フォントの表示・入力ができません。とりあえずはブラウザを使う際に不便かと思います。Raspberry Pi の軽量な日本語化 (2014/11/03, 2015/02/17)を参考にすると日本語環境が出来上がります。
参考
5GHz Wifiが使えるUSBアダプタを使用可能とするために、カーネルをクロスコンパイルする手順を示しています。