Raspberry Pi で NAS を作って Windows Server バックアップ

自分用のメモ書きです。

顧客先に納品した Web システムがどれも Windows Server 上で動いてる。保守サポート用に客先のサーバーと同じ環境を自社内にも再現して構築してある。おかげさまでお客様が増えたので、今は 4 台の Windows Server 機が稼働してるんだけど、物理的に 4 台もサーバ置くと邪魔だし電気代もバカにならない。どのシステムもしょせん IIS + MySQL + php のかるーい Web システムだし客先のサーバー環境の再現ができてればいい程度でときどきしか使わないし使うのも私一人だし。

NUC

ということで NUC (Next Unit of Computing) というインテル製 極小パソコンに ESXi という仮想環境構築ソフトをインストールして4台の仮想パソコンを作り出して、各仮想パソコンに Windows Server をインストールしてる。

IMG_0288

↑NUC。11cm×11cmというフットプリントが CD ケースより小さなパソコン。これ1台の中に4台の仮想 Windows Server 機が動いてる。すごい時代だ。

Windows Server バックアップ

客先の環境再現なので重要なデータが入ってるわけでもないから壊れたら壊れたでまた作り直せばいい程度ではあるんだけど、それでも一から作り直すのも面倒なので Windows Server の標準機能である「Windows Server バックアップ」を使ってサーバー丸ごとの自動バックアップを定期的に取っておきたい。

Windows Server バックアップは、USB 外付けハードディスクを接続しておけば定期的にバックアップを取ることができるんだけど、残念ながら物理的に1台しかない USB ハードディスクを複数の仮想パソコンに同時にマウントさせる方法がさっぱりわからん。そもそも可能なのかどうかすらわからん。勉強不足だ。

ところで、Windows Server バックアップは、Windows ファイル共有機能を ON にしてある別のパソコンにネットワーク経由でバックアップをする機能もある。ああ、これなら簡単にできそうだ。

NAS

しかし、バックアップの保存先にするためだけにもう1台パソコンを買うのはもったいない。そんなときのために NAS(Network Attached Storage)というネットワークに接続して使うハードディスクが売ってる。

12dh940000087y7t

これ、見た目はただのハードディスクだけど、ネットワーク上にあるいろんなパソコンと接続したり ID とパスワードによっては接続を拒否したり、見ることはできるけど編集はできないとか、そういったアクセス権の制御とかハードディスクに異常がないか監視するとかをする必要があるので、いろいろと設定しなきゃいけない実際にはミニパソコンみたいなもんでもある。実際、中身に Windows  とか Linux とかがインストールされてたりする。そういった制御系が内装されているためちょっとお値段が張る。まあパソコン買うよりは全然安いけど。それでも、もともとなくなってもいいデータしかない Windows Server のバックアップ用という今回の目的のためにはまだまだお値段が高いような気が・・・・うん、高いな。

Raspberry Pi

んで、思いついたのが Raspberry Pi(ラズベリーパイ)。英国のラズベリーパイ財団が世界中の子どもたちが手軽に電子工作を楽しんだり、プログラミングに関する基本知識を学んだりできるようにと開発した簡易コンピュータ。性能は非常に限られているものの名刺サイズの超小型さと数千円という手軽な価格で人気。

IMG_0289

↑Raspberry Pi 1 Model B+。USB 端子が4つ、LAN 端子が1つ、ディスプレイ接続用に HDMI 端子、サウンド出力用にヘッドホン端子。電源は microUSB 端子があるのでスマホの充電などで使われている USB 充電器をここにさせば動く。

Raspberry Pi で NAS を作って Windows Server バックアップをやろう

ということで、Raspberry Pi に USB 外付けハードディスクをくっつけて NAS にしてしまって、Windows Server バックアップのバックアップデータ保存先としての仕事を一手に引き受けさせよう。という話。あとでまたやらなきゃいけなくなった時のために手順を全部書き留めておく。自分専用。

Raspberry Pi の準備

Raspberry Pi 1 Model B+ を買った。Raspberry Pi2 Model B や Raspberry Pi3 の方が高性能だけど消費電力も大きくなって扱いにくくなる。バックアップ目的なのでのんびりデータを保存してくれても全然構わないので安い Pi 1 Model B+ で構わんだろう。Raspberry Pi は基板むき出しなので何かケースがあった方がいい。Amazon で透明ケース付属で 5,480円。安いってことはいいことだ。

ある程度設定が済めば、あとは SSH で遠隔操作できるので最終的には不要になるんだけど、初期設定が終わるまではディスプレイとキーボードとマウスはあったほうが作業しやすい。USB ポートに適当なキーボードとマウスを挿しておく。ディスプレイは HDMI 端子なので自宅のテレビとつなげば済む。

あとは有線 LAN につないでおけば準備完了。

OS (Raspbian) をインストール

Raspberry Pi は簡易ながらもれっきとしたパソコンなので OS が必要。何種類かの OS が動くようだけど、公式の Raspbian で。公式万歳。

OS のダウンロードからインストールまでは Mac でやった。まずは公式サイト (https://www.raspberrypi.org/downloads/) のDownload ページから Raspbian の zip 圧縮したものをダウンロードする。この記事を書いた時は JESSIE のバージョン March 2016。ダウンロードしたらダブルクリックして zip 圧縮を解凍しておく。

jessie

Raspberry Pi 1 Model B+ はハードディスクとか SSD みたいなストレージはない。microSD カードを挿すところがある。SD カードがパソコンでいうところの内蔵ストレージになるので、まずは  microSD カードに OS をインストールするところから始める。ということで適当な microSD カードを用意して、Mac でこの microSD カードに OS をインストールする。

microSD カードを Mac に接続

ターミナルを起動

↓ドライブ類の一覧表を出力する
df

df コマンドを入力するとマウントされているドライブ類の一覧表が出力されるのでその中から microSD カードの行を探す。microSD カードを挿す前に df コマンド打っておいてすぐに microSD カードをプスッと挿してまた df コマンドを打てばどの行が microSD カードなのかわかりやすい。

/dev/disk4s1    62652416      5056   62647360     1%        0         0  100%   /Volumes/RASPBIAN

↑こんな感じの行。最初にある Filesystem の名称(上の例だと /dev/disk4s1)を使って OS を書き込む。これを間違えると違うディスクを消去しちゃうことになるのでどの Filesystem が microSD カードを指しているのかしっかり確認すること。

↓microSD カードのマウント解除 (disk4s1の部分は適切な Filesystem を使う)
sudo diskutil unmountDisk /dev/disk4s1

↓Raspbian のイメージファイルが保存してあるフォルダへ移動する
cd /Users/<ユーザ名>/Downloads

cd と打ってから、イメージファイルが保存されているフォルダをターミナルの画面にドラッグ&ドロップすれば、そのフォルダまでのパスが自動的に入力される。その方が打ち間違いがなくて楽。今回の例だとイメージファイルはダウンロードフォルダに入ってたので、ターミナルでcdと打った後にダウンロードフォルダをターミナルのウインドウにドラッグ&ドロップ。

↓microSD カードに Raspbian OS を書き込む。ここのコマンドを打ち間違えるととんでもないことになる可能性があるから慎重に確認する。特に of オプションの部分。

sudo dd bs=1m if=2016-03-18-raspbian-jessie.img of=/dev/rdisk4

重要なのは /dev/rdisk4 の部分。microSD カードの Filesystem が/dev/disk4s1 だとして末尾の s1 を取って、先頭に r を付けた rdisk4 と入力する。理由はよくわからん。

コーヒーブレイク

コーヒーを1杯飲み終わる頃には microSD カードには Raspbian が書き込まれて Raspberry Pi 用の起動ドライブになってる。Raspberry Pi 用の起動ドライブになっているので Mac の画面には表示されないので、ディスクユーティリティを起動して、マウントされている microSD カードを取り出す。

Raspberry Pi の初期設定

Mac から取り出した microSD カードを Raspberry Pi の microSD カードスロットに差し込む。んでもって電源投入。Raspberry Pi には電源スイッチがないので、microUSB 端子にスマホ充電器を差し込んだ瞬間に電源が入る。

最新の OS (JESSIE) だと、しばらく起動画面を眺めていると最後にグラフィカルな画面 (X Windows) が起動する。コマンド入力で初期設定するのは面倒だし間違えやすいので、このままグラフィカルな画面で初期設定を済ませる。

左上の [ラズベリー Menu] から Preferences > Raspberry Pi Configuration を選択。

設定画面で System > FileSystem: で [Expand FileSystem] のボタンをクリックして microSD カード全体を Raspberry Pi で使用するように拡張(初期のままだと OS に必要な部分だけで残りの部分は不使用になってる。もったいないので microSD カードの全体を Raspberry Pi 用のディスクとして使えるように拡張する)。

System > Password: で [Change Password…] ボタンをクリックして表示されるダイアログで pi ユーザのパスワードを変えておく(Raspberry Pi は初期状態では pi というユーザが作られていてパスワードは raspberry に設定されていて、自動的にこのユーザ名とパスワードでログインするように設定されてる。そのままだと心配なのでパスワードを変えておいたほうがいい)。

System > Boot: で [To CLI] にチェックマークをする(初期設定が終わってしまえばグラフィカルな画面は動きが重くなるだけなのでコマンドラインインターフェイス (CLI) で起動するように設定しておく)。ちなみに CLI の時に startx とコマンドを打てばグラフィカルな画面 (X Windows) が起動できる。

Localization > TimeZone: で [Set Timezone…] ボタンをクリックして設定画面で Area: Asia/Location: Tokyo に設定。

Localization > Keyboad: で [Set Keyboard…] ボタンをクリックして設定画面で Japanese/109 に設定。

[OK] ボタンをクリックしてから Raspberry Pi Configuration 画面を閉じる。

右上にあるネットワークアイコンを右クリックして WiFi Networks Settings を開く。

Configue: で [interface] にして [eth0] に設定(有線LANを使用する設定)。

IP Adress: に設定したい IP アドレスを入力(今回は 192.168.1.120)

Router: にはルーターの IP アドレスを入力、DNS Servers: には DNS サーバの IP アドレスを入力。

[Apply] ボタンをクリックしてから [Close] ボタンで設定画面を閉じる。

[ラズベリーMenu] からShutdown… > Rebootで再起動。

ここからはコマンドラインインターフェイス (CLI) で初期設定を続行。SSH が有効になってるから Raspberry Pi からディスプレイ、キーボード、マウスを取り外して、別のパソコンで SSH を起動して遠隔操作でも設定作業できる。

↓Mac でターミナルを起動して SSH で Raspberry Pi に接続する。
ssh pi@192.168.1.120

パスワードを聞かれるので、さっき変更した pi ユーザのパスワードを入力(もし変更してなければ raspberry)。

↓Raspberry Pi はなんでもできる root ユーザにパスワードが付いてないので、root にパスワードをつける
sudo passwd root

新しいパスワードを入力して、確認のためにもう一回入力したら設定完了。念のために再起動する。
sudo reboot

再起動すると自動的に SSH 接続が解除されるので、再起動が終わったころを見計らってまた Mac から SSH 接続する。

↓パッケージリストを更新
sudo apt-get update

結構時間かかるのでコーヒータイム。途中で [Y/n] で本当にやるの?とか聞いてくる場合がある。何も考えず Y を入力。

↓各パッケージを最新状態に更新
sudo apt-get upgrade

結構時間かかるのでコーヒータイム。途中で [Y/n] で本当にやるの?とか聞いてくる場合がある。何も考えず Y を入力。

↓ディストリビューションを更新
sudo apt-get dist-upgrade

↓ファームウエアの更新
sudo rpi-update

全部終わったら

↓一時的にインストールされた不要パッケージの削除
sudo apt-get autoremove
sudo apt-get autoclean

USBポートの給電性能を変更

Raspberry Pi Model B+ の USB ポートは初期設定では最大 0.6A しか出力されない。最近のポータブルハードディスクの消費電力は結構大きいのでそのままだとハードディスクを USB ポートに挿しても電力不足で動かない可能性が高い。そこで USB ポートに最大 1.2A まで出力できるように設定を変更する。

sudo vi /boot/config.txt を実行して config.txt を開いて設定ファイルの最後に max_usb_current=1 を書き込んで保存して終了。

sudo reboot を実行して再起動

ちなみに、USB ポートに消費電力の高いポータブルハードディスクを取り付けるってことは、もととなってる Raspberry Pi に対して高い電力を供給しとかないといけない。ということで Raspberry Pi の電源にはタブレットなどを急速充電できる 2.4A 出力タイプの AC アダプタを使った。

thumb-141865_2

↑バッファローの 2.4A 出力 USB 充電器「BSMPA2401BC1WH」

外付けハードディスクの準備

Mac と Windows の両方から読み書きできるファイルサーバにするなら exFAT でフォーマットするのがいいけど、今回の目的である Windows Server バックアップ 用のバックアップデータ保存先としては、NTFS フォーマットのハードディスクじゃないといけない。ということで NTFS フォーマット済みのポータブルハードディスクを用意する。NTFS じゃなかった時は Windows パソコンに接続して NTFS でフォーマットする。

Windows パソコンで NTFS にフォーマットし終わったら取り外して Raspberry Pi に接続。RASPBIAN OS はそのままでは NTFS フォーマットのハードディスクを取り扱えないので、

↓NTFS を取り扱うパッケージをインストールする。
sudo apt-get install ntfs-3g

インストールが終わったら sudo reboot を実行して再起動。

↓ディスク一覧を表示させて NTFS フォーマットの外付けハードディスクが認識されていることを確認する
sudo fdisk -l

fdisk-l

↑デバイス名「/dev/sda1」が今回接続した USB ハードディスク。認識されただけでは利用可能にはならない。

↓まずはマウントポイントを作成する(usbhdd1は好きな名前で)
sudo mkdir /mnt/usbhdd1

↓作成したマウントポイントにハードディスクをマウントする
sudo mount -t ntfs-3g /dev/sda1 /mnt/usbhdd1

↓外付けハードディスク (/dev/sda1) が /mnt/usbhdd1 にマウントされたことを確認
df -h

df

ここからは、Raspberry Pi を起動した時に自動的にマウントされるように設定する

↓外付けハードディスクに割り当てられた ID(UUID)を確認
sudo blkid /dev/sda1

UUID=”xxxxxxxxxxxxxxxxxxxxxx” という表示を見つけて、xxxxxxxxxxxxxxxxxxxxxxの部分を書き写しておくか、コピーしておく。

↓fstab に Raspberry Pi を起動した時に自動的に外付けハードディスクがマウントされるように設定を書き込む

sudo vi /etc/fstab を実行して /etc/fstab を開いて設定ファイルの最後に

UUID=”xxxxxxxxxxxxxxxxxxxxxx” /mnt/usbhdd1 ntfs-3g defaults,nofail 0 0

を書き込んで保存して終了。

念のため sudo reboot で再起動して df -h を実行して自動的にハードディスクがマウントされるのを確認する。

↓完成品。Raspberry Pi 1 Model B+ と 500GB のポータブルハードディスクの組み合わせ。初期設定が終われば Raspberry Pi にディスプレイもキーボードもマウスもいらない。USB 端子にハードディスクが、LAN 端子に LAN ケーブルが、microUSB 端子にスマホ充電器が挿さってる簡易な構成。USB ケーブルをもっと短いものにして Raspberry Pi とポータブルハードディスクをヒモでしばっちゃえばもっとコンパクトになる。

IMG_0290

Samba のインストールと設定

Raspberry Pi に接続した外付けハードディスクを、ネットワーク上の他のパソコンから利用できるファイル共有機能をインストールする。Windows Server バックアップから利用できるようにするために、Samba というファイル共有機能をインストールする。

↓Samba をインストールする
sudo apt-get install samba

コーヒーブレイク。途中で [Y/n] で本当にやるの?とか聞いてくる場合がある。何も考えず Y を入力。

終わったら Samba の設定。以下の内容の設定を追加する。

  • 共有名:rasnas1
  • 共有するフォルダ:/mnt/usbhdd1
  • 読み書き可能
  • ゲスト接続禁止
  • ファイル操作を pi ユーザ によって実行
  • ネットワークコンピュータに表示しない

sudo vi /etc/samba/smb.conf を実行して設定ファイルを開いたら末尾に下記の設定を追記して、保存して終了。

[rasnas1]
path = /mnt/usbhdd1
read only = no
guest ok = no
force user = pi
browseable = no

↓pi ユーザにパスワードを設定
sudo smbpasswd -a pi

新しいパスワードを入力して、確認のためにもう一回入力したら設定完了。念のために sudo reboot で再起動する。

ネット上の Windows パソコンのエクスプローラから ¥¥192.168.1.120¥rasnas1 にアクセスできることを確認。アクセスする際に、ユーザ名とパスワードを聞いてくるので、Samba で設定した pi とそのパスワードを入力すればいい。

Windows Server バックアップの設定

さて、Raspberry Pi が無事にファイルサーバーになったので、ここからは Windows Server 機で Raspberry Pi に接続してあるハードディスクにバックアップを取るための設定をしていく。

適当な Windows 機のエクスプローラから ¥¥192.168.1.120¥rasnas1 にアクセスする。

rasnas1 の中に、バックアップデータ保存用にフォルダを作る。今回は4台の Windows Server 機のバックアップデータを保存するので、フォルダを4つ作って Svr01, Svr02, Svr03, Svr04とか適当にわかりやすい名前をつけておく。バックアップ先ができたら Windows Server 機のメモ帳ソフトで

wbadmin start backup -backupTarget:¥¥192.168.1.120¥rasnas1¥Svr01 -include:C:,D: -vssFull -user:pi -password:xxxxxxxxxxx -quiet

と書く(Svr01の部分はバックアップ用に作ったフォルダの名前なのでサーバごとに決めたフォルダ名にしておく。xxxxxxxxxxx は Raspberry Pi の Samba の pi ユーザのパスワード)。

これを serverbackup.bat とか適当なファイル名で保存する。

このバッチファイルを右クリックして [管理者として実行…] を実行して、コマンドプロンプトが起動して Windows Server バックアップが開始されれば OK。

wbadmin

Raspberry Pi は非常に性能が低いコンピュータだからバックアップ作業もスッゲー遅い。笑っちゃうくらい遅い。バックアップが始まってもしばらくは「(0%) をコピーしました」という表示が続くけどしばらくすると(1%)に増えるので心配しなくていい。まあバックアップできりゃいいんで気にしない気にしない。

バッチファイルが [管理者として実行…] でちゃんと動作することが確認できたら、あとは Windows Server の管理ツールにある [タスク スケジューラ] にバッチファイルを登録して適当なタイミングで自動実行されるように設定すれば完了。

全部の Windows Server 機で同様にバッチファイルを作成してタスク スケジューラに登録していく。最初のバッチファイルをコピーして、バックアップ先の Svr01 のとこだけ指定のフォルダ名に書き換えればいい。あ、Windows Server のパーティション構成が違ってれば -include:C:;D: のところも変更する必要あるけど。