河野哲治氏のコラム「EMFSとLuaスクリプトで便利な作業環境をつくる」

みなさんこんにちは、テックデザインの河野です。

ヤマハルーターはLuaスクリプトで様々なカスタマイズができることはよく知られていますが、Luaスクリプトを手軽に利用できるEMFSという機能はご存知でしょうか?EMFS(EMbedded File System?)は2018年にリリースされた機能でLuaスクリプトを活用するうえで非常に便利な機能なのですが、ヤマハネットワーク機器の技術資料以外にEMFSについて解説をしている資料はほとんど見当たりません。そこで今回はこのEMFSについて詳しく解説します。

EMFSとは

読み出し専用のファイルをconfig内に保存できるファイルシステムで、Luaスクリプトやマクロをconfigファイルと一体で扱うことができます。ルーター上でコーディングできるため、RTFS使用時のPCでLuaスクリプトを作成してファイルをTFTP等で転送するというプロセスがなく、ちょっとしたスクリプトを手軽に実行するのに最適です。

内蔵不揮発メモリー内に保存する点ではRTFSと同じですが、RTFSはPCのファイルシステムと同様にディレクトリ構造を持つ汎用的なストレージとして利用できる一方、EMFSは読み出し専用なのでLuaスクリプトのAPIからファイルの作成、変更、削除を行うことはできません(表1)。また、RTFSは比較的古い機種から対応しているのに対して、EMFSはルーター現行機種のみの対応となります(表2)。

表1 EMFSとRTFSの機能比較

EMFSRTFS
内蔵不揮発メモリー内での保存先configRTFS領域
読み出し
書き込み×
ディレクトリ構造×
ルートディレクトリemfs://

表2 対応機種一覧

EMFSRTFS
vRXRev.19.00.01以降*1
RTX830Rev.15.02.03以降Rev.15.02.01以降
NVR510Rev.15.01.13以降Rev.15.01.02以降
NVR700WRev.15.00.14以降Rev.15.00.02以降
RTX1210Rev.14.01.26以降Rev.14.01.05以降
RTX5000Rev.14.00.26以降Rev.14.00.08以降
RTX3500Rev.14.00.26以降Rev.14.00.08以降
FWX120×Rev.11.03.02以降
RTX810×Rev.11.01.04以降
NVR500×Rev.11.00.06以降
RTX1200×Rev.10.01.16以降
SRT100×Rev.10.00.52以降
YSL-V810×Rev.1.03.01以降

※1:vRXのファイルシステムは「ユーザー領域」と呼ばれ、RTFSとほぼ同様に利用可能ですがrtfs関連コマンドは実装されていません(2020年12月1日現在)。

EMFSを使ってみよう

EMFS上にファイルを作成、保存する際はembedded fileコマンドを使用し、no embedded fileで作成したファイルを削除することができます。まずはEMFSの解説ページ(http://www.rtpro.yamaha.co.jp/RT/docs/emfs/index.html)の例にならって簡単な内容のテキストファイルを作成してみます。

# embedded file test.txt <<EOF
This is a test file.
EOF

show file listコマンドで確認すると、test.txtが作成されているのが確認できます。表示される時間はファイルの作成時間ではなく、このコマンドを実行した日時になります。

# show file list emfs:/
2020/11/25 14:36:49              21 test.txt

次にLinuxのcatコマンドのようにファイルの内容を表示するLuaスクリプトを作成します。

# embedded file cat <<EOF
f=io.open(arg[1])
for l in f:lines() do
  print(l)
end
f:close()
EOF

# show file list emfs:/
2020/11/25 14:40:10              65 cat
2020/11/25 14:40:10              21 test.txt

show configでconfigの内容を表示すると、どちらもconfigの最後尾付近に直接記述されているのを確認することができます。

# show config
(省略)
embedded file test.txt <<EOF
This is a test file.
EOF
embedded file cat <<EOF
f=io.open(arg[1])
for l in f:lines() do
  print(l)
end
f:close()
EOF

Luaスクリプトとして実行してtext.txtの内容が表示されることを確認してみます。

# lua emfs:/cat emfs:/test.txt
This is a test file.

スクリプトを使いやすくするため、aliasコマンドでlua emfs:/catコマンドをcatという名前でエイリアスに設定します。エイリアスは@を付けることで実行することができます。

# #エイリアスの設定
# alias cat='lua emfs:/cat'

# #エイリアスの実行
# @cat emfs:/test.txt
This is a test file.

このcatスクリプトを使うとRTFS領域のファイル内容も表示できるので、RTFS領域のファイル内容を確認するためにTFTPなどでファイルをダウンロードする手間が省けます。echoやgrepのようにヤマハルーターの基本コマンドとして実装してもらえると嬉しいLinuxコマンドのひとつですね。

LANマップの機器情報を取りだしてみる

ここからは便利に使うためのカスタマイズ例の紹介です。CLIでもshow lan-map interface detailコマンドでLANマップの端末情報を確認することができますが、端末の情報が複数行にわたるためgrepでは必要な情報だけをピンポイントで抽出することが難しく、データの2次利用もしづらい形式です。LANマップの機器情報はRTFS領域の/lanmap/devinfo_master.csvに保存されているので、先ほどのcatスクリプトを少し改造してこのCSVからワンライナーで目的の端末情報を抽出するLuaスクリプトを作ってみます。

# embedded file devinfo <<EOF
f=io.open("/lanmap/devinfo_master.csv")
for l in f:lines() do
if (arg[1]) then
if string.match(l, arg[1]) then
print(l)
end
else
print(l)
end
end
f:close()
EOF
# #エイリアス設定
# alias devinfo="lua emfs:/devinfo"

エイリアス@devinfoの引数にMACアドレスを与えると該当する端末の情報のみを表示し、引数なしで実行した場合はdevinfo_master.csvの内容を表示します。devinfo_master.csvの文字コードはShift-JISなので、2バイト文字が文字化けする場合はターミナルの文字コードをShift-JISに変更してください。

#情報を取得したい機器のMACアドレスから情報を抽出
@devinfo 6c:56:97:xx:xx:xx
6c:56:97:xx:xx:xx,03010,Amazon,Echo dot,amazon-123456789,,寝室,on,

CSVには値しかなく機器の種類もコード表示なので、人間の見やすさを優先するのであれば、

show lan-map interface detail

の結果をlessコマンドに渡して検索するのが良いでしょう。

show lan-map interface detail | less
 [6c:56:97:xx:xx:xx]
 IPアドレス        : 192.168.100.xx
 検出時刻          : 2020/11/25 15:08:06
 種類              : Speaker
 メーカー          : Amazon
 機種名            : Echo dot
 機器名            : amazon-123456789
 OS                :
 コメント          : 寝室
 スナップショット  : on
 SSID              : ********
 周波数            : 2.4Ghz
(以下略)
/6c:56:97:xx:xx:xx (Enter)

Luaスクリプトを使ってDIYで必要な機能を追加できるのはヤマハルーターの大きな魅力ですね。