この記事はNerves JP Advent Calendar 2020の10日目の記事です。
結論
2020年12月8日現在,NervesはRosetta 2モードでは動作しますが,ARMネイティブモードでは動作しません。
また,ARMネイティブモードでasdf install elixir (バージョン番号)
としてインストールした後,ターミナルをRosetta 2モードにして起動しなおしたときにElixirは正常に動作するのですが,Nervesを使おうとするとARMネイティブモードとみなされて動作しません。
Elixirのインストール方法について
現時点でApple Silicon M1チップ搭載Macで推奨されるElixirのインストール方法は,brew install elixir
でインストールする方法です。
asdf install elixir (バージョン番号)
によるインストール方法では,ARMネイティブモードとx86_64/Rosetta 2モードのバイナリを共存できない問題があります。Nervesは現時点で後者のモードでしか動作しないので,前者でElixirをインストールしてしまうと Nerves が動作しないという不具合に見舞われます。
Elixirのインストール方法については,こちらを参照ください。Rosetta 2モードのHomebrewでのインストール方法に従ってください。
Nervesのインストール
公式ライブラリに沿ってインストールします。
ただし,HomebrewでインストールしたElixirはアンインストールせずそのままにして,asdf
は使わずにしておきます。
手順を上げておきます。
- アプリケーション/ユーティリティ フォルダを開いてターミナルの「情報を見る」を開きます。
- 「Rosettaを使用して開く」にチェックを入れます。
- ターミナルを起動します。
- Homebrew をインストールします。
-
brew install elixir
としてElixirをインストールします。 brew update
-
brew install fwup squashfs coreutils xz pkg-config
として前提ライブラリをインストールします。 -
mix local.hex
とします。 -
mix local.rebar
とします。 -
mix archive.install hex nerves_bootstrap
としてNervesがインストールできました。
Hello Nervesをやってみる
に沿ってファームウェアを作ってみましょう。
- 試しに
mix nerves.new hello_nerves
としてNervesプロジェクトを作りましょう。 - 次に,
cd hello_nerves
とします。 - もし Raspberry Pi 3用にファームウェアを作るのであれば,
export MIX_TARGET=rpi3
とします。 -
mix deps.get
とします。(もし,ARMネイティブモードになっている場合には,ここでコケます) -
iex -S mix
を実行してホストで実行してみます。-
HelloNerves.hello
を実行すると:world
と出ることを確かめます。 - Ctrl-Cとaを押して終了します。
-
- 次のいずれかでターゲット(例えばRaspberry Pi 3)と接続します。
- ホストとターゲットをUSBで接続する (今回,未検証です)
- ホストとターゲットを有線LANで直に接続する
- 2の場合は,
config/target.exs
を編集します(後述)。 - Micro SDをアダプタを介してMacに挿します。
-
mix firmware.burn
とします。-
/dev/rdisk4? [Yn]
でy
と答えます - パスワード入力のウィンドウが立ち上がりますので,ログインパスワードを入れてください
-
- Micro SDを外して,ターゲットに挿入します。
- ターゲットを起動します。
- 接続方法で2を選んだ場合には,
ping nerves.local
として接続を確認します。 - 接続されていたら
ssh nerves.local
とします。-
HelloNerves.hello
を実行すると:world
と出ることを確かめます。 -
exit
として終了します。
-
これで動作が確認できました!
ARMネイティブモードでNervesを動かすために
NervesをM1 Macで動作させようとして,Rosetta 2モードでは成功したことと,ARMネイティブモードでは動作しなかったことを,世界で初めて私が報告しました。 https://github.com/nerves-project/toolchains/issues/66
Nervesの作者の1人のJustin Schneck氏もM1 Mac入手に動いているのですが,到着するのに4-5週間かかるということなので,私が協力してARMネイティブモードで動かすべく作業を続けています。
方向性としては,M1 Macでbuild_release.sh
というスクリプトを使用して,イメージを作成しGitHubに登録すれば良いのですが,なかなか正常に動作せずに苦戦しています。
おわりに
明日のNerves JP Advent Calendar 2020の11日目は @mnishiguchi さんの「Elixir/Nervesでパルス幅変調 (PWM) Lチカ」です。
本研究成果は、科学技術振興機構研究成果展開事業研究成果最適展開支援プログラム A-STEP トライアウト JPMJTM20H1 の支援を受けた。