7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nerves 2.0でLANに接続できない?原因はRaspberry Pi 4のEEPROMが古いせいだった

7
Last updated at Posted at 2026-04-05

ある新人の話

先輩「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_rpi4 2.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])が手に入りますので、こちらでも十分です。

[メモ] ラズパイ4のEEPROMリカバリ

  • Raspberry Pi ImagerのUIがだいぶ変わっていますが、基本的な流れは同じです
  • 手順の「"Raspberry Pi 4 EEPROM boot recovery" をクリック」では、「SD Card Boot」を選択してください。
  • 「緑LEDがチカチカ点滅する。」について
    • LEDが次の順序で点灯・点滅
      1. 赤🔴と緑🟢が点灯
      2. 緑🟢が超高速に点滅 (EEPROM 更新中のため、電源を OFF にしないでください)
      3. 数秒(目安:5秒程度)経過
      4. 緑🟢の点滅が一定のリズム(②とは異なる状態)に変化したら、書き込み完了のサインです
    • Raspberry Piの電源をOFFにして、microSDカードを抜いてください

更新の確認

リブート後、再度タイムスタンプを確認します。

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!()

参考

環境

  • Elixir: 1.19.1-otp-28
  • Erlang: 28.1.1
  • nerves_bootstrap: 1.15.1
  • nerves_system_rpi4: 2.0.1
  • ターゲット: Raspberry Pi 4
7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?