広告 デバイス

【Samba】Raspberry PiにNASサーバを構築する方法を分かりやす解説

※本ページには、プロモーション(広告)が含まれています。

悩んでいる人

Raspberry PiとDockerでNASサーバを構築したい。

具体的なサーバ構築方法を教えて欲しい。

こんなお悩みを解決します。

今回は、Dockerを用いてNASサーバを構築します。

再掲となりますが、構成図は以下のようになります。

コンテナ構成

また、ストレージとしては外付けSSDを用います。

使用する容量はNASサーバに保存するデータ量をもとにご自身にあったサイズを選んでください。

私は、500GBの外付けSSDを選択しました。

Raspberry Pi 4には、USB 3.0ポートが付属しているため、このポートに接続して利用します。

事前準備

用意した外付けSSDをRaspberry Piで扱えるようにフォーマットします。

また、以降では、Raspberry PiにSSH接続している前提で話を進めます。

外付けSSDのパーティション更新

まずは、lsblkコマンドを用いて、接続したSSDが認識されていることを確認します。

lsblkコマンドの実行結果

私の環境では、/dev/sda1として認識されていました。

今回は、このパーティションを再構築した後、ext4形式でフォーマットします。

そして、パーティションの再構築のため、以下のコマンドを実行します。

ここで、/dev/sdxはご自身の環境に合わせて指定してください。

私の場合は、/dev/sdaとなります。

sudo fdisk /dev/sdx

コマンドを実行すると以下の画面が表示されます。

fdiskコマンド実行後の画面

表示されない場合、接続時にマウントされている可能性があるため、以下のコマンドでマウントを解除してください。

sudo umount /dev/sda1

この後は、対話形式でパーティションの削除と追加を行っていきます。

具体的な手順は以下のようになります。

  1. 「d」を入力後、Enterキーを押下(既存パーティションの削除)
  2. 「n」を入力後、Enterキーを押下(パーティション作成に遷移)
  3. 何も入力せずに、Enterキーを押下(primary partitionを選択)
  4. 何も入力せずに、Enterキーを押下(パーティション番号を指定)
  5. 何も入力せずに、Enterキーを押下(パーティションの最初のセクタ位置を指定)
  6. 何も入力せずに、Enterキーを押下(パーティションの最後のセクタ位置を指定)
  7. 「w」を入力後、Enterキーを押下(変更を保存)

上記に該当する内容を以下に反映しました。

箇条書き番号と対応づいています。

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

# 2.
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):     # 3.

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

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

# 7.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

外付けSSDのフォーマット

次に、以下のコマンドを実行し、外付けSSDをフォーマットします。

先ほど同様に、/dev/sdx1はご自身の環境に合わせて指定してください。

私の場合は、/dev/sda1となります。

sudo mkfs.ext4 /dev/sdx1

外付けSSDのマウント

次に、外付けSSDをマウントし、Raspberry Piからアクセスできるようにします。

今回は、/mnt以下にportable_ssdというディレクトリを作成し、/mnt/portable_ssdにマウントします。

先ほど同様に、/dev/sdx1はご自身の環境に合わせて指定してください。

私の場合は、/dev/sda1となります。

# /mnt/portable_ssdを作成
sudo mkdir /mnt/portable_ssd
# マウント
sudo mount /dev/sdx1 /mnt/portable_ssd

また、マウントできた後は、NASサーバのルートディレクトリとなるディレクトリを作成しておきます。

以降は、このディレクトリ以下にデータが格納されることになります。

# ルートディレクトリを作成。ここでは、storageという名前にします
pushd /mnt/portable_ssd
sudo mkdir storage
# 実行権限と所有者を変更
sudo chmod 777 storage
sudo chown nobody:users storage

自動マウントの設定

最後に、毎回マウントする手間を省くために、自動マウントの設定を行います。

マウント状況に応じてsdxの部分が変わってしまうことを防ぐために、UUIDを指定してマウントを行います。

以下のコマンドを実行し、外付けSSDのUUIDを確認します。

sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="EBBA-157F" TYPE="vfat" PARTUUID="92b23df2-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="b3ce35cd-ade9-4755-a4bb-1571e37fc1b9" TYPE="ext4" PARTUUID="92b23df2-02"
/dev/mmcblk0: PTUUID="92b23df2" PTTYPE="dos"
/dev/sda1: UUID="cf135daf-a8d3-40e5-aa03-e27dd6c6e93e" TYPE="ext4" PARTUUID="02ca67f4-01"

私の環境では、cf135daf-a8d3-40e5-aa03-e27dd6c6e93eとなっていました。

次に、/etc/fstabをエディタで開き、以下の行を追加します。

ここで、UUIDの部分は、ご自身の環境に合わせて変更してください。

proc            /proc           proc    defaults          0       0
PARTUUID=02576808-01  /boot           vfat    defaults,flush    0       2
PARTUUID=02576808-02  /               ext4    defaults,noatime  0       1
# add auto mount

UUID=cf135daf-a8d3-40e5-aa03-e27dd6c6e93e /mnt/portable_ssd ext4 defaults 0 0
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

以上で、自動マウントまで完了しました。

次回、Raspberry Piを再起動した際に自動的に外付けSSDがマウントされるようになります。

docker-compose.ymlの作成・NASサーバの起動

本題のNASサーバを構築していきます。

ここでは、Docker Hubで公開されているコチラのイメージを用いて自分の環境に合わせたコンテナを作成することで、NASとして利用できるようにします。

また、ここで作成したdocker-compose.ymlは、GitHubに公開しているので、必要に応じて参照してください。

https://github.com/yuruto-free/home-server/tree/v0.1.0_nas

Dockerの設定更新

Sambaは、137/udp、138/udp、139/tcp、445/tcpのポートを利用します。

well-knownポートであるため、rootlessのdockerでは、エラーが発生します。

基本的には代替ポートを指定するのですが、クライアント側でひと手間必要になってしまう為、ここではdocker側の設定を見直します。

具体的には、well-knownポートも解放可能にします。

Raspberry Pi上で以下のコマンドを実行します。

# well-knownポートも解放できるように設定
sudo setcap CAP_NET_BIND_SERVICE=ep $HOME/bin/rootlesskit
# Dockerサービスの再起動
systemctl --user restart docker

docker-compose.ymlの作成

ここでは、以下の条件でNASにアクセスできるようにします。

  • 匿名ユーザでアクセス可能
  • ネットワーク上にドライブとして表示
  • 「storage」という名称でクライアントからアクセス

上記を踏まえると、docker-compose.ymlは以下のようになります。

ここで、command部分がSambaに渡す具体的なパラメータになります。

version: '3.7'

services:
    nas:
        image: dperson/samba:rpi
        container_name: nas
        volumes:
            - /mnt/portable_ssd/storage:/mnt/storage_space
        environment:
            TZ: 'Asia/Tokyo'
            USERID: '65534'
        networks:
            - frontend
        ports:
            - "137:137/udp"
            - "138:138/udp"
            - "139:139/tcp"
            - "445:445/tcp"
        tmpfs:
            - /tmp
        restart: always
        stdin_open: true
        tty: true
        command: '-s "storage;/mnt/storage_space;yes;no;yes;all;none;*;NAS on Raspberry Pi"'

networks:
    frontend:
        name: frontend_network

command部分は、以下のようなフォーマットになっています。

-s "[;browse;readonly;guest;users;admins;writelist;comment]"

上記の詳細は、以下の表をご確認ください。

名称説明今回の設定値
nameセクション名
Windowsでドライブを指定する際のIPアドレス以降の名称
例:「\\raspberrypi.local\storage」の「storage」部分
storage
/pathNASで共有するディレクトリ(空白は使用しないこと)/mnt/storage_space
browseネットワークドライブとして表示するか否か[yes|no]yes
readonly読み取り専用として扱うか否か[yes|no]no
guest匿名ユーザとしてアクセス可能か否か[yes|no]yes
usersアクセス可能なユーザ一覧[all|list of users]all
adminsadminユーザ一覧[none|list of admins]none
writelist読み取り専用時に書き込み可能なユーザ一覧[*|list of writable users]*
comment共有時の詳細NAS on Raspberry Pi
commandの説明

NASサーバの起動

docker-compose.ymlがあるディレクトリで、以下のコマンドを実行します。

docker-compose up -d

「Starting nas ... done」と表示されればサーバが起動しています。

クライアント側からアクセス

Windowsなどのクライアント側からNASサーバにアクセスしてみます。

エクスプローラーを起動し、アドレスバーの部分に\raspberrypi.local\storageと入力して、Enterキーを押下します。正常に起動していれば、以下のようにアクセスできると思います。

NASサーバへのアクセス

実際にファイルを格納し、Raspberry Pi側で内容を確認してみます。ここでは、「Hello World」と記入したsample.txtをクライアント側で作成しNASサーバ上に保存します。

テキストファイルをクライアント側で作成・保存

上記のファイルをRaspberry Pi側で確認してみます。

クライアント側で作成したファイルの内容確認

改行コードの問題はありますが、正常にファイルが作成され、内容も確認できました。

まとめ

今回は、Raspberry Piを用いてNASサーバを構築しました。最近は、大容量の補助記憶装置が安価に手に入るようになったので、LAN内に配置し、PC、タブレット、スマホでデータを共有したりバックアップする目的で、NASサーバを立ててみてはどうでしょうか。

スポンサードリンク



-デバイス
-,