前書き

家庭内にLinux/Mac/Windows環境が存在する場合、各PCから写真などを閲覧する事が手間な場合があります。クラウドが一つの解決策ですが、写真はサイズが大きいため、クラウドを無料使用できる範囲を超えます(あと、クラウドは同期が遅い)。そこで、各PCでファイルを共有するため、Rapsberry Pi3をsambaファイルサーバ化します。sambaはUNIX系OS上でWindows互換のファイルサーバ・プリントサーバを立ち上げるOSSです。

本記事では、Raspberry Pi3上にファイルサーバを立ち上げるまでの手順4点を示します。ただし、Raspberry Pi3にRaspbian(OS)をインストール済み、かつネットワーク接続設定済みの状態と仮定しています。

手順

  • sambaパッケージのインストール
  • Raspberry Pi3を固定IP化
  • 外部ストレージの自動マウント設定
  • sambaの設定・立ち上げ

環境

項目機器/Version用途・備考
ボードRaspberry Pi3 Model Bsamba(Version 4.5.16-Debian)が動作する環境
OS用ストレージMicroSDカード(Silicon Power、16GB、Class10)Class4以上かつ16GB以上の容量が必要。Raspbianが導入されている前提。
ファイルサーバ用ストレージTranscend 外付けSSD 128GB USB3.0 MLC TS128GESD400K用途に合わせて、サイズ・種類(HDD or SSD)を決め、変更して良い。
モニタASUS VZ249HRaspberry Pi3用。SSHでRaspberry Pi3に接続する場合、およびファイルサーバ化の手順が終了した場合、不要。
電源(ターゲット)microUSB - USBケーブル、iPad mini2用のUSB充電器特になし
映像/音声HDMIケーブル(PS4付属品)ファイルサーバ化の手順が終了した場合、不要。
入出力装置キーボード、マウス(USB接続)ファイルサーバ化の手順が終了した場合、不要。
$ neofetch
  .',;:cc;,'.    .,;::c:,,.    nao@nao 
 ,ooolcloooo:  'oooooccloo:    ------- 
 .looooc;;:ol  :oc;;:ooooo'    OS: Raspbian GNU/Linux 9.8 (stretch) armv7l 
   ;oooooo:      ,ooooooc.     Model: Raspberry Pi 3 Model B Rev 1.2 
     .,:;'.       .;:;'.       Kernel: 4.14.98-v7+ 
     .... ..'''''. ....        Uptime: 1 hour, 6 minutes 
   .''.   ..'''''.  ..''.      Packages: 1580 
   ..  .....    .....  ..      Shell: bash 4.4.12 
  .  .'''''''  .''''''.  .     CPU: ARMv7 rev 4 (v7l) (4) @ 1.2GHz 
.'' .''''''''  .'''''''. ''.   Memory: 72MB / 926MB 
'''  '''''''    .''''''  '''    
.'    ........... ...    .'.   ████████████████████████ 
  ....    ''''''''.   .''.      
  '''''.  ''''''''. .''''' 
   '''''.  .'''''. .'''''. 
    ..''.     .    .''.. 
          .''''''' 
           ...... 

sambaパッケージのインストール

exfat-fuse、cifs-utilsは、Windows側のファイルシステムをmountする場合に備えて、インストールします。autofsは、外部ストレージを自動でmount/unmoutするために導入します。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install samba exfat-fuse cifs-utils autofs

$ samba -V (注釈):今回使用するsambaのVersion
Version 4.5.16-Debian

Raspberry Pi3を固定IP化

各PCはRaspberry PiのIPアドレスに対してアクセスする事もあるため、固定IP化します。IPの固定化方法は、以下の記事を参照してください。固定後のIPアドレスは、“192.168.10.108"と仮定します。

外部ストレージの自動マウント設定

今回の例では、各PCはネットワーク経由で、外部ストレージ(SSD)にアクセスします。そのため、外部ストレージをmountし、適切なファイルシステムに変更する必要があります。今回は、OS起動時にmountを手動で行う手間を省くため、外部ストレージのUUID(一意な識別子)を用いて自動mountします。自動mountする場合は、外部ストレージ接続順で変動するPATH(例:/dev/sdb)より、UUID(固定値)を用いた方が好ましいです。

まず、外部ストレージをRaspberry Pi3にUSB接続します。dmesgで判別できない場合は、“sudo fdisk -l"でもストレージ情報が確認できます。

$ sudo dmesg | tail  (注釈):外部ストレージをUSB接続後、dmesgで直近のブロックデバイスを確認(今回は、sdb)
[ 2049.947935] usb-storage 1-1.2:1.0: USB Mass Storage device detected
[ 2049.950957] scsi host1: usb-storage 1-1.2:1.0
[ 2050.966300] scsi 1:0:0:0: Direct-Access     StoreJet TS128GESD400K    0    PQ: 0 ANSI: 6
[ 2050.967154] sd 1:0:0:0: Attached scsi generic sg0 type 0
[ 2050.971090] sd 1:0:0:0: [sdb] 250069680 512-byte logical blocks: (128 GB/119 GiB)
[ 2050.971524] sd 1:0:0:0: [sdb] Write Protect is off
[ 2050.971536] sd 1:0:0:0: [sdb] Mode Sense: 43 00 00 00
[ 2050.971960] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 2050.976316]  sdb: sdb1
[ 2050.978609] sd 1:0:0:0: [sdb] Attached SCSI disk

次に、外部ストレージ(/dev/sdb)のファイルシステムを消去し、exfat形式にフォーマットします。

$ sudo wipefs -a /dev/sdb    (注釈):ファイルシステムからパーティション情報を消去

$ sudo fdisk /dev/sdb (注釈):パーティションの作成
 
(注釈):次の順で実行
 n:パーティションの作成
    ⇒ 以降の選択肢は全て[Enter]
 p:パーティションの表示
   ⇒ /dev/sdb1にType=Linux のパーティションが表示されればOK
 w:書き込み(設定を反映)
 q:終了

$ sudo mkfs.exfat /dev/sdb1   (注釈):exfatファイルシステムを作成

最後に、自動mount設定をautofsによって実現します。自動mountは/etc/fstabを用いても実現できます。しかし、autofsの方がアクセス要求があった場合のみmountを行うため、システム負荷が低いです。また、fstabの場合、設定を失敗した場合(外部ストレージをmount出来なかった場合)、Raspberry Pi3が起動失敗し、Emergency Modeに移行します。その後の復旧作業が面倒なため、autofsを用います。

外部ストレージ(/dev/sdb)のUUIDを調べた後、"/etc/auto.master “および”/etc/auto.misc “に以下を追記します。

$ sudo blkid /dev/sdb1  (注釈):UUIDの確認
/dev/sdb1: LABEL="NFS" UUID="5B2B-6E3C" TYPE="exfat" PARTUUID="6b70f462-01"

$ sudo vi /etc/auto.master

[以下、/etc/auto.master内]
# 以下を追記。
# マウントポイント マウント対処を記載したファイル名  オプション
/mnt    /etc/auto.misc
$ sudo vi /etc/auto.misc

[以下、/etc/auto.misc内]
# 追記項目
# マウントポイント オプション マウント対象
ssd             -fstype=exfat-fuse,rw,umask=000 :/dev/disk/by-uuid/5B2B-6E3C

sambaの設定・立ち上げ

smb.confを編集し、ネットワークに公開するディレクトリの設定を行います。Raspberry Pi上にnaoユーザが存在すると仮定し、以下の設定ファイルを記載しています。

$ sudo vi /etc/samba/smb.conf

[以下、/etc/samba/smb.conf内]
# 追記項目は以下の通り。

# 外部PCから見えるディレクトリ名
[pi] 
  # 自由記入
  comment = Raspberry pi 

  # 外部公開するディレクトリ
  path = /mnt/ssd                 
  # guest okの別名。接続時、パスワードが要求されない。
  public = yes

   # 読み込みのみかどうか
  read only = no

  # ネットワークに表示するかどうか
  browsable = yes

  # Raspberry Pi3上のユーザ名(ファイル操作は、このユーザの権限で実施)
  force user = nao               

上記の設定後、testparmコマンドでsmb.confの構文エラーチェックを行います。問題がなければsamba(および関連デーモン)を自動起動するように設定し、Raspberry Pi3を再起動します。

# smb.confの構文チェックを行う。
$ testparm
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Processing section "[samba]"
Loaded services file OK.     (注釈) この表示が出ればOK。

(注釈) 省略

# sambaに関わるデーモンを有効化
$ sudo systemctl enable smbd
$ sudo systemctl enable nmbd

# 再起動
$ sudo reboot

sambaアクセス権を設定する場合

sambaアクセス時にユーザパスワード認証を行いたい場合は、以下のように設定します。

$ sudo vi /etc/samba/smb.conf

[以下、/etc/samba/smb.conf内]
# 以下のように設定されているかどうかを確認する。
[global]
    # sambaアクセス時にユーザ名とパスワードの入力を求める設定
    security = user
    # その他の設定項目は省略
        

# 外部PCから見えるディレクトリ名
[pi] 
    # アクセス許可するユーザ名
    valid users = nao
    # その他の設定項目は省略

次に、pdbeditコマンドを使って、Sambaユーザを登録します。登録するSambaユーザ名は、Raspberry Pi(Linux)のシステム上に存在し、かつsambaアクセスを許可したいユーザ名(smb.confのvalid usersに記載したユーザ名)にする必要があります。

今回の例では、naoユーザを新規作成します。

$ sudo pdbedit -a nao

以上が終了した後、Raspberry Piを再起動すれば設定が反映されます。