🍆

Raspberry Pi + NVMe SSD で構築する外出先からもアクセス可能な自作NAS

に公開

安さと小ささ、ロマンを求めて

数百 GB 分くらいのオンラインストレージが欲しいなと思って色々探していたのですが、ランニングコストが掛かるのがあまり好きじゃないので NAS を導入することにしました。
既製品の NAS もたくさんありますが、自作できたらカッコいいなと思い ChatGPT に相談したところ「ラズパイ(省電力、小型) + OpenMediaVault(初心者にも優しい無料の NAS システム)」の組み合わせを提案してくれて、ちょうど置物にしてしまっていた悲しいラズパイ 5 があったので作ってみることにしました。

導入方法は OpenMediaVault の公式が用意してくれている以下の記事があるので、これを参考にしつつ作った手順を書きます。

https://wiki.omv-extras.org/doku.php?id=omv7:raspberry_pi_install

システム構成

今回の構成を下にまとめました。全部を1から買うと 2 万円ちょっとだと思います。セットで買ったりグレードを下げたりするともう少し抑えられるかもしれません。
外部ネットワークからのアクセスにはオープンソース VPN の WireGuard を使用します。IP アドレスをドメイン化するには無料 Dynamic DNS サービスの DuckDNS を使用します。

NAS 本体

  • PC: Raspberry Pi 5 4G(公式ファン付き)
  • OS: Raspberry Pi OS Lite(64bit, 2024-11-19 リリース)
  • NAS システム: OpenMediaVault7
  • VPN サービス: WireGuard
  • Dynamic DNS サービス: DuckDNS
  • NAS 用ストレージ: HIKSEMI SSD 512GB M.2 2280 NVMe PCIe Gen3x4
  • SSD 拡張ボード: ELUTENG B0CZ9FH98C
  • M.2 ネジ: その辺の M2 ネジ(SSD にも拡張ボードにも付属してなかった。。)
  • ラズパイ用ケース: Geekworm P579
  • OS 用 microSD: SanDisk UHS-I U1 Class10 64GB
  • AC アダプター: Smraza 27W PD アダプター
  • LAN ケーブル

作業 PC

  • PC: M2 Macbook Pro
  • OS: macOS Sequoia バージョン 15.4
  • microSD カードリーダー

本当は SSD を 2 枚にして RAID1 にもしてみたいですが、しばらくはこの構成で小さく始めてみて気が向けばリッチにしていこうと思います。

microSD に OS 書き込み

以下のリンクから「Raspberry Pi Imager」をインストールします。
https://www.raspberrypi.com/software/

Raspberry Pi Imager にて、以下のようにデバイスを指定します

  • Raspberry Pi デバイス: RASPBERRY PI 5
  • OS: RASPBERRY PI OS LITE (64-BIT)
  • ストレージ: 作業 PC に接続した microSD カード

次へをクリックし、ダイアログ上の設定を編集するをクリックして以下のように「一般」と「サービス」の項目を編集します。編集したら保存を押します。

  • 一般
    • ホスト名: raspberrypi-nas
    • ユーザー名: nas
    • パスワード: 適当な文字列
  • サービス
    • SSH を有効にするをチェックを入れ、パスワード認証を使うを選択


ダイアログに戻ったらはいをクリックし、microSD のデータが削除される警告に対してもはいをクリックして書き込み開始させます。完了を待つ間にラズパイを組み立てます。

ラズパイ組み立て

以下の写真の流れで組み立てていきました。
ケースまで固定すると、ファンや SSD が動かなかったときに面倒なので SSD の接続までやれば動作テストする方が良いかもです。

まずはラズパイ本体にファンを取り付けます。

次に SSD 拡張ボードを取り付けます。底面はケース付属のスペーサーを取り付けます。


次に SSD をボードに取り付けます。

最後にケースを取り付けて microSD を挿したらできあがり
コンパクトでカッコいい感じですが、ファンの排気熱が拡張ボードに直撃するのと、microSD がケースから少しはみ出ているのがちょっと心配ですね



ラズパイにログイン & openmediavault をインストール

ラズパイの電源を入れ、1 分ほど待ってから作業 PC にて以下のコマンドを実行してラズパイに SSH ログインします。このとき、ラズパイのLANケーブルに繋がった
初ログインする際は接続するか質問されるのでyesと答え、Raspberry Pi Imager で設定したパスワードを入力したらログイン完了です。

ssh nas@raspberrypi-nas.local

ログインしたら、以下のコマンドを順番に打って OS の更新と openmediavault のプリインストールを行います。

sudo apt-get update
sudo apt-get upgrade -y
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/preinstall | sudo bash

3つ目のログの最後にPlease reboot the system now.と書かれているので、以下のコマンドでラズパイを再起動します。

sudo reboot

少し待った後、再度上の ssh コマンドでラズパイにログインしてから以下のコマンドを実行して openmediavault をインストールします。

wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

筆者の環境ではインストールコマンドの最終行は以下の文が表示されていました。

["日時"] [omvinstall] IP address may change and you could lose connection if running this script via ssh.

まずはローカルで動くところまで設定

作業 PC から Chrome などのブラウザにて以下を入力してアクセスすると、下の画像のような Web ページが開かれます。

http://raspberrypi-nas.local

初期のユーザー名とパスワードは以下になっているので、それぞれ入力してログインします。

  • ユーザー名: admin
  • パスワード: openmediavault

どうやら OpenMediaVault は この Web ページを介して NAS の設定だけでなく CPU やメモリのモニタリング機能としても使えるようです。ページ自体もレスポンシブ対応されていてとても良くできているなと感動しました。

パスワード変更

画面右上のユーザーアイコンからログイン時のパスワードを変更しておきます。

NAS 用 SSD のデータ削除

サイドバーから「Storage > Disks」に移動し、NAS のために用意した SSD をクリックしてテーブル上部の消しゴムマーク「Wipe」をクリックしてデータを削除します。


Yes を選択

今回は Quick を選択

Close を選択して終了

ストレージをフォーマット & マウント

サイドバーから「Storage > FileSystems」に移動し、テーブル上部の+ボタンをクリックしてEXT4を選択

Devices の項目で先ほどデータ削除した SSD を選択し、Save をクリック

Close をクリックしてダイアログを閉じる

FileSystem の項目でまた先ほどデータ削除した SSD を選択し、Save をクリックし、黄色のバナー右上の Apply をクリックして完了

共有用フォルダ作成

サイドバーから「Storage > Shared Folders」に移動し、以下の画像の流れで共有用のフォルダを作成します。
テーブル上部の+をクリック

各項目を以下のように設定して Save をクリックし、黄色のバナー右上の Apply をクリックして完了

  • Name: 適当なフォルダ名
  • FileSystem に先ほどマウントした SSD
  • Permissions: Administrator: read/write, Users: read-only, Others: no access

共有設定

サイドバーから「SMB/CIFD > Settings」に移動し、Enabled にチェックを入れて下の Save をクリックし、黄色のバナー右上の Apply をクリックして有効化完了です。

続いてサイドバーの「SMB/CIFD > Shares」から、以下の項目を設定し、下の Save をクリックし、黄色のバナー右上の Apply をクリックして完了

  • Shared folder: 共有したフォルダを選択
  • Inherit permissions: ☑️
  • Store DOS attributes: ☑️

アクセス用ユーザー作成

サイドバーから「Users > Uers」に移動し、テーブル上部の+ボタンをクリックしてCreateを選択

ユーザー名とパスワードを設定し、下の Save をクリックし、黄色のバナー右上の Apply をクリックして完了

PC から共有フォルダにアクセス (Mac 版)

作業 PC のフォルダ閲覧アプリにて「ネットワーク」から「raspberrypi-nas - SMB/CIFS」を選択し、先ほど設定したユーザー名とパスワードを入力すると、共有フォルダが出てきました!
これで同じローカルネットワーク上の端末からは共有フォルダに好きなようにファイルやフォルダを読み書きできるようになりました。
Windows やスマホのでも同じようにアクセス可能でした。

外出先からもアクセスできるようにする

WiFi ルーターによっては VPN サーバーの機能を搭載しているものもあるので、正直そっちを使う方が簡単で確実そうですが、せっかくなので OpenMediaVualt の機能を使って構築する方法を試します。
ただ、どのみちルータ側の設定変更は必要ですし、VPN とはいえ外部用にポート解放をする訳なのであくまで自己責任の領域ですね。

やり方としては以下の OpenMediaVault 公式の手順を参考に進めていきます。

https://wiki.omv-extras.org/doku.php?id=omv7:omv7_plugins:wireguard

OMV-Extras を install

作業 PC から以下のコマンドでラズパイにログインします。

ssh nas@raspberrypi-nas.local

拡張プラグインを使用できるように、以下のコマンドを実行します。

wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | sudo bash

実行完了したら OpenMediaVault の管理ページをリロード、またはログインしなおします。
次にサイドバーの「System > Plugins」からopenmediavault-wireguard 7.0.7を検索して選択し、インストールします。

VPN トンネル設定

サイドバーから「Services > WireGuard > Tunnels」に移動し、各項目を以下のように設定して Save をクリックして保存し、黄色のバナー右上の Apply をクリックして完了です。Global IP の変化に対する設定は最後に行います。

  • Enable: ☑️
  • Name: 適当な名前
  • Network adapter: eth0
  • Endpoint: https://www.whatismyip.com/ にアクセスして表示される「My Public IPv4」の値

VPN クライアント設定

サイドバーから「Services > WireGuard > Clients」に移動します。
各項目を以下のように設定して Save をクリックし接続したい端末の数だけ登録し、黄色のバナー右上の Apply をクリックして適用します。
ルーターの IP アドレスの確認方法は Mac の場合はターミナルにてifconfigを実行するか、「システム設定 > ネットワーク > ルーターに紐づいた WiFi or イーサネット > 詳細 > TCP/IP」から確認可能です。

  • Enable: ☑️
  • Client Number: 端末毎に1から順に付ける
  • Tunnel number: 先ほど作成したトンネル名
  • Name: 適当な端末の名前
  • DNS: 192.168.0.1 (ルーターの ローカル IP アドレス)


適用後にテーブル上の歯車マークとその左のダウンロードをクリックして、スマホ用の QR コード生成と PC 用設定ファイルのダウンロードを行います。

ルーターのポート転送設定

外部ネットワークから 自宅のラズパイへの VPN アクセスを許可するため、ルーターの設定画面からポート番号51820の転送設定を行います。
やり方はルーターの機種によって異なりますが、私が使っている「TP-Link Archer AX80」では以下のようになりました。
デバイスの IP アドレスはラズパイのローカル IP アドレス のことで、ラズパイに SSH ログインした状態でifconfigを実行することで確認できます。

ラズパイのローカル IP アドレスを固定化

先ほどのポート転送設定にてラズパイのローカル IP アドレス を使ったので、その値が変わらないように固定化を施します。
ラズパイ側で固定化するのは RaspberryPi 公式的には非推奨らしいので、今回はこの設定もルーター側で行います。

以下参考記事
https://qiita.com/mochi_2225/items/3abcc45db6378e7dbb17

クライアント端末側の WireGuard 設定 (Mac 版)

以下のリンクから WireGuard をインストールします。

https://www.wireguard.com/install/

WireGuard を起動し、先ほどダウンロードした設定ファイルをインポートします。
その後、IP アドレス項目の下の有効化をクリックします。

PC から共有フォルダにアクセス (Mac 版)

いよいよ外部ネットワークからアクセスしてみます。
まず PC のネット接続をスマホのテザリング等に切り替えます。また、スマホ側の WiFi 接続も切っておきます。
Finder を開き、モニター上部から「移動 > サーバーへ接続」をクリックします。

ダイアログ上のサーバーアドレス欄に以下を入力し、接続をクリックします。
ローカルの際はホスト名が使えましたが、今回は IP アドレスで指定する必要があるようです。

ローカルのとき同様ユーザー名とパスワードを入力して接続すると、見事共有フォルダが表示されました!🎉
試しに VPN を無効化してみるとアクセスできなくなったので、ちゃんと VPN 経由でアクセスできてそうです。
毎回 IP アドレスを打つのは面倒なので、モニター上部から「ファイル > サイドバーに追加」をクリックして常駐させておきます。
今回の設定では VPN 接続時はすべてのネット接続を VPN 経由で行うようになっています。

Dynamic DNS 設定

ルーターの Global IP アドレスはプロバイダの都合で変わってしまうので、変更に対応できるようドメインを使って通信するようにします。
無料の DDNS サービスはたくさんありますが、今回は参考手順に倣って業者御用達の Duck DNS を使います。

まず PC のネット接続をルータに紐づいたものに戻してから以下のサイトにアクセスし、Google 等のアカウントでログインします。

https://www.duckdns.org/

好きな名前で以下のようにドメインを追加します。

次に OpenMediaVault の管理ページから「System > Scheduled Tasks」に移動し、+ボタンをクリックして作成画面を開きます。

先ほど作成したドメイン名とユーザーのトークンを使って以下の項目を設定し、下の Save をクリックし、黄色のバナー右上の Apply をクリックします。

  • Enabled: ☑️
  • Time of execution: Certain date
  • Minute: 5
  • Every N minute: ☑️
  • Hour: *
  • Command: echo url="https://www.duckdns.org/update?domains=作成したドメイン名.duckdns.org&token=ユーザーのトークン&ip=" | curl -k -o /var/log/duck.log -K -

これで5分毎に IP アドレスの変更を確認してドメインとの紐付けを更新されるようになりました。
参考手順ではここでタスクに対してRunをして IP アドレスが変わっていることを確認していますが、私の環境では再現しなかったので以下の手順で IP アドレスの変更に追従していることを確認しました。

  1. https://www.whatismyip.com/ の「My Public IPv4」と DuckDNS のサイトにある「current ip」が一致するのを確認
  2. ルーターの設定ページにてインターネット接続タイプを変更
  3. https://www.whatismyip.com/ の「My Public IPv4」が変更されて DuckDNS のサイトにある「current ip」が変わっていないことを確認
  4. 5分程度待機
  5. DuckDNS のサイトにある「current ip」も変更されたことを確認

次に OpenMediaVault 管理ページの「Services > WireGuard > Tunnels」にて VPN トンネル設定の Endpoint を以下のように IP アドレスからドメイン名に変更して適用します。

続いて「Services > WireGuard > Clients」にて QR コードを再生成もしくはダウンロードボタンで設定ファイルを取得し、PC 側の WireGuard で既存の設定を削除してから新しい設定を読み込みます。

最後に PC 側でルーターに紐づかないネットワークに接続した状態で VPN を有効化すると、問題なく共有フォルダにアクセスできました!ヽ(=´▽`=)ノ

転送速度・消費電力

Mac PC にて AmorphousDiskMark を使ってローカル接続状態の共有フォルダに対してベンチマーク測定してみました。
結果としてはやはりネットワーク速度の 1Gbps で頭打ちになっているようです。さすがに NAS のためだけに NVMe SSD を使うのはもったいないですね。。

続いて Switchbot のスマートプラグを使ってアイドル時とベンチマーク実行時の AC アダプターの消費電力を見ました。
こちらは簡易的な機能なので細かくは見れませんが、下の画像のようにアイドル時は 3.6W でベンチマーク実行時は 4~5W 程度といった感じでした(消費総量値は気にしないでください)。
おそらく1ヶ月動きっぱなしでも電気代は 100 円にも届かなそうです。

アイドル時

ベンチマーク実行時

感想

One Drive などと比べると外出先で VPN の入り切りのひと手間が増えるのと、ファイルを NAS に置いた状態で編集するのには向いてなさそうですが、一人で写真や動画ファイルを貯めておく分には今のところ満足しています。

ひとまず構築できたので、あとは安定して動いてくれることを祈ります 🙏

GitHubで編集を提案

Discussion