Raspberry PiでNASとバックアップサーバを構築する

raspberry-pi-nas-and-backup-server-4

概要: Raspberry Pi 2 Model B と 2 台の外付け HDD で、NAS (samba) とバックアップサーバ (rsync) を構築しました。そこそこ性能のものが、手軽でそして安価にできます。

構想

作りたいのもは次のようなシステムです。

raspberry-pi-nas-and-backup-server-image

Raspberry Pi は自宅 LAN と、2 台の HDD と接続します。 NAS サーバとしてファイル共有サーバの役割を果たしていて、自宅 LAN 内のユーザはファイルサーバにファイルを追加したりファイルを削除したりファイルを変更したりできます。 Master HDD は本データを保存するストレージで、Slave HDD は Master HDD の完全ミラーリングです。ミラーリングバックアップを取ることで HDD の故障に耐性を持ちます。

ちなみに、一見、RAID 1 (ミラーリング) に見えますが、RAID ではないです。 RAID は故障に対してサービスの提供継続性を保つシステムですが、今回作るシステムは単なるバックアップ作成であり故障耐性はありますがサービス提供継続性はありません。 この辺は自宅で個人で使用するシステムなので、のんびりした設定です。

作業を始めます。 材料一覧です。全部 Amazon.co.jp で買えます (買いました)。 場合によっては、この他に、キーボード、マウス、ディスプレイ (と HDMI ケーブル) が必要です。

raspberry-pi-nas-and-backup-server-1

raspberry-pi-nas-and-backup-server-3

以下、詳細です。Raspberry Pi 2 Model B 本体です。

  • Raspberry Pi 2 Model B

外付け HDD は何でもよいですが、今回は次の 2 種類のものを選びました。お手軽さは外付け HDD がベストですが、HDD 中身とケースでもいけると思います。

  • BUFFALO USB3.0 外付けハードディスク PC/家電対応 3TB HD-LC3.0U3/N
  • I-O DATA USB 3.0/2.0接続【家電対応】外付ハードディスク 3.0TB HDC-LA3.0

その他のアイテムです。 余談ですが、今回はじめてフラットタイプの LAN ケーブルを買ったのですが、ケーブルに変なくせが付かず取り回しがしやすくてとても気に入りました。

  • micro SD カード 32 GB
  • 電源アダプタ + ケーブル (5 V / 2.0 A)
  • LAN ケーブル

今回、Raspberry Pi 2 Model B を使用します。 Raspberry Pi 3 が出たばかりですが、電源問題があってちょっと不安だったので、5 V / 2.0 A でフルパワー動作する Raspberry Pi 2 B を選択しました。

raspberry-pi-nas-and-backup-server-2

作業手順

制作作業の手順を順番に説明します。

Step 1. micro SD に Raspberry Pi の初期セットアップ

(Step 2 と並列実行可能です。)

まず、micro SD に OS をインストールします。 今回は 32GB の micro SD カードを使います。 現時点での最新版、Raspbian Jessie をダウンロードします。 公式サイトからダウンロードすると遅い上にときどき途切れたりするので、ミラーサイト (JAIST) とかを利用したほうが良いです。

Windows だと、Win32 Disk Imager というソフトウェアで簡単に SD カードに OS イメージを書き込めます。

Raspberry Pi の初期セットアップします。基本的な初期セットアップのやり方は Web 上にたくさん転がっているので詳細は割愛します。初期設定ではパーティションがかつかつに切られているので、Expand Filesystem して SD カードフルに使用できるように忘れずに変更します。これするのを忘れてパッケージをインストールしたり更新したりするとリブート後に Raspberry Pi が起動しなくなることがあります (何度もやってしまったことがあります^^)。パッケージを更新しておきます。

$ sudo apt-get update
$ sudo apt-get dist-upgrade

NAS のために、IP を固定します。ちなみに、Rasbian Jessie では固定 IP の設定は /etc/dhcpcd.conf ファイルを編集します。Web 上にある多くの記事では /etc/network/interfaces を編集すると書いてありますが、それはちょっと古い情報ですので注意が必要です。

今回は、
ホスト名: rpadoribu
IPアドレス: 192.168.0.10
としました。 この設定で以下の説明を続けます。

Locale を ja_JP.UTF-8 にして、タイムゾーンを合わせて、キーボードの設定も Japanese に変えておきます。日本語環境として以下をインストールします。これは単なる好みです。

$ sudo apt-get install fonts-takao ibus-mozc

参考

Step 2. 外付け HDD のフォーマット

(Step 1 と並列実行可能です。)

適当なコンピュータ (今回は Windows) で、使用する 2 台の外付け HDD をフォーマットします。 今回は、exFAT にフォーマットします。このフォーマットは Windows と Mac の両方から扱うことが可能です。

フォーマットする前に外付け HDD のパーティションを確認します。パーティションの再分割は HDD 1 台の場合は特にやる必要ないと思いますが、2 台使用する今回の場合はパーティションを統一するために再設定します。コマンドラインプロンプトを管理者権限で開いて次のように操作して確認します。

> diskpart
DISKPART> LIST DISK

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           698 GB      0 B
  ディスク 1    オンライン          2794 GB      0 B

ディスク一覧が出力されるので、対象とするディスク番号を選択します。

DISKPART> SELECT DISK 1

ディスク 1 が選択されました。

HDD の種類によって初期パーティションは異なっていて、今回用意した 2 つの異なるメーカーの外付け HDD は異なる初期パーティションでした。

例えば、このように、ある HDD は初期状態で、パーティションが 1 つだけであることが確認できますが、

DISKPART> LIST PARTITION

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ             2794 GB   512 KB

ある HDD では初期状態でこのように、3.0 TB (2794 GB) のプライマリパーティションの他にパーティションがある場合があります。

DISKPART> LIST PARTITION

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    予約                 128 MB    17 KB
  Partition 2    プライマリ             2794 GB   129 MB

パーティションを再設定します。2.0 TB を超えるディスクは GPT 形式に設定する必要があります。

DISKPART> CLEAN

DiskPart はディスクを正常にクリーンな状態にしました。

DISKPART> CONVERT GPT

DiskPart は選択されたディスクを GPT フォーマットに正常に変換しました。

DISKPART> CREATE PARTITION PRIMARY

DiskPart は指定したパーティションの作成に成功しました。

DISKPART> LIST PARTITION

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    予約                 128 MB    17 KB
* Partition 2    プライマリ             2794 GB   129 MB

OK です。このままではマウントされていないので、ボリューム文字を割り当てておきます。

DISKPART> ASSIGN LETTER=E

DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

参考

HDD をフォーマットします。アロケーションユニットサイズはデフォルトの 1024 KB にします。クイックフォーマットにチェックを入れましょう。クイックフォーマットじゃないと実行に数時間要してしまいます。

これを 2 台目の外付け HDD に対しても同様にフォーマットします。 2 台の HDD にはそれぞれ次のようなボリュームラベルを付けています。
master HDD: RPHDYUIKO
slave HDD: RPHDAYAKA

参考

Step 3. NAS セットアップ

2 台の HDD を Raspberry Pi に接続して、NAS の設定をします。 NAS の対象ディスクとして動作するのは、master HDD の 1 台のみです。

まず、Raspberry Pi 上で exFAT を扱うためのパッケージをインストールします。

$ sudo apt-get install exfat-fuse exfat-utils

USB 接続した 2 台の外付け HDD を Raspberry Pi にマウントして見えるようにします。 まず、接続した状態で lsusbblkid コマンドで認識されているか確認します。

$ lsusb
Bus 001 Device 006: ID 04bb:014a I-O Data Device, Inc. 
Bus 001 Device 005: ID 0411:0286 BUFFALO INC. (formerly MelCo., Inc.) 
Bus 001 Device 004: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 001 Device 007: ID 049f:000e Compaq Computer Corp. Internet Keyboard
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ sudo blkid
/dev/mmcblk0: PTUUID="8f1eafaf" PTTYPE="dos"
/dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="boot" UUID="04FE-51E9" TYPE="vfat" PARTUUID="8f1eafaf-01"
/dev/mmcblk0p2: UUID="e6e7f776-11a4-4cd7-b4fd-c44ecdbfcf90" TYPE="ext4" PARTUUID="8f1eafaf-02"
/dev/sda1: PARTLABEL="Microsoft reserved partition" PARTUUID="95a873df-9f59-4952-a049-d698a05b6a7e"
/dev/sda2: LABEL="RPHDYUIKO" UUID="E2A5-2507" TYPE="exfat" PARTLABEL="Basic data partition" PARTUUID="eb35c869-20f5-4a84-89bd-ca2c02aa26f7"
/dev/sdb1: PARTLABEL="Microsoft reserved partition" PARTUUID="a711fe31-656d-4411-a0ff-ce25b6078d73"
/dev/sdb2: LABEL="RPHDAYAKA" UUID="62F0-8F37" TYPE="exfat" PARTLABEL="Basic data partition" PARTUUID="01e75d3d-4d0a-48fe-9bb5-dd8909cb38a7"

よさそうです。

Windows で GPT 形式でフォーマットすると、”Microsoft reserved partition” という管理用 (?) のパーティションが生成されてしまいますが、これは不要なので無視します。Mac か Linux でフォーマットすればこの生成は防げると思います。 自動でマウントしてくれるように、/etc/fstab を編集して次のような記述を追加してリブートします。UUID は上で blkid コマンドで確認した値です。

UUID="E2A5-2507"  /mnt/rphdyuiko  exfat-fuse  async,auto,dev,exec,gid=65534,rw,uid=65534,umask=007  0  0
UUID="62F0-8F37"  /mnt/rphdayaka  exfat-fuse  async,auto,dev,exec,gid=65534,rw,uid=65534,umask=007  0  0

リブート後、マウント状態を確認します。

$ sudo df
ファイルシス   1K-ブロック    使用     使用可 使用% マウント位置
/dev/root         30854716 3703888   25841788   13% /
devtmpfs            469688       0     469688    0% /dev
tmpfs               474008       0     474008    0% /dev/shm
tmpfs               474008    6452     467556    2% /run
tmpfs                 5120       4       5116    1% /run/lock
tmpfs               474008       0     474008    0% /sys/fs/cgroup
/dev/mmcblk0p1       61384   20368      41016   34% /boot
/dev/sda2       2930134016   17408 2930116608    1% /mnt/rphdyuiko
/dev/sdb2       2930134016   17408 2930116608    1% /mnt/rphdayaka
tmpfs                94804       4      94800    1% /run/user/1000

大丈夫そうです。 ls -la /mntでも一応確認しときます。 見えるようになりました。

$ ls -la /mnt
合計 2056
drwxr-xr-x  4 root   root       4096  4月 27 14:52 .
drwxr-xr-x 21 root   root       4096  4月 27 03:35 ..
drwxrwx---  1 nobody nogroup 1048576  1月  1  1970 rphdayaka
drwxrwx---  1 nobody nogroup 1048576  4月 27 14:53 rphdyuiko

続いて、Samba をインストールします。

$ sudo apt-get install samba

sudo nano /etc/samba/smb.conf ファイルを編集します。私は、[global] セクションに次の設定を追加して、

   max protocol = SMB2
   load printers = no
   printcap name = /dev/null
   printing = bsd

ファイルの末尾に NAS 用の設定を追記しました。

[share]
   comment = NAS
   path = /mnt/rphdyuiko
   read only = no
   guest ok = yes
   force user = pi

samba を起動します。

$ sudo /etc/init.d/samba start

Raspbian の場合、自動起動設定は自動でやってくれているようですので、自分で設定するのは不要でした。

ちなみに、Windows から NAS にアクセスする場合、次の設定をしておかないと大きなサイズのファイルを転送するときにエラーになることがありますので、できれば設定しておきましょう。
WindowsからNASへファイル転送時エラー「アクセス中に問題が発生しました」の解決方法 – Qiita

これで、NAS の構築が完了です。 Windows からはエクスプローラで \\192.168.0.10 (今回の設定の場合) と入力すればファイルサーバにアクセスできます。Mac の場合、smb://192.168.0.10 で接続できます。 ファイル/フォルダの作成/削除をテストします。 ファイル名/フォルダ名には日本語を含む場合と含まない場合もテストします。 とりあえずOKです。

その他、/etc/samba/smb.conf で、パスワード認証とか IP アドレス制限とか、いろいろ設定することができます。

構築した NAS を対象に、2 GB 程度のファイルで転送実験したところ、
ローカルからサーバへのファイル転送の速度は、最高で 8 MB / sec ぐらい、
サーバからローカルへのファイル転送の速度は、最高で 12 MB / sec ぐらいでした。

ここで、すでに Raspberry Pi の CPU 使用率はほぼ 100% に達しています。

参考

Step 4. rsync セットアップ

Raspberry Pi 上で rsync を利用して、master HDD の内容を slave HDD へミラーリングします。 rsync とは ディレクトリ同士を同期させることができるツールです。

rsync は、Raspberry Pi Jessie にデフォルトでインストールされていたので、これを使用します。

今回、master HDD (RPHDYUIKO) は /mnt/rphdyuiko、slave HDD (RPHDAYAKA> は /mnt/rphdayaka にマウントされているため、次のコマンドがバックアップコマンドになります。

$ sudo rsync -av --inplace --delete /mnt/rphdyuiko/ /mnt/rphdayaka/

-z オプションを付けて圧縮して転送するように設定する方法が Web 上にありますが、今回はネットワークを介さない転送なので、圧縮はしないで CPU 負荷をなるべく抑えます。 それから、ディレクトリの末尾のスラッシュが地味に重要なので忘れないようにしましょう。

2016-07-29 追記: –inplace オプションを追加しました。

このコマンドも CPU 使用率がほぼ 100% になります。 適度な頻度でバックアップされるように、cron に登録しておきます。

参考

完成

システムが完成しました。全体図です。

raspberry-pi-nas-and-backup-server-4

Raspberry Pi 部分の拡大です。

raspberry-pi-nas-and-backup-server-5

samba による NAS サーバ機能と、rsync によるバックアップサーバ機能を 1 つの Raspberry Pi と 2 台の外付け HDD で実現しています。

性能について
目指した機能は実現できたものの、性能は必ずしも良いという評価はできないでしょう。 samba だけでファイル転送中は CPU 使用率がほぼ 100% まで上昇するため、同時に rsync を走らせた場合、かなり CPU パワーがボトルネックになると思います。 専用の NAS サーバには及びません。 しかし、バックアップの頻度を調整する等すれば、個人の実用には十分なシステムです。

より性能を向上させる方法として、samba と rsync の負荷を分散させるために、master HDD と slave HDD をそれぞれコントロールする Raspberry Pi を 2 台用意して、master 側で NAS のサービス、slave 側で rsync の実行を担うことで仕事が分散されると考えられます。

まとめです。 今回は、Raspberry Pi と外付け HDD を用いて、手軽に安価で NAS とバックアップサーバの構築できました。 気になる方は試してみてください。

次回は Raspberry Pi を使って、もっと電子工作っぽいことをやろうと思います。

この記事をシェアする:Tweet about this on TwitterShare on FacebookShare on Google+Share on TumblrEmail this to someone

スポンサーリンク

Comments

  1. 匿名 より: 返信

    raspberry piでのnas構築を検討していて、レビューが参考になりました。
    ほぼ同じ構成を想定していたので、私の用途では厳しそうです…

    ところで、2台用意してもmasterからNICへ1プロセスがファイル転送するところでCPUを100%取られてしまう以上、負荷の軽減にはスケジュール調整が必要そうですね

  2. 匿名 より: 返信

    なぜHDDの名前がAYAKAとYUIKOなのですか?
    マスターとスレイブ、つまり主人と奴隷の関係におかれたアヤカとユイコはどうなってしまうのでしょうか。

コメントを残す

名前を入力しなくてもコメント投稿可能です (匿名ユーザとして表示されます)。