ある新人の話
先輩「Nervesやってみて。
mix nerves.newして Raspberry Pi 4 に焼くだけだから」新人「わかりました!」
――30分後――
新人「あの、焼いたんですけど、SSHできないです。ネットワークに繋がってないみたいで……」
先輩「設定ちゃんと書いた?
config/target.exsに Ethernet の設定あるでしょ」新人「書きました。でもダメです」
先輩「おかしいな、俺のときは普通にできたけど。もう一回やってみて」
新人「(3回目……)」
この新人は何も間違っていません。手順は完璧です。
原因は Raspberry Pi 4 本体の EEPROM が古かったこと。先輩のRaspberry Pi 4はたまたまEEPROMが新しかっただけ。同じ手順でも、ハードウェアの状態が違えば結果が変わる。ソフトウェアの世界にいると忘れがちですが、IoTでは「目に見えないハードウェアの差」がハマりポイントになります。
新人のみなさん、手順通りにやって動かないとき、自分を責めないでください。あなたのせいじゃないことも多いです。そして先輩のみなさん、「俺のときはできた」は禁句です。環境が違えば結果も違います。一緒にデバッグしましょう。
この記事が、同じ壁にぶつかった誰かの助けになれば幸いです。
はじめに
nerves_system_rpi4 が 2.0 系にメジャーアップデートされました。
ところが、まっさらな mix nerves.new プロジェクトを Raspberry Pi 4 に焼いたら Ethernet でIPアドレスが取れない。SSHもできない。5分待ってもダメ。
1.33 系に戻すと普通に動く。何が起きているのか。
結論:Raspberry Pi 4 の EEPROM が古いと、Nerves 2.0 系ではネットワークに接続できないことがあります。
この記事では、問題の再現手順、原因の特定、EEPROM の更新方法までをまとめます。
症状
-
nerves_system_rpi42.0.1 でビルド・焼き込み - Ethernet で DHCP による IP アドレス取得ができない
-
mix nerves.discoverでデバイスが見つからない - SSH 接続不可
- 5分以上待っても変化なし
一方、nerves_system_rpi4 1.33.1 に戻すと正常に動作します。
再現手順
mix local.hex
mix local.rebar
mix archive.install hex nerves_bootstrap # => 1.15.1
export MIX_TARGET=rpi4
mix nerves.new hello_nerves
cd hello_nerves
mix deps.get # => nerves_system_rpi4-portable-2.0.1
config/target.exs に Ethernet の設定を書きます。
config :vintage_net,
regulatory_domain: "JP",
config: [
{"usb0", %{type: VintageNetDirect}},
{"eth0",
%{
type: VintageNetEthernet,
ipv4: %{method: :dhcp}
}},
{"wlan0", %{type: VintageNetWiFi}}
]
mix firmware
mix burn
microSD を Raspberry Pi 4 に挿して電源ON → Ethernet が繋がらない。
原因:EEPROM が古い
Nerves の作者 fhunleth さんから、EEPROM のバージョンが古いと新しい TRYBOOT 機能に対応できない可能性を指摘されました。
EEPROM のビルドタイムスタンプを確認するコードがこちらです(1.33.1 系で SSH 接続して実行)。
iex> File.read!("/proc/device-tree/chosen/bootloader/build-timestamp")
|> :binary.decode_unsigned()
|> DateTime.from_unix!()
~U[2020-09-03 12:11:43Z]
2020年9月。かなり古い。少なくとも 2022-10-18 以降 の EEPROM が必要とのことです。
リリースノートはこちら:
https://github.com/raspberrypi/rpi-eeprom/blob/master/firmware-2711/release-notes.md
解決方法:EEPROM を更新する
fhunleth さんが nerves_rpi_eeprom というツールを用意してくれています。
方法1: Nerves Livebook から実行(おすすめ)
Nerves Livebook を焼いた状態で、以下を実行します。
v0.18.0なら、EEPROMが古い状態でもネットワークにつながります。
{:ok, resp} =
Req.get("https://raw.githubusercontent.com/fhunleth/nerves_rpi_eeprom/refs/heads/main/lib/nerves_rpi_eeprom.ex")
Code.eval_string(resp.body)
NervesRpiEeprom.update_to_latest()
Toolshed.reboot!()
これだけで EEPROM が最新版に更新されます。/boot の remount も内部で処理されるため、手動操作は不要です。
方法2: 自分のプロジェクトに組み込む
mix.exs に依存を追加します。
{:nerves_rpi_eeprom, github: "fhunleth/nerves_rpi_eeprom"}
mix deps.get
mix firmware
mix burn
1.33.1 系で焼いて SSH 接続し、IEx で実行します。
iex> NervesRpiEeprom.update_to_latest()
更新後にリブートします。
iex> Toolshed.reboot!()
方法3: Raspberry Pi ImagerでEEPROMをリカバリする
割と新しいもの(2026/04/05現在、~U[2026-01-09 16:12:13Z])が手に入りますので、こちらでも十分です。
- Raspberry Pi ImagerのUIがだいぶ変わっていますが、基本的な流れは同じです
- 手順の「"Raspberry Pi 4 EEPROM boot recovery" をクリック」では、「SD Card Boot」を選択してください。
- 「緑LEDがチカチカ点滅する。」について
- LEDが次の順序で点灯・点滅
- 赤🔴と緑🟢が点灯
- 緑🟢が超高速に点滅 (EEPROM 更新中のため、電源を OFF にしないでください)
- 数秒(目安:5秒程度)経過
- 緑🟢の点滅が一定のリズム(②とは異なる状態)に変化したら、書き込み完了のサインです
- Raspberry Piの電源をOFFにして、microSDカードを抜いてください
- LEDが次の順序で点灯・点滅
更新の確認
リブート後、再度タイムスタンプを確認します。
iex> File.read!("/proc/device-tree/chosen/bootloader/build-timestamp")
|> :binary.decode_unsigned()
|> DateTime.from_unix!()
~U[2026-02-23 14:56:33Z]
2026年2月のバージョンに更新されました。
EEPROM 更新後
EEPROM を更新したら、2.0 系でビルドし直します。
# mix.exs
{:nerves_system_rpi4, "~> 2.0", runtime: false, targets: :rpi4}
mix deps.get
mix firmware
mix burn
LAN に接続できるようになりました 🎉
まとめ
| 項目 | 内容 |
|---|---|
| 症状 |
nerves_system_rpi4 2.0 系で Ethernet が繋がらない |
| 原因 | Raspberry Pi 4 の EEPROM が古い(TRYBOOT 未対応) |
| 必要な EEPROM | 2022-10-18 以降 |
| 解決策 |
nerves_rpi_eeprom で EEPROM を更新 |
※ TRYBOOT は Raspberry Pi のブート切り替え機能で、新しい Nerves ではこれを前提に動作しています。
Nerves 2.0 系で「ネットワークに繋がらない!」となったら、まず EEPROM のバージョンを疑ってみてください。
まずは以下を実行して、現在の EEPROM のバージョンを確認してみてください。
File.read!("/proc/device-tree/chosen/bootloader/build-timestamp")
|> :binary.decode_unsigned()
|> DateTime.from_unix!()
参考
- nerves-project/nerves_system_rpi4#314 — 本記事の元になった Issue
- fhunleth/nerves_rpi_eeprom — EEPROM 更新ツール
- Raspberry Pi 4 Bootloader EEPROM Release Notes
環境
- Elixir: 1.19.1-otp-28
- Erlang: 28.1.1
- nerves_bootstrap: 1.15.1
- nerves_system_rpi4: 2.0.1
- ターゲット: Raspberry Pi 4