Raspberry Pi 4から始めるNAS生活

この記事は[ZOZO Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zozo) #5 20日目の記事になります。

##はじめに

5年前にこんな記事を書いていました。

- [Raspberry Pi ミュージックサーバのある生活](https://qiita.com/zz_takumi_ito/items/81a7ef3fdc7fdb0c1855)

[Volumio](https://volumio.com/) はあれから大きく発展してずいぶん変わりました。ありがたいことに特に特別な事をしなくても[Sony UDA-1](https://www.sony.jp/system-stereo/products/UDA-1/)をUSB DACとして認識するようになりVolumioでPCM変換しなくて良くなりました。アップデートでおかしくなってmicroSDを作り直した事は1度ありましたが、MicroSDが書き換え限界になるなどもなく快適に動いています。

USB DAC対応したことでHi-Resファイルの再生時にUDA-1のHi-Resランプが点灯するようになりDAC本来の性能が出せているのかな？

### 何故にNAS?

このクラウドの時代に何故NASを構築したのか？

Volumioで音楽を聞くときにUSBメモリースティックを刺して再生する音楽を貯めていました。前の記事で書いたSamb共有でつかっていたのに何故NASなのか？

CDDA 44.1kHzよりも密度が高いデータを手軽にネットで買える時代。高音質ファイルFLACやDSDになるとファイルサイズが大きくなります。USBメモリの容量をあっという間に食いつぶすのと、コピーに関してもストレスを感じるように。

### 手元にあったRPi4

前回がRaspberry Pi 2+でミュージックサーバを構築してその後Raspberry Pi Zero Wも買ったしRaspberry Pi 4も買ったのですがなんだかんだとバタバタして死蔵していました。

### RPi4のスペック

| Header | Spec |
| :-- | :-- |
| NIC | Gigabit Ethernet x1 |
| USB | USB 3.0 x2 + USB 2.0 x2 |
| CPU | ARMv7(32bit)->ARMv8 (64bit) |

- 高速なインターフェース
- 有り余る演算リソース
- 比較的省電力

そうだ、NASにしよう!!

## NAS (Network Attached Storage) とは

説明は不要かと思いますが、乱暴にいえば簡易的なファイルサーバ。自宅などLANの中で自由にファイルを置いておける専用システム。

### 何故RPi4でNAS?

さすがに専用OS込みの筐体を買ってきてしっかり構築するのは大げさかなと思ったのと、このRPi4はインターフェース速いし音楽データのコピーとかストレス無くなるんじゃないか？という考えでスタート。

## 部品調達

NASを構築するためにはRPi4以外にも部品が必要です。昔の自作PCの残骸から部品取りしましょう。

### PCケース

Antec Nine Hundred([参考](https://pc.watch.impress.co.jp/docs/2006/1011/antec.htm))を以前利用していました。前回の記事でも書いた録画サーバ運用していてなんだかんだと詰め込んでいたミドルタワー。ゲーミングという点より*静穏*に惹かれて買ったケースなので良く冷えて静かです。

PCケースには3.5インチHDDが3つ入り120mm FANがついたユニットが2つあります。
今回はこのユニットの1つを利用。録画サーバの時の3.5HDDで同型番・同サイズがまだ使えそう。
2.5HDDもありました。ありがたいことにSATA。

### USB変換

古い世代で自作PCをされていた方はサルベージ目的とかなんだかんだでUSB HDDとして認識させるアダプタとか知っているかと思います。

録画サーバとして構築した際もWindowsダイナミックディスクでのRAID1にしており、CドライブSSDが書き換え限界で使えなくなった時にサルベージのためにと同じアダプタ2つ買ったのが残っていました。

### Gigabit Ethernet

ネットワークにつながるガジェット好きは無線ルータにぶら下がるハード増加でも安定させる観点や速度的にWi-Fi6 無線LANルータを買っているかもしれません。私は[WSR-3200AX4S](https://www.buffalo.jp/product/detail/wsr-3200ax4s-bk.html)を利用しているので有線ポートは1000Base-T。LAN環境でRPi4のGigabit Ethernetを有効に使えそうです。

### RPi4ケース

ある意味ここが一番のお薦めかなと思います。[DeskPi](https://deskpi.com/)を買ったまま死蔵していたので利用しています。電源としてはUSB-PD対応モバイルバッテリーを買ったとき付属していたもの利用。窒化ガリウムではなく大きなACアダプタなので使わなかったものを利用。USB-PDである程度電力を取れたので助かります。PC自作経験者には「電源にはお金をかけておけ」に同意してもらえるかも？

## 構築

執筆時点Raspberry Pi OSはDebian11(bullseye)ベースになっているので普通にmicroSDへ書き込んで完了かも？

私が構築した時はまだbusterベースでしたのでARMv8の64bitを活かして構築と、常時起動しているリソースが出来るならCalibre 5.xを動作させたいと考えました。

- [calibre package versions in various repositories](https://github.com/debian-calibre/calibre#calibre-package-versions-in-various-repositories)

busterでは3.xになってしまい要件を満たしません。ソースコードからのビルドは私には荷が重かった。配布サイトにも警告があり([Source install](https://calibre-ebook.com/download_linux))おとなしくCalibre 5.xを配布していてARMv8の64bitが使えるOSという事で、Debian11(bullseye)の[Tested images](https://raspi.debian.net/tested-images/)に決めました。

### 外付けHDD起動

前後してしまうのですが、構築しようとした時にRPi4で外付けUSBストレージブートが出来るfirmwareが出たとタイムラインか話題になっていた時期でした。
早速トライして外付けHDDから起動確認。「これでMicroSDの寿命に震えなくて済むのか」と嬉しく思ったのを強く覚えています。

で、思ったのがMicroSDを抜いても普通に起動するならば対応をうたっていなくてもimageをHDDに書き込んで起動すれば動くのでは？
bullseyeのTested imagesを落としてきてddコマンドで2.5HDDに書き込んで電源を入れるとあっけなく起動しました。

### 環境構築前の構築

Tested Images はsudoも入っていないし、pingも打てないほどシンプルです。実際に使える状態まで持っていくのは骨が折れましたが、今はインターネットも検索エンジンもあるので助かります。

今のRaspberry Pi OSはbullseyeベースなのでこのあたりは割愛

### ソフトウェアRAID1

まず古いHDDをフォーマットして環境を構築していきます。

1. fdisk -l でつながっているストレージの確認
2. HDD起動してからUSBをつないだ場合 /dev/sdb と /dev/sdc になるかと思います。
3. 1つめのパーテーションの再構築

    ```console
    $sudo fdisk /dev/sdb
    > d 1 (既存パーテーションを削除)
    > n (新規パーテーションを作成)
    > p (プライマリー)
    > 1 (パーテーションは先頭)
    > <ENT> (開始セクタ デフォルト)
    > <ENT> (終了セクタ デフォルト)
    > t (パーテーションタイプ変更)
    > L (タイプ確認)
    > 29 (Linux RAID)
    > w (書き込み)
    ```

4. 2つめのバーテーションを再構築 (/dev/sdc)
5. ソフトウェアRAID(mdadm)をインストール

    ```console
    $sudo apt update
    $sudo apt install mdadm -y
    ```

6. ソフトウェアRAID構築 (引数の sdb1 sdc1は起動時の認識順番に寄るので要確認)

    ```console
    $sudo mdadm --create /dev/md0 --raid-devices=2 --level=raid1 /dev/sdb1 /dev/sdc1 
    ```

7. ソフトウェアRAID1を確認

    ```console
    $cat /proc/mdstat
    ```

8. RAID1をフォーマット

    ```console
    $sudo mkfs -t ext4 /dev/md0
    ```

9. UUID確認

    ```console
    $ls -la /dev/disk/by-uuid/ (/dev/md0のUUIDをコピー)
    ```

10. マウントポイント作成 (/mnt/nas)

    ```console
    $sudo mkdir /mnt/nas
    ```

11. fstab追加 (/mnt/nas へ /dev/md0 をマウント)

    ```console
    $sudo "UUID='<9でメモしたUUID>'     /mnt/nas        ext4    defaults        0       0" >> /etc/fstab
    ```

12. このタイミングで /boot/firmware/cmdline.txt を編集
  - USB HD起動の場合HDDの起動時の準備が出来デバイスから /dev/sda が割り振られる
  - root ファイルシステムの場所については /dev/sda2 からUUID へ変更する

        ```conf:/boot/firmware/cmdline.txt
        console=tty0 console=ttyS1,115200 root=PARTUUID=20954746-02 rw fsck.repair=yes net.ifnames=0  rootwait dtoverlay = dwc2，dr_mode = host
        ```

13. 再起動して /mnt/nas に正常にマウントされているか確認

    ```console
    $df -h
    ```

### Samba構築

ファイル共有するため環境を構築

1. Sambaをインストール

   ```console
   $sudo apt update
   $sudo apt install samba -y
   ```

2. 共有環境の設定例

    ```conf:/etc/samba/smb.conf
    [nas]
    comment = HOME NAS
    browseable = yes
    path = /mnt/nas
    guest ok = no
    read only = no
    create mask = 0775
    directory mask = 0775
    valid users = pi
    ```

3. sambユーザ作成

    ```console
    $sudo smbpasswd -a pi
    ```

4. サービス再起動

    ```console
    $sudo systemctl restart smbd
    ```

### VolumioにNASを追加

1. Volumio へブラウザアクセス
2. 設定 > Souce > 新規のドライブを追加
   - エイリアス
   - NAS IPアドレス
   - パス
   - 拡張オプション
       - ファイル共有の種類: cifs
       - ユーザー名
       - パスワード
       - オプション
3. VolumioがNASにある音楽ファイルをインデックス化するのを待つ
4. 音楽ライブラリからNASが選べるようになる

これでNASに保存した音楽データをVolumioから参照してPCからデータを入れてというのをスムーズに行うことが出来ます。

## 結論

- RPi4で構築したNASは思ってた以上に快適でした

![IMG_20211215_234501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82941/2c6e957b-1c10-4a22-1dd4-26d7faf9dec7.png)

### ほか

- DHCPで配布するIPアドレスを固定しておく
- 本体firmwareさえ更新出来れば外付けHDD起動は簡単
  - 但し電源は強いものが必要
- Tested imagesはすんなり起動
  - 但しパッケージが入っていないので初期構築が面倒
- build-essentialまで入れればソースからビルドは比較的スムーズ
  - Dropbox はソースコード配布しているけどNG
  - コアな部分がバイナリ配布でarmv8のアーキテクチャは未対応
- DockerのARM 64bit対応はM1 macのおかげでそろってる
  - Docker Compose もビルドすれば使えた
  - docker hub [arm64v8](https://hub.docker.com/u/arm64v8)は豊富
- Calibre 5.x は快適
  - kindlegen.exe にとらわれない変換環境
  - ニュース購読やPocketを電子書籍へ変換
  - [Sony PRS-350](https://www.sony.jp/reader/products/PRS-350/)まだ現役
- リソースに余裕があるのでいろいろ試せるのは良いです
  - SANE を利用してScanSnapでスキャンしてNAS保存
  - StrongSwanVPN を利用して外部からNASアクセス
  - Nginx Reverse Proxy を利用してDockerのフロント
  - Gogs でちょっとしたものを管理
  - Jenkins BlueOcian でDockerコンテナなりコマンド起動
  - Narou.rb で小説家になろう を購読と縦書EPUB3変換
  - pLaTeX で[Sony DPT-CP1](https://www.sony.jp/digital-paper/products/DPT-CP1/)用にPDF変換

### セキュリティについても意識は忘れずに

LANの中だしとセキュリティはザルにして書きましたが物騒なので自衛はしましょう

- ufw（Uncomplicated FireWall）で必要なものだけに限定を追い込む
- バックアップをするときだけ接続するHDDに定期的にバックアップ
- 設定のバックアップもお忘れなく
  - 例
    - /etc/ 配下を/mnt/nas/backup/へ毎晩cronでバックアップ
    - 不定期にUSB HDDに/mnt/nasをrsyncで簡易スナップショット

つらつらと長くなりましたらこのあたりで。