先日、ラズパイでデジタルサイネージを自作できないかと相談されまして。まあラズパイを採用するのが最適解かは分かりませんが、作れないことはないだろうということでラズパイとNASを組み合わせた作り方を考えてみました。
作り方と言ってもそんな大層なものではなく、デジタルサイネージとして表示したいコンテンツのデータをNASに保存しておき、ラズパイからNASにアクセスしてディスプレイに全画面表示するだけですが。
そんなわけでラズパイからNASにアクセスする必要があるわけですが、自宅のASUS製無線LANルーターで構築した簡易NASで試みたところ、若干躓いてしまったので備忘録がてらやり方をまとめておきます。。
ラズパイからNASにアクセスする方法
私が実行した環境は以下の通りです。RT-AC67UはASUS純正のファームウェアではなく、Asuswrt-Merlinを使用しています。
デバイス | ファームウェア |
---|---|
Raspberry Pi Zero WH | 2021-03-04-raspios-buster-armhf |
RT-AC67U | Asuswrt-Merlin 386.2_2 |
ラズパイからNASにアクセスしてローカルのデータと同じように扱うためには、ラズパイにNASをマウントする必要があります。
そしてマウントするためには、NAS側からアクセスの許可をしてやらないといけません。
ルーターの設定を変更してNASへのアクセスを許可する
今回はルーターの簡易NAS機能を使用しているので、ルーターの設定を変更してNASへのアクセスを許可してやります。
RT-AC67Uの場合はhttp://192.168.1.1、またはhttp://router.asus.comから詳細設定画面にアクセスすることが可能です。
ログインしたら左側にあるメニューのUSBアプリケーションからAiDiskを選択し、ファイル共有の詳細設定にアクセスすると、Asuswrt-Merlinでは以下の4種類の共有方法が表示されます。
- メディアサーバー
- Samba 共有 / Cloud Disk
- NFS Exports
- FTP 共有
なお記事公開時点では、純正ファームウェアだと最新版でもNFSには対応していません。
それぞれ用途や認証方法など使い方が異なったりしますが、排他利用ではないのですべて同時に有効化することも可能です。
今回はSambaとNFSを利用してみることにしました。
Samba/SMBv2でマウントする
まずはSamba共有を有効化して、各項目を設定していきます。
上側の設定項目については以下を参考にしてください。
ゲストアクセスを許可する | ユーザー認証が不要ならOFF |
---|---|
最大同時接続数 | 最大9台まで設定可能 |
デバイス名 | 任意 |
ワークグループ | 任意 |
Samba protocol version | SMBv2を推奨 |
Simpler share naming(without the disk name) | はい |
Force as Master Browser | 任意 |
Set as WINS server | 任意 |
基本的にはお好みで設定してもらって構いませんが、Simpler share namingは有効化してください。そうしないと共有したいファイルの名称に強制的に半角スペースが入ってしまい、後述するコマンドでマウントできませんでした。。
またSambaのプロトコルについてはSMBv1とSMBv2、2つのバージョンのSMBをサポートしていますが、SMBv1は現在セキュリティー的に非推奨とされています。両方同時に有効化できますが、ラズパイをクライアントとして利用するだけならSMBv2のみでも問題ありません。
下部では共有するディレクトリや認証するユーザー、権限の設定が可能です。なおHDDを丸ごとマウントすることはできません。必ずディレクトリ単位でマウントする必要があります。
設定が完了したら、ラズパイの設定に進みます。まずcifs-utilsが入っていなければインストールしましょう。
$ sudo apt install cifs-utils
現在の定義ではCIFSとはSMBv1のことを指すのが正しい解釈だそうですが、ここではSambaと同一だと考えてもらえればOKです。
次にマウント先のディレクトリを作成して、権限を変更しておきます。
$ sudo mkdir /mnt/nas $ sudo chmod 0777 /mnt/nas
準備が整ったら以下のようにmountコマンドを実行します。
$ sudo mount -t cifs //192.168.1.1/Test /mnt/nas -o username=xxxx,password=xxxx,iocharset=utf8,vers=2.0
ここでまた引っ掛かりやすいのが、マウントするディレクトリは絶対パスで指定するわけではありません。ルーターのIPアドレスの後ろにはディレクトリの共有名のみを記述します。NAS側がSMBv2に対応していなかったり、SMBv1を利用したい場合はvers=1.0に変更してください。
これでラズパイから/mnt/nasにアクセスするとNASのデータが表示されるはずです。
NFSv3でマウントする
純正ファームウェアでは利用できない上に、使い方を把握しきれていませんが一応NFSについても記しておきます。
NFSではSambaのようなユーザー認証機能がありません。その代わりにアクセス制御リストというものを用いて、ディレクトリやファイルの所有者がアクセス権を定義するという方式を採っています。しかしAsuswrt-MerlinでAccess listを設定してみても今のところ上手くいっていません。。
またNFSの最新バージョンはv4.x系で、Asuswrt-Merlinでもv4.xまでサポートされています。しかしこちらもOptionsの設定が上手くいかず、現状NFSv3しかマウントに成功していないので悪しからず。。
Access listとOptionsを除くと設定可能な内容は非常に限られています。legacy supportを有効化するとNFSv2が利用可能になりますが、こちらもラズパイをクライアントにするだけなら不要です。
Exported filesystemsで共有したいディレクトリを指定しますが、NFSの場合はSambaと異なりHDDを丸ごと共有してしまうことが可能になっています。
NASの設定が完了したら、ラズパイにマウント先のディレクトリを作成して権限を与えるところは一緒です。
$ sudo mkdir /mnt/nas $ sudo chmod 0777 /mnt/nas
NFSを扱うために必要なnfs-commonが入っていなければインストールしましょう。
$ sudo apt install nfs-common
mountコマンドは以下のように実行します。
$ sudo mount -t nfs 192.168.1.1:/mnt/BUFFALO_HDD /mnt/nas
Sambaとは微妙に書式が異なり、ルーターのIPアドレスの頭に//は付けず、逆に後ろには:が必要です。
これでNFSv3によるマウントにも成功しました。
NASのマウントを自動化する
用途的にラズパイの起動時にNASを自動的にマウントしてくれると嬉しいよねっていうことで、マウントを自動化する方法についてもまとめておきます。
ラズパイで自動化と言えばまずsystemdを思い浮かべますが、マウントを自動化するならfstabを利用するのが簡単です。これなら1行記述するだけで済みますし、fstabに記述した内容はsystemdのmountユニットに変換されるので実質的にはsystemdを利用しているのと同じことになります。
nanoなどのエディタで以下のファイルを編集してください。
$ sudo nano /etc/fstab
Sambaの場合は以下のような1行を追加します。
//192.168.1.1/Test /mnt/nas cifs username=xxxx,password=xxxx,iocharset=utf8,vers=2.0
NFSの場合も同じ要領で追記してください。
192.168.1.1:/mnt/BUFFALO_HDD /mnt/nas nfs
変更内容を保存したら、仕上げにraspi-configで1つだけ設定を行います。これを行わないとラズパイ起動時の自動マウントに失敗します。
sudo raspi-config
- System Options > Network at Boot > Would you like boot wait until a network connection is established? > Yes
書いてある通りですが、こうすることでネットワークへの接続が確立してからブート、マウントされるようになります。
これでSambaでもNFSでも、NASを自動的にマウントすることが可能になりました。
まとめ
ASUS製の無線LANルーターで構築した簡易NASに限らず、SambaやNFSといったプロトコルに対応しているNASならラズパイから簡単にアクセスすることが可能です。
マウントの自動化についても、わざわざsystemdのユニットファイルを作らなくてもfstabに1行追記するだけで簡単に対応できます。
コメント