ymmooot

nasne を Raspberry Pi にマウントして SQLite の DB オブジェクトを置く

Raspberry Pi を24時間運用していて気になるのが SD カードの寿命。
頻繁に読み書きするファイルを SD カードに置きたくないので、既に設置してある nasne に保存することにした。
(nasne は現在 Buffalo の事業になったが、ここで利用しているのは Sony 時代のもの。)

nasne をマウントする

nanse の IP アドレスを確認

nasne 底面に書いてあるファイルサーバー名に ping したり、底面に書いてある MAC アドレスを arp コマンドで探したり、torne の設定画面を見たりすれば分かる。

nasne の IP アドレスを固定

ブラウザから nasne の IP アドレスにアクセスすると設定画面が現れるので、そこで「基本設定」の IP アドレス設定を「自動取得」から「手動」に変えて、自動振り当て範囲外のアドレスに固定するか、DHCP サーバー側で固定する。

マウントポイントの作成

ここからの作業は Raspberry Pi。

$ sudo mkdir /mnt/nasne
$ sudo mount -t cifs //192.168.x.xx/share1/ /mnt/nasne -o sec=none,vers=1.0,uid=xxxx,gid=xxxx

とりあえずマウントして成功するか確かめる。
自分は Raspberry Pi の pi ユーザを消去して別のユーザでログインしてるため、uid と gid が1001。(特にいじってない場合は1000)
uid が異なってもマウントはできるがファイル操作の権限がないため、いちいち sudo する必要があるっぽい。
マウントできたら適当に Raspberry Pi 用のディレクトリを作る。(ここでは raspberrypi を作ったとする。)

nasne の外付けハードディスクを利用したい場合は /share2 を指定する。

起動時に自動でマウントする

以下の内容を /etc/fstab に追記。
詳しくは fstab(5), mount(8) あたりを見ればいいっぽい。

/etc/fstab//192.168.x.xx/share1/raspberrypi /mnt/nasne cifs username=xxxx,password=,vers=1.0,iocharset=utf8,uid=xxxx,gid=xxxx,forceuid,forcegid,_netdev 0 0

再起動して確認

自動マウントを確認するため再起動する。

bash$ df -h
Filesystem                        Size  Used Avail Use% Mounted on
//192.168.1.6/share1/raspberrypi  465G  387G   79G  84% /mnt/nasne

こんな感じで確認できたら終わり。
(Sony 時代のものなので 500 GB しかない。Buffalo 製は内蔵容量 2 TB で外付は6 TB まで対応している。)

SQLite を nasne に置いて読み書きする

あとは SQLite の実体を nasne に指定した上で通常通り使うだけ。とりあえず Python でやってみる。

write.py# 書き込み
import sqlite3

con = sqlite3.connect('file:/mnt/nasne/sample.db', uri=True)
cur = con.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS sample(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)')
cur.execute('INSERT INTO sample(name) values("foo")')
con.commit()
con.close()
read.py# 読み取り
import sqlite3

con = sqlite3.connect('file:/mnt/nasne/sample.db', uri=True)
cur = con.cursor()
cur.execute('SELECT * FROM sample')
print(cur.fetchall())
con.close()

/*
[(1, 'foo')]
*/

特に通常の使用方法と違いはない。

まとめ

考えられる利点

  • センサーのハンドリングと書き込みを Python で書いてダッシュボードを Node.js で作るなど SQLite の実装言語の多さを活かせる
  • SQLite の DB の実体は単一のファイルなので、どこかにアップロードして他で使うことも可能
    • 最近だとこういうのもある
  • DB のファイルをアップロードせずとも、バッチでデータを取り出してスプレッドシートにアップロードすることで、API リクエスト上限に引っかからないようにして、スプレッドシートをバックエンドとしたサービスを作る

share2 を指定すればハードディスク容量も2 TB まで増やすことができる上、新しい機器を何も設置せずに簡易 DB が作れたので満足。