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が認識されていることを確認します。
私の環境では、/dev/sda1
として認識されていました。
今回は、このパーティションを再構築した後、ext4形式でフォーマットします。
そして、パーティションの再構築のため、以下のコマンドを実行します。
ここで、/dev/sdx
はご自身の環境に合わせて指定してください。
私の場合は、/dev/sda
となります。
sudo fdisk /dev/sdx
コマンドを実行すると以下の画面が表示されます。
表示されない場合、接続時にマウントされている可能性があるため、以下のコマンドでマウントを解除してください。
sudo umount /dev/sda1
この後は、対話形式でパーティションの削除と追加を行っていきます。
具体的な手順は以下のようになります。
- 「d」を入力後、Enterキーを押下(既存パーティションの削除)
- 「n」を入力後、Enterキーを押下(パーティション作成に遷移)
- 何も入力せずに、Enterキーを押下(primary partitionを選択)
- 何も入力せずに、Enterキーを押下(パーティション番号を指定)
- 何も入力せずに、Enterキーを押下(パーティションの最初のセクタ位置を指定)
- 何も入力せずに、Enterキーを押下(パーティションの最後のセクタ位置を指定)
- 「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 |
/path | NASで共有するディレクトリ(空白は使用しないこと) | /mnt/storage_space |
browse | ネットワークドライブとして表示するか否か[yes|no] | yes |
readonly | 読み取り専用として扱うか否か[yes|no] | no |
guest | 匿名ユーザとしてアクセス可能か否か[yes|no] | yes |
users | アクセス可能なユーザ一覧[all|list of users] | all |
admins | adminユーザ一覧[none|list of admins] | none |
writelist | 読み取り専用時に書き込み可能なユーザ一覧[*|list of writable users] | * |
comment | 共有時の詳細 | NAS on Raspberry Pi |
NASサーバの起動
docker-compose.yml
があるディレクトリで、以下のコマンドを実行します。
docker-compose up -d
「Starting nas ... done」と表示されればサーバが起動しています。
クライアント側からアクセス
Windowsなどのクライアント側からNASサーバにアクセスしてみます。
エクスプローラーを起動し、アドレスバーの部分に\raspberrypi.local\storage
と入力して、Enterキーを押下します。正常に起動していれば、以下のようにアクセスできると思います。
実際にファイルを格納し、Raspberry Pi側で内容を確認してみます。ここでは、「Hello World」と記入したsample.txt
をクライアント側で作成しNASサーバ上に保存します。
上記のファイルをRaspberry Pi側で確認してみます。
改行コードの問題はありますが、正常にファイルが作成され、内容も確認できました。
まとめ
今回は、Raspberry Piを用いてNASサーバを構築しました。最近は、大容量の補助記憶装置が安価に手に入るようになったので、LAN内に配置し、PC、タブレット、スマホでデータを共有したりバックアップする目的で、NASサーバを立ててみてはどうでしょうか。