はじめに
Nerves ファームウエアで動くのデバイス(Raspberry Pi 4等)のストレージをホストの PC にマウントします。
やり方はいくつかあるそうですが、ここでは sshfs を使う方法に挑戦します。
環境
ホスト
- OS: LMDE 6 (Faye) x86_64
- デスクトップ: Cinnamon 6.0.4
- 機種: ThinkPad P14s Gen 4
Nerves
- 対象デバイス: Raspberry Pi 4
- Nerves ファームウエア: nerves_livebook v0.13.0
Nerves Livebook
Nerves Livebookを使用すると、何も構築せずに実際のハードウェアで Nerves プロジェクトを試すことができます。
Livebook のノートブック上でコードを実際に実行しながら進められるので、ブラウザーで快適に 楽しくNerves を学べます。例えば、ブラウザ上でターゲットデバイスの Wi-Fi の設定ができます。
有志の方々が Nerves Livebook のセットアップ方法ついてのビデオやコラムを制作してくださっています。ありがとうございます。
Nerves デバイスの読み書きできる場所
/data(/root へのシンボリックリンク) が Nerves システムの書き込み可能な部分です。
これは、vintage_net を含むいくつかのライブラリが永続化のために使用しています。
書き込み可能なパーティションは常に /root ですが、書き込み可能なパーティションを簡単に識別できるようにする目的で、シンボリックリンク/dataが追加されることになった経緯があるようです。
iex(livebook@nerves-9bd5.local)6> ls "/"
bin boot data dev etc
lib lib64 media mnt opt
proc root run sbin srv
sys tmp usr var
iex(livebook@nerves-9bd5.local)7> cmd "ls -l /root"
-rw-r--r-- 1 root root 19008 Apr 1 01:29 last_shutdown.txt
drwx------ 2 root root 3488 Apr 1 00:55 vintage_net
drwx------ 2 root root 3488 Jul 11 22:48 seedrng
drwx------ 2 root root 3488 Jul 11 22:48 livebook
drwx------ 3 root root 3488 Apr 1 00:53 nerves_ssh
0
iex(livebook@nerves-9bd5.local)8> cmd "ls -l /data"
lrwxrwxrwx 1 root root 4 Oct 21 2020 /data -> root
0
sshfs コマンド
sshfs コマンドは、SSH を使用してリモートのファイルシステムをホストの PC にマウントするプログラムです。多数のファイルを手早く操作したいときに非常に便利です。
ファイル共有の方法は他にもありますが、 sshfs はサーバー側の設定が不要という利点があるそうです。
デフォルトでは含まれていない場合、ホスト PC にインストールする必要があります。Debian の場合は以下のコマンドでインストールできました。
sudo apt install sshfs
使い方はsshfs --help や man sshfs で確認できます。
$ sshfs --help
usage: sshfs [user@]host:[dir] mountpoint [options]
...snip...
必要に応じて-oオプションにより、様々な SSH のオプションを指定することが可能のようです。
論より Run
やること
sshfs コマンドを使って、Nerves デバイス上の /root をホストの PC にマウントします。
これにより、Nerves デバイス上のファイルをホストの PC 上で直接、編集できるようになります。
Nerves デバイスを準備
いつも通り、Nervesで作ったファームウエアを焼いた micoSD カードが挿入されたデバイスを起動します。
ターミナルを開きます。
pingコマンドでネットワーク接続を確認します。
mnishiguchi@thinkpad:~
$ ping -c3 nerves-9bd5.local
PING nerves-9bd5.local (172.31.224.217) 56(84) bytes of data.
64 bytes from 172.31.224.217 (172.31.224.217): icmp_seq=1 ttl=64 time=0.292 ms
64 bytes from 172.31.224.217 (172.31.224.217): icmp_seq=2 ttl=64 time=0.291 ms
64 bytes from 172.31.224.217 (172.31.224.217): icmp_seq=3 ttl=64 time=0.246 ms
--- nerves-9bd5.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.246/0.276/0.292/0.021 ms
SSH 接続してみます。
mnishiguchi@thinkpad:~
$ ssh nerves-9bd5.local
Nerves Livebook
https://github.com/nerves-livebook/nerves_livebook
ssh livebook@nerves-9bd5.local # Use password "nerves"
(mnishiguchi@nerves-9bd5.local) Password:
Interactive Elixir (1.17.2) - press Ctrl+C to exit (type h() ENTER for help)
████▄▄ ▐███
█▌ ▀▀██▄▄ ▐█
█▌ ▄▄ ▀▀ ▐█ N E R V E S
█▌ ▀▀██▄▄ ▐█
███▌ ▀▀████
nerves_livebook 0.13.0 (a623fa83-b771-5029-b281-acb8d205aea5) arm rpi4
Serial : 100000007e279bd5
Uptime : 29 minutes and 35 seconds
Clock : 2024-07-11 23:18:19 UTC (unsynchronized)
Temperature : 63.8°C
Firmware : Valid (B) Applications : 111 started
Memory usage : 209 MB (3%) Part usage : 288 MB (2%)
Hostname : nerves-9bd5 Load average : 0.05 0.06 0.04
usb0 : 172.31.224.217/30, fe80::c082:b7ff:fe10:409b/64
Nerves CLI help: https://hexdocs.pm/nerves/iex-with-nerves.html
Toolshed imported. Run h(Toolshed) for more info.
iex(livebook@nerves-9bd5.local)1>
Nerves のストレージをホストの PC にマウントする
Nerves に SSH 接続したターミナルとは別に、新しいターミナルを開きます。
ホストの PC 上にマウントポイントとして任意の名前のディレクトリを作成し、そこへ Nerves デバイス上のディレクトリをマウントします。
例としてここでは /tmp/nerves-sshfs/をマウントポイントとします。
mnishiguchi@thinkpad:~
$ mkdir -p /tmp/nerves-sshfs
そしてそのディレクトリに Nerves デバイスの読み書き可能ストレージである /root をマウントします。
mnishiguchi@thinkpad:~
$ sshfs nerves-9bd5.local:/root /tmp/nerves-sshfs
(mnishiguchi@nerves-9bd5.local) Password:
マウントポイントの中身を見てみると、Nerves デバイス上の/rootにあるファイルが入っています。
mnishiguchi@thinkpad:~
$ ls /tmp/nerves-sshfs/
livebook/ nerves_ssh/ seedrng/ vintage_net/ last_shutdown.txt
試しにファイル操作をしてみる
Nerves デバイスのターミナルで/rootの中身を確認します。
iex(livebook@nerves-9bd5.local)1> cmd "ls /root"
last_shutdown.txt
vintage_net
seedrng
livebook
nerves_ssh
0
ホスト側のマウントポイントで新しいファイルを作成してみます。
mnishiguchi@thinkpad:~
$ echo "元氣ですかーーーーッ!!!" > /tmp/nerves-sshfs/hello.txt
Nerves 側で/rootの中身を再度確認すると新しく作ったファイルが入っています!
iex(livebook@nerves-9bd5.local)2> cmd "ls /root"
hello.txt #<--- これ
last_shutdown.txt
vintage_net
seedrng
livebook
nerves_ssh
0
iex(livebook@nerves-9bd5.local)3> cat "/data/hello.txt"
元氣ですかーーーーッ!!!
アンマウント
リモートのファイルシステムの使用が完了したら、fusermount コマンドでアンマウントします。
mnishiguchi@thinkpad:~
$ fusermount -u /tmp/nerves-sshfs
mnishiguchi@thinkpad:~
$ ls /tmp/nerves-sshfs/
![]()
![]()
![]()