概要: Raspberry Pi 2 Model B と 2 台の外付け HDD で、NAS (samba) とバックアップサーバ (rsync) を構築しました。そこそこ性能のものが、手軽でそして安価にできます。
Contents
作りたいのもは次のようなシステムです。
Raspberry Pi は自宅 LAN と、2 台の HDD と接続します。 NAS サーバとしてファイル共有サーバの役割を果たしていて、自宅 LAN 内のユーザはファイルサーバにファイルを追加したりファイルを削除したりファイルを変更したりできます。 Master HDD は本データを保存するストレージで、Slave HDD は Master HDD の完全ミラーリングです。ミラーリングバックアップを取ることで HDD の故障に耐性を持ちます。
ちなみに、一見、RAID 1 (ミラーリング) に見えますが、RAID ではないです。 RAID は故障に対してサービスの提供継続性を保つシステムですが、今回作るシステムは単なるバックアップ作成であり故障耐性はありますがサービス提供継続性はありません。 この辺は自宅で個人で使用するシステムなので、のんびりした設定です。
作業を始めます。 材料一覧です。全部 Amazon.co.jp で買えます (買いました)。 場合によっては、この他に、キーボード、マウス、ディスプレイ (と HDMI ケーブル) が必要です。
以下、詳細です。Raspberry Pi 2 Model B 本体です。
外付け HDD は何でもよいですが、今回は次の 2 種類のものを選びました。お手軽さは外付け HDD がベストですが、HDD 中身とケースでもいけると思います。
その他のアイテムです。 余談ですが、今回はじめてフラットタイプの LAN ケーブルを買ったのですが、ケーブルに変なくせが付かず取り回しがしやすくてとても気に入りました。
今回、Raspberry Pi 2 Model B を使用します。 Raspberry Pi 3 が出たばかりですが、電源問題があってちょっと不安だったので、5 V / 2.0 A でフルパワー動作する Raspberry Pi 2 B を選択しました。
制作作業の手順を順番に説明します。
(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 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
参考
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 にマウントして見えるようにします。
まず、接続した状態で lsusb
と blkid
コマンドで認識されているか確認します。
$ 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% に達しています。
参考
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 部分の拡大です。
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 を使って、もっと電子工作っぽいことをやろうと思います。