Raspberry piをNAS兼音楽プレイヤーにする(NAS編)

OpenVPN サーバのインストールに続いて、Raspberry Pi サーバ化の第2弾です。外付け HDD を使って、NAS機能をもたせ、その中の音楽ファイルを再生するプレイヤーに仕立てます。

Raspberry Pi2 を使った場合、100Base の時点で NAS の性能としては期待できません(最大でも10MB/s程度)。もっとアクセス速度が欲しい場合は Raspberry Pi4 が良いでしょう。USB3.0、GbE 対応と NAS に必要となるバス速度が桁違いに早くなっています。

ただ、音楽データを置いたり、写真データ、バックアップデータなど容量がかさばるけど、頻繁にアクセスしないデータ置き場であれば Pi2 でも十分です。

構想

NASとしてのプロトコルは Windows からアクセスすることを考慮して SMB サーバを立てることにします。samba による SMB サーバ構築は Linux では昔から実施されている枯れた技術ですね。

音楽プレイヤーとしては今回は Music Player Daemon(mpd) を使います。サーバ/クライアント構成の音楽プレイヤーで、Raspberry Pi にサーバを立ち上げ、スマホやPCのクライアントから音楽を再生できるようにします。

音質にこだわった方は Rapsberry Pi に I2S 接続のDACを繋げたり、USB DAC を接続したりして高音質なプレイヤーを作り上げていたりしますが、今回はRaspberry Piのアナログオーディオ出力をそのまま使います。今回の私の目的はリビングに据え置きの安物スピーカーでFMラジオ的に音楽を鳴らすことなので、そもそもあまり音にこだわる意味がない環境です。

図にすると以下のような感じです。

外付けHDDに音楽データをいれておき、スマホから操作して音楽を再生します。音楽データには SMB でアクセスできるようにもします。

NASに関しては以下のようにします。

  • NASプロトコル
    • SMBv2 (Windows10ではv1はアクセスできない)
  • ユーザ認証
    • なし
  • HDDのファイルシステム
    • ext4

sambaあるあるなのですが、デフォルト設定では Windows10 からはアクセスできないことが多いです。Windows10から SMBv1 は使えなくなった(レジストリをいじれば可能)ためです。Windows10 でもアクセスできるように SMBv2 で動作させます。

ユーザ認証については、自宅ネットワークに置くのでアクセス制御不要だろうということと、家族がだれでも簡単にアクセスできるようにと認証無しでアクセスできる設定とします。

HDDのファイルシステムに関しては、家に Mac は無いので、NTFS, exFAT, ext4 あたりが候補だったのですが、Linuxで最も安定しているであろう ext4 にしました。私は普段から PC も Linux で使っているので、仮に HDD を PC に繋いで直接ファイルを読み書きする必要が生じても、特に ext4 で困ることはないためです。Linux環境がない人は NTFS が良いと思います。

必要なもの

  • USB接続の外付けHDD
  • アンプ付きスピーカー

今回必要なものは USB 接続の HDD のみです。Raspberry Pi3/4を使う場合は USB3.0 が良いかもしれませんが、私は USB2.0 にしか対応していない Pi2 を使っているので家に余っていたUSB2.0の外付けHDDを使いました。

ポータブルHDDのようなバスパワーだと電力に不安があるので普通の外部電源付きのUSB-HDDが良いと思います。

HDD は 2TB で 当時 1 万くらいで購入したものです。今は 1万円出せば 4TB が買えてしまうんですね。

created by Rinker
エレコム
¥6,957 (2020/10/27 13:06:15時点 Amazon調べ-詳細)

NASのセットアップ

HDDのフォーマット

まずは USB HDD を Raspberry pi に接続してフォーマットを行います。USB HDD を Rapsberry Piに接続すると、/dev/sda, sdb… といったデバイス名で認識されます。Rapsberry Pi の USB ポートに HDD 以外を接続せずに起動した場合は、/dev/sda として認識されているはずです。

接続されている HDD などのブロックデバイスは lsblk コマンドで表示できます。

$ sudo lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  1.8T  0 disk 
└─sda1        8:1    0  1.8T  0 part
mmcblk0     179:0    0 28.3G  0 disk 
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0 20.6G  0 part /
$

上記例の場合は、/dev/sda が外付けHDDです。フォーマットなどを行うため、デバイスファイル名は必ず確認してください。自信がない場合は、上記のようにHDD以外の USB機器を Raspberry Pi から外した状態で作業すると良いでしょう。

デバイスが特定できたら fdisk コマンドでパーテーションを切り直します。fdisk は対話型のコマンドですので、以下の赤字のところを入力します。[Enter]はエンターキーの押下を表しています。青字は簡単な説明です。

$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): o[Enter]    パーテーションテーブルのクリア(再生成)
Created a new DOS disklabel with disk identifier 0x0374c97a.

Command (m for help): n[Enter]    新規パーテーションの作成
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p[Enter]      基本パーテーションを作成
Partition number (1-4, default 1): [Enter]    パーテーション番号1(デフォルトのまま)
First sector (2048-3907029167, default 2048): [Enter]    開始セクタ指定(デフォルトは先頭から)
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-3907029167, default 3907029167): [Enter]  終了セクタ指定(デフォルトはディスクの末尾)

Created a new partition 1 of type 'Linux' and of size 1.8 TiB.
Command (m for help): w[Enter]     パーテーションテーブルを書き込んで終了

これで HDD 全体を使うパーテーションが 1 つ作られたことになります。パーテーションは /dev/sda1 として認識されます。

続いて、作成したパーテーションを ext4 形式でフォーマットします。

フォーマットするには mkfs.ext4 コマンドを使います。今回は “NASHDD” というラベル(ボリュームラベルのようなもの)を付けてフォーマットします。後ほどマウント設定でこのラベルを使います。ラベルは -L オプションで指定します。

$ sudo mkfs.ext4 -L NASHDD /dev/sda1

以上でフォーマットは完了です。

正しくフォーマットできたか試しにマウントしてみます。今回は /mnt/hdd をマウントポイントとして使おうと思います。

$ sudo mkdir /mnt/hdd
$ sudo mount /dev/sda1 /mnt/hdd
$ ls -l /mnt/hdd/
total 20
drwx------ 2 root root 16384 Sep 26 21:50 lost+found

無事にマウントできれば、ls コマンドで lost+found ディレクトリが見えると思います。

おまけ: NTFSの場合

NTFS でフォーマットされている HDD を使う場合は、追加で ntfs-3g パッケージが必要です。(ext4の場合は不要です)

$ sudo apt install ntfs-3g

mount のテストは上と同様に以下のコマンドでOKです。

$ sudo mount /dev/sda1 /mnt/hdd

また、後ほど使用するパーテーションのラベルは以下のコマンドで確認できます。以下の例では WD-HDD がラベルです。

$ lsblk -f
NAME FSTYPE LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                   
└─sda1
     ntfs   WD-HDD
                  6E36990F3698DA03                      502.2G    73% /mnt/hdd
mmcblk0
│                                                                     
├─mmcblk0p1
│    vfat   boot  592B-C92C                             201.1M    20% /boot
└─mmcblk0p2
     ext4   rootfs
                  706944a6-7d0f-4a45-9f8c-7fb07375e9f7    5.1G    22% /

HDDの自動マウント設定

上記では手動で mount コマンドを実行して USB HDD をマウントしていましたが、これを Raspberry Pi 起動時に自動的にマウントするようにします。

/etc/fstab という設定ファイルを変更します。以下のように赤の行を追加してください。

$ sudo vi /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=9ffe5c8c-01 /boot vfat defaults 0 2
PARTUUID=9ffe5c8c-02 / ext4 defaults,noatime 0 1
LABEL=NASHDD /mnt/hdd ext4 defaults,nofail 0 2
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that

mkfs.ext4 で指定したラベル名を LABEL= で指定します。LABEL 指定にしておけば HDD が /dev/sda ではなく /dev/sdc として認識されても正しくマウントしてくれます。

※NTFS の場合は ext4 のところを ntfs に変更します。

また、オプションの nofail は付けておくことをおすすめします。nofail がない場合は、HDDが接続されていなかったり認識できなかった時に Linux の起動がそこで停止してしまいます。起動が止まってしまうと SSH でのログインもできなくなってしまうため復旧が面倒です。

fstab ファイルの変更が終わったら再起動してみてください。再起動後に mount コマンドを実行し、/mnt/hdd にマウントされていれば成功です。

$ mount | grep hdd
/dev/sda1 on /mnt/hdd type ext4 (rw,relatime)

SMBサーバの構築

マウントした /mnt/hdd をWindows から共有フォルダとしてアクセスできるようにします。今回は /mnt/hdd 全体を共有フォルダとして見せるのではなく、/mnt/hdd/share というディレクトリを作成してその下だけを公開するようにします。

理由は、将来、ストレージに頻繁にアクセスするような(microSD の寿命を削るような)サービスを構築する際に、そのデータを HDD に置くかもしれないためです。

まずは共有フォルダとして公開する /mnt/hdd/share を作成して、誰でも読み書き可能にします。

$ sudo mkdir /mnt/hdd/share
$ sudo chmod 777 /mnt/hdd/share

samba パッケージをインストールします。

$ sudo apt install samba

samba サーバの設定を変更するため、/etc/samba/smb.conf ファイルを変更します。

$ sudo vi /etc/samba/smb.conf

以下のように変更します。diff 形式で差分のみを記載します。

--- /etc/samba/smb.conf.orig 2019-09-05 03:28:48.000000000 +0900
+++ /etc/samba/smb.conf 2020-09-26 22:48:04.522479768 +0900
@@ -164,30 +164,37 @@
# public shares, not just authenticated ones
usershare allow guests = yes

+ # 認証なしの場合は guest アカウント(nobodyユーザ) の扱いにする
+ security = user
+ map to guest = Bad User
+ guest account = nobody
+ # Windows10 でアクセス可能にするための設定
+ min protocol = SMB2
+
#======================= Share Definitions =======================

-[homes]
- comment = Home Directories
- browseable = no
+;[homes]
+; comment = Home Directories
+; browseable = no

# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
- read only = yes
+; read only = yes

# File creation mask is set to 0700 for security reasons. If you want to
# create files with group=rw permissions, set next parameter to 0775.
- create mask = 0700
+; create mask = 0700

# Directory creation mask is set to 0700 for security reasons. If you want to
# create dirs. with group=rw permissions, set next parameter to 0775.
- directory mask = 0700
+; directory mask = 0700

# By default, \\server\username shares can be connected to by anyone
# with access to the samba server.
# The following parameter makes sure that only "username" can connect
# to \\server\username
# This might need tweaking when using external authentication schemes
- valid users = %S
+; valid users = %S

# Un-comment the following and create the netlogon directory for Domain Logons
# (you need to configure Samba to act as a domain controller too.)
@@ -210,23 +217,23 @@
; create mask = 0600
; directory mask = 0700

-[printers]
- comment = All Printers
- browseable = no
- path = /var/spool/samba
- printable = yes
- guest ok = no
- read only = yes
- create mask = 0700
+;[printers]
+; comment = All Printers
+; browseable = no
+; path = /var/spool/samba
+; printable = yes
+; guest ok = no
+; read only = yes
+; create mask = 0700

# Windows clients look for this share name as a source of downloadable
# printer drivers
-[print$]
- comment = Printer Drivers
- path = /var/lib/samba/printers
- browseable = yes
- read only = yes
- guest ok = no
+;[print$]
+; comment = Printer Drivers
+; path = /var/lib/samba/printers
+; browseable = yes
+; read only = yes
+; guest ok = no
# Uncomment to allow remote administration of Windows print drivers.
# You may need to replace 'lpadmin' with the name of the group your
# admin users are members of.
@@ -234,3 +241,11 @@
# to the drivers directory for these users to have write rights in it
; write list = root, @lpadmin

+ # /mnt/hdd/share 以下を share という共有フォルダ名で公開
+[share]
+ path = /mnt/hdd/share
+ browseable = yes
+ # 書き込みを許可する
+ writable = yes
+ # ゲストユーザ(認証なし)を許可する
+ guest ok = yes
+ # ファイルを作成する時のパーミッションは 0666 で作成
+ create mask = 0666
+ # ディレクトリを作成する時のパーミッションは 0777 で作成
+ directory mask = 0777

差分は多いですが、やっていることは以下の3つだけです。

  • [global]セクションの最後に認証なしとWindows10対応設定を追加
  • [global]セクション以外の共有設定を全てコメントアウト
  • 最後に[share]の共有設定を追加

変更が終わったら samba サーバを再起動します。

$ sudo systemctl restart smbd.service

再起動が終わったら Windows PC の Explorer のアドレス欄に “\\IPアドレス\” と入力してみてください。shareフォルダが表示されれば成功です。試しにファイルを作成して書き込み可能であることも確認してください。

以上で NAS 機能の構築が完了です。

長くなってしまったので、音楽サーバにするのは別記事にしようと思います。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です