Raspberry Pi 3 b+にsambaをdockerで入れてファイルサーバ化する

# やりたいこと
お家にファイルサーバを構築して、iPhone・Android・Windows・Macからアクセスできるようにしたい。
Raspberry Piを持っているからsambaを入れてファイルサーバとして運用し、ポータブルHDDをUSB接続してファイル置き場にしたい。
dockerでやりたい。

# 注意書き
この投稿にはセキュリティに関する設定（ファイアウォール・ユーザ認証・パーミッション等）が不足しています。
いつかやる。


# 環境
```bash
$ uname -a
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
```

# 構築手順
Raspberry Piをファイルサーバ化していきます。
Raspberry Piにsshするまでの手順は省略します。

## dockerとdocker-composeのインストール
普段はVMで環境を作ったり消したりしていますが、Raspberry Piは実機なので環境をできるだけきれいに保ちたいため、dockerをインストールすることにします。
docker-composeは、コンテナ作成時のオプションが後から確認できることと、単純に使ってみたかったので、インストールしてみます。

```bash:dockerのインストール
$ sudo curl -fsSL https://get.docker.com/ | sh

$ docker --version
Docker version 18.09.0, build 4d60db4
```

```bash:docker-composeのインストール
$ sudo pip install docker-compose

$ docker-compose --version
docker-compose version 1.23.2, build 1110ad0
```

## 外部ディスクの追加


外付けHDD(USB接続)への給電を安定にするため、下記の設定を追記

```bash:/boot/config.txt
# 下記を末尾に追記
safe_mode_gpio=4 
max_usb_current=1
```

再起動して設定を反映

```bash
$ sudo reboot
```

再起動後、外付けHDDをUSB接続して、デバイスが認識できたことを確認

```bash
$ sudo fdisk -l
# 省略
Disk /dev/sda: 596.2 GiB, 640135028224 bytes, 1250263727 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdcca2088

Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1          64 1250258624 1250258561 596.2G  7 HPFS/NTFS/exFAT
```

無事認識されました。

```bash:デバイスの詳細
$ sudo fdisk -l /dev/sda1
Disk /dev/sda1: 596.2 GiB, 640132383232 bytes, 1250258561 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x73736572

Device      Boot      Start        End    Sectors   Size Id Type
/dev/sda1p1      1920221984 3736432267 1816210284   866G 72 unknown
/dev/sda1p2      1936028192 3889681299 1953653108 931.6G 6c unknown
/dev/sda1p3               0          0          0     0B  0 Empty
/dev/sda1p4        27722122   27722568        447 223.5K  0 Empty

Partition table entries are not in disk order.
```

ですがすでにパーティションが区切られ、ファイルシステムもRaspberry Piが認識できるものではないようです。
初期化したほうが良さそうです。


## パーティションの初期化
fdiskコマンドを使って既存のパーティションを削除します

```bash:パーティションを全て削除
$ sudo fdisk /dev/sda

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


Command (m for help): d
Partition number (1-4, default 4): 

Partition 4 has been deleted.

Command (m for help): d
Partition number (1-3, default 3): 

Partition 3 has been deleted.

Command (m for help): d
Partition number (1,2, default 2): 

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
```


```bash:確認
Command (m for help): p
Disk /dev/sda1: 596.2 GiB, 640132383232 bytes, 1250258561 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x73736572
```

パーティションが削除されました。


## パーティションの設定
将来のストレージ容量不足時の拡張性を考慮して、論理ボリュームにします。
論理ボリュームの構築は簡略に記載します。

まず、パーティションを作成します。

```パーティションの作成
$ sudo fdisk /dev/sda
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (1-4, default 1): 
First sector (2048-1250258560, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-1250258560, default 1250258560): 

Created a new partition 1 of type 'Linux' and of size 596.2 GiB.
```

次に、パーティションタイプをLVMに設定します。


```bash
Command (m for help): t
Partition type (type L to list all types): 8e
Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): p
Disk /dev/sda: 596.2 GiB, 640135028224 bytes, 1250263727 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdcca2088

Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1        2048 1250263726 1250261679 596.2G 8e Linux LVM
```

ここでこれまでの変更を保存して終了します。

```bash
Command (m for help): w
```

## 論理ボリュームの作成

lvmコマンドをインストールします。

```bash
$ apt install lvm2
```

物理ボリュームの作成

```bash
$ sudo pvcreate /dev/sda1
Physical volume "/dev/sda1" successfully created.

$ sudo pvs
  PV         VG Fmt  Attr PSize   PFree  
  /dev/sda1     lvm2 ---  596.17g 596.17g
```


ボリュームグループの作成

```bash
$ sudo vgcreate -s 32M VG01 /dev/sda1

$ sudo vgs
  VG   #PV #LV #SN Attr   VSize   VFree  
  VG01   1   0   0 wz--n- 596.16g 596.16g
```

論理ボリュームの作成

```bash
$ sudo lvcreate -l 100%FREE -n LV01 VG01

$ sudo lvs
  LV   VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LV01 VG01 -wi-a----- 596.16g 
```


## ファイルシステム
複数なOSでも書き込み・読み込みができるように今回は`exFAT`を利用します。

まず必要なパッケージをインストールします

```bash
$ sudo apt install exfat-fuse exfat-utils
```

先程作成したLVをexFATファイルシステムで整地します。

```bash
 $ sudo mkfs.exfat /dev/mapper/VG01-LV01
mkexfatfs 1.2.5
Creating... done.
Flushing... done.
File system created successfully.
```


## マウント
作成したLVをマウントします。

マウントポイントの作成

```bash
$ sudo mkdir /mnt/lv
```

fstabの修正

```bash:/etc/fstab
#省略
/dev/mapper/VG01-LV01 /mnt/lv exfat defaults 0 2 # この行を追記
```

マウント

```bash
$ sudo mount -a
FUSE exfat 1.2.5
```

ディスクの確認

```
$ df -h
ファイルシス          サイズ  使用  残り 使用% マウント位置
/dev/root                28G  3.0G   24G   12% /
devtmpfs                460M     0  460M    0% /dev
tmpfs                   464M     0  464M    0% /dev/shm
tmpfs                   464M   13M  452M    3% /run
tmpfs                   5.0M  4.0K  5.0M    1% /run/lock
tmpfs                   464M     0  464M    0% /sys/fs/cgroup
/dev/mmcblk0p6           68M   23M   46M   33% /boot
tmpfs                    93M     0   93M    0% /run/user/1000
/dev/mapper/VG01-LV01   597G   20M  597G    1% /mnt/lv # ここが追加された
```


これでファイルサーバとして運用するストレージの用意が完了しました。

## sambaの構築
dockerで構築します。

まずファイルサーバとして公開するディレクトリを作成します。

```bash:ディレクトリの作成
mkdir -p /mnt/lv/samba/share
```

docker imageは[dperson/samba](https://hub.docker.com/r/dperson/samba/)の`rpi`タグのイメージを使います。
dperson/sambaの[docker-compose.yml](https://github.com/dperson/samba/blob/master/docker-compose.yml)を参考に作成しました。

```yml:docker-compose.yml
version: '3.4'

services:
  samba:
    image: "dperson/samba:rpi"
    container_name: samba
    environment:
       TZ: 'Asia/Tokyo'
    networks:
      - default
    ports:
      - "137:137/udp"
      - "138:138/udp"
      - "139:139/tcp"
      - "445:445/tcp"
    tmpfs:
      - /tmp
    restart: unless-stopped
    stdin_open: true
    tty: true
    volumes:
      - /mnt/lv/samba/share:/mnt:z
    command: '-s "share;/mnt;yes;no;yes;all;none;*;samba on Raspberry Pi"'
 
networks:
    default:
```

コンテナを起動します

```bash:docker-compose.ymlと同じディレクトリで実行
$ docker-compose up -d
```

コンテナのステータスを確認します

```bash
$ docker-compose ps
Name               Command               State                                  Ports                                
---------------------------------------------------------------------------------------------------------------------
samba   samba.sh -s share;/mnt;yes ...   Up      0.0.0.0:137->137/udp, 0.0.0.0:138->138/udp, 0.0.0.0:139->139/tcp,   
                                                 0.0.0.0:445->445/tcp  
```

これでコンテナ上にsambaを構築することができました。


# ファイルサーバにアクセスする
構築したファイルサーバ（NAS）にアクセスしてみます。

## Windows
エクスプローラーでRaspberry PiのIPアドレスを入力してアクセスしてみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266454/094bed3b-83c3-5460-c1de-b3cb73358506.png)

共有フォルダのshare(docker-compose.ymlで定義)が見えています。
試しに新しいフォルダーを作成してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266454/f78aab07-01a1-be96-db88-fefa733c85ea.png)

問題なく作成できました。
フォルダ名変更も、フォルダ削除もできるので、Windowsで問題なくCURDな操作ができました。


## iPhone
NASに接続するアプリは [FE File Explorer: File Manager](https://itunes.apple.com/jp/app/fe-file-explorer-file-manager/id510282524?mt=8) を使用しました。

<img width="375" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/266454/68eb78c2-933a-9f5e-0599-4f2db11e7802.png">
NASにアクセスしてフォルダを参照することができました。
試したところ、フォルダやファイルの作成もできたので、ファイルシステムをexFATにした甲斐がありました。

## Android
Androidといっても、Kindle Fire HD10ですが…。NASに接続するためのアプリは [ES ファイルエクスプローラー](https://play.google.com/store/apps/details?id=com.estrongs.android.pop&hl=ja) を使いました。

![Screenshot_2018-12-23-16-56-17.png](https://qiita-image-store.s3.amazonaws.com/0/266454/54c1cb21-4a3a-0618-ab6e-020314ef8086.png)

ちゃんと接続・表示されファイルの更新や削除、ダウンロードもできました。


以上が、Raspberry Piにdockerコンテナでsambaを構築してファイルサーバ化する手順の説明になります。

# おわりに
Raspberry Piの初期セットアップ～dockerでsambaを入れてNAS化までトータルで2日くらいかかってしまいました。
端折っているセキュリティの設定をやろうとすると後何日かかるかわかりません。

モヒカン的ご指摘お待ちしております。