バックアップ(RaspberryPiでNASを構築)
ある日突然PCのデータが消える! 想い出の写真やスキル情報が全~部パー(>_<)
そんな思いをしなくて良いように、コンピュータ(Windows、Linux、Mac)のシステムやデータをバックアップするためのNAS(Network Attached Storage)システムを構築する
1.USB-HDDのフォーマット
2.RaspberryPi3の基本設定
3.NASサーバー設定
4.Windows側の設定
5.Linux側の設定とバックアップ設定
1.USB-HDDのフォーマット
Macで使うことはほぼ無いと思うが、大容量のバックアップデータを扱うことになるので、ここは迷わずexFATでフォーマットする
(1)PC(windows10)にHDDを(USB)接続し、
[プログラム]-[Windows管理ツール]-[コンピュータの管理]-[ディスクの管理]で対象のHDDを表示
(2)複数あるパーテーションを一つずつ右クリックし、
操作メニューの[ボリュームの削除]を選択。
全てのパーテーションについて実施すると、
1つの「未割り当て」パーテーションになるので、
これを右クリックし操作メニュー[新しいシンプル ボリューム]を選択する
シンプルボリューム作成ウイザードが表示されるので、
全て[次へ]をクリックして[完了]までいくと、[正常(プライマリ パーテーション)]ができあがる
(3)[正常(プライマリ パーテーション)]を右クリックし、操作メニュー[フォーマット](↓)を選択する
(4)フォーマットダイアログ(↑)が開くので、
「ボリュームラベル」を適当に入力し、
「ファイルシステム」は”exFAT”を選択し、
[OK]をクリックすると、たちまちフォーマット完了する
2.RaspberryPi3の基本設定
RaspberryPi本体は、余計なパッケージは不要なので、OS:Raspbian Stretch Liteを使用する
立ち上げた後、次の基本的な設定だけを実施
①hostnemaの変更
②Timezoneの設定をAsia/Tokyoに変更
③有線LANの使用、固定IPアドレス化とwifiの無効化
④公開鍵/秘密鍵を使ったSSH接続設定
3.NASサーバー設定
いよいよNASを仕込む
(1)exFAT形式のファイルを扱うためのパッケージ(exfat-fuseとexfat-utils)をinstallする
1 2 |
$ sudo apt-get install exfat-fuse exfat-utils $ sudo reboot |
(2)HDDのUUIDの確認
USB-HDDをRasPiに接続し、次のコマンドでHDD(/dev/sda1)のUUIDを控えておく
1 2 |
$ sudo blkid /dev/sda1: LABEL="NASHDD" UUID="0442-DE65" TYPE="exfat" PARTUUID="XXXXXXXX-01" |
(3)HDDが自動マウントされるよう/etc/fstabに追記する
1 2 3 |
$ sudo vi /etc/fstab 次の行を追記(UUIDは上記で控えておいたもの) UUID="0442-DE65" /mnt/hdd/nashdd exfat-fuse async,auto,dev,exec,gid=65534,rw,uid=65534,umask=007 0 0 |
ここで、UUID:前述のとおり
/mnt/hdd/nashdd:マウントポイント
async:データー転送を非同期で行う (キャッシュ機能を使いHDDへの書き込み終了を待たない)
他にsync(同期)がある(リアルタイムで書き込みが行われる)
65534:gidはnogroup、uidはnobodyを表す ($ cat /etc/groupや$ cat /etc/passwdで確認可能)
このままでは、webサーバー再起動時に自動mountできないので、$ sudo vi /etc/rc.d/rc.local で最後尾にmount -aを追記
RasPiを再起動して、$ sudo df で、次のようにマウントされていることを確認
1 2 |
Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 1953512448 3969024 1949543424 1% /mnt/hdd/nashdd |
(4)Sambaのinstall
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sudo apt-get install samba Sambaの設定 $ sudo vi /etc/samba/smb.conf 以下の内容を追記 [pi] comment = NAS path= /mnt/hdd/nashdd read only = no guest ok = yes force user = pi <= 操作ユーザ(pi)を指定 unix extensions = no 設定を反映させるため、再起動 $ sudo reboot |
(5)使用していないときにHDDの回転を止める
①HDDの回転を止めるパッケージをinstall(hdparmをinstall 他にsdparmパッケージがあるがうまく動かなかった)
1 |
$ sudo apt-get install hdparm |
②実際にコマンドを打って、HDDの回転が止まるのを確認
(HDDを手で触った状態で次のコマンドを打つと次第(2秒位)に回転振動弱くなり止まるのが分かる)
1 |
$ sudo hdparm -y /dev/sda1 |
③HDDアクセス監視スクリプトを作る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
$ sudo vi /root/hdd_spindown.sh で以下の内容を新規作成 #!/bin/sh if [ $# -lt 2 ]; then echo "not enough arguments supplied." echo "hdd_spindown.sh [UUID] [INTERVAL]" exit 0 fi disk=`findfs UUID="$1"` interval=$2 count=$interval up=1 if [ -z $disk ]; then #echo "findfs error" exit 1 fi disk=`echo "$disk" |sed -e "s@/dev/@@"` state=`grep " $disk " /proc/diskstats` while [ true ]; do sleep 10 count=$(($count-10)) newstate=`grep " $disk " /proc/diskstats` if [ "$state" = "$newstate" ]; then if [ $count -lt 0 ]; then count=$interval if [ $up = 1 ]; then #echo -e "spin-down" sync state=`grep " $disk " /proc/diskstats` hdparm -y /dev/$disk > /dev/null 2>&1 up=0 fi fi else #echo -e "drive is up" count=$interval state="$newstate" up=1 fi done 更にパーミッションを変更 $ sudo chmod 700 /root/hdd_spindown.sh |
④Systemdを使って/root/hdd_spindown.shをサービス化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ systemctl list-units| grep -F .mount により、対象のデバイスがどのUnit名でマウントされているか確認 "mnt-hdd-nashdd.mount <=これがUnit名 loaded active mounted /mnt/hdd/nashdd" $ sudo vi /lib/systemd/system/user_hdd_spindown.service で、新規に次を作成 [Unit] Description=hdd spindown by sdparm After=mnt-hdd-nashdd.mount <= 確認したUnit名 [Service] ExecStart=/root/hdd_spindown.sh 0442-DE65 600 > /dev/null 2>&1 <= UUID とスピンダウンまでの時間(秒):600(=10分) KillMode=process Type=simple Restart=no [Install] WantedBy=multi-user.target 起動時にこのシェルが実行されるように、次のように設定 $ sudo systemctl enable /lib/systemd/system/user_hdd_spindown.service |
これで、NASシステムは完成
4.Windows側の設定
ネットワークドライブを割り当てる方法もあるが、Windows側から常時アクセスする訳ではないので、
ここではファイル共有サービスのためのプロトコルSMB1.0(Server Message Block)だけを有効にしておく
①コントロールパネルを開き[プログラムと機能]を選択、左メニューより[Windowsの機能の有効かまたは無効化]を選択すると
Windows機能の有効/無効ダイアログが開くので、[SMB 1.0/CIFS ファイル共有のサポート]に✔を入れて[OK]を押下
PCを再起動する
②NASが見えるか、explorerで確認(explorer左メニューの「ネットワーク」に「NAS_SERVER1」が見えればOK
5.Linux側の設定とバックアップ設定
バックアップソフトMondo Rescue(フリー)を使用して、Webサーバー(OS:CentOS6.*)のシステムバックアップを取る
以下は全て、Webサーバー側での作業
(1)MondoRescueパッケージのinstall
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<レポジトリの公開鍵を組み込む> # cd # wget ftp://ftp.mondorescue.org//rhel/6/x86_64/mondorescue.pubkey # rpm --import mondorescue.pubkey <レポジトリファイルをダウンロードしyumに登録> # wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mondorescue.repo # cp mondorescue.repo /etc/yum.repos.d/mondorescue.repo <install時に公開鍵のチェックを行わないよう編集> # vi mondorescue.repo で以下の変更 [mondorescue] name=rhel 6 x86_64 - mondorescue Vanilla Packages baseurl=ftp://ftp.mondorescue.org//rhel/6/x86_64 enabled=1 gpgcheck=1 <span style="color: #ff0000;"><= これを、0に変更</span> gpgkey=ftp://ftp.mondorescue.org//rhel/6/x86_64/mondorescue.pubkey <mondorescueパッケージをinstall> # yum install mondo <mondorescue.repo のgpgcheck=0は、1に戻しておく> |
(2)MondoRescueの動作確認
①バックアップデータの出力先を作成
# mkdir /backup
②バックアップの実行
# mondoarchive -O -i -L -N -s 4200m -d /backup -E /backup
<パラメータの意味>
-O:バックアップを実行(他に-V:ヴェリファイがある)
-i :バックアップデータをISOイメージで出力する
-L :bzip2の代わりに速い圧縮エンジンのlzo を使います
-N :ネットワークファイルシステム(NFS,SMBなど)を除外
-s :出力するISOファイルサイズを指定する。
作成するファイルサイズが指定より大きくなる場合は複数に分割される
-d :出力先(ディレクトリやバックアップデバイス)を指定
-E :除外するディレクトリを指定。
自動で(/mnt/floppy, /mnt/cdrom, /proc, /sys, /run, /tmp)は除外される
# ls -l で出力確認してみる
-rw-r–r– 1 root root 1909047296 3月 19 09:13 2019 mondorescue-1.iso
ちなみに1.9Gで10分程度で出力される
③バックアップデータ(ISOファイル)をDVD(-R)に焼く
DVDドライブのデバイス名確認
# wodim –devices
wodim: Overview of accessible drives (1 found) :
————————————————————————-
0 dev=’/dev/scd0′ rwrw– : ‘HL-DT-ST’ ‘DVD+-RW GSA-H31N’
————————————————————————-
DVDドライブにDVDをセットして次のコマンドを打つ
# cd /backup
# wodim -v -eject speed=8 dev=/dev/scd0 -data mondorescue-1.iso
④リストア-
いざと言うときのためにリストア-をやってみた(笑
サーバーにDVDをセットし、CDドライブからコンピュータを起動
「boot:」プロンプトに、nuke と入力するだけ 元のシステムに復元できました !(^^)!
(3)バックアップを定期で実施するように設定する
1 2 3 4 5 6 7 8 9 10 |
<シェルスクリプトを作成> # vi /root/server-backup.sh #!/bin/bash /usr/sbin/mondoarchive -O -i -L -N -s 4200m -d /mnt/nas/backup/centos -E /backup -p `hostname`_`date +%Y%m%d` # chmod 700 /root/server-backup.sh <定期的に実行するようcron設定:毎月1日、2:00に実行> # vi /etc/cron.d/backup # システムバックアップ 毎月9日の午前2時起動 0 2 9 * * root /root/server-backup.sh |
さてさて、これで完成かと思いきや、Windowsからバックアップを実施するとことごとくエラーが発生
[ファイルのバックアップ]:エラー0x80070005
[システム イメージの作成]:エラー0x80780047
どうやらHDDをexFATでフォーマットしたことが原因と思われる
早速、NTFSでフォーマットを実施する(Macは使わないので最初からこれにしておけば良かったのに (-_-;)
6.HDDのフォーマット変更
(1)WebサーバーからNASHDDをUNMOUNT
1 2 3 4 5 6 7 8 9 10 |
①mount状態の確認 # df Filesystem 1K-blocks Used Available Use% Mounted on //192.168.0.41/pi 1953512448 456070656 1497441792 24% /mnt/nas ②unmount実施 # umount //192.168.0.41/pi ③mount状態の確認 # df Filesystem 1K-blocks Used Available Use% Mounted on <当該Filesystemが無くなる> |
(2)PCのネットワークドライブ解除
もともと、ネットワークドライブとして割り当てているわけでは無く、ネットワークにNASサーバーが見えてるだけなので
特段の切断措置は不要
(3)NASサーバーをシャットダウン
(4)HDDをPCに接続し直してNTFSでフォーマット
今後の拡張性を考慮して、ボリューム名をNASHDD1とした
(5)NASサーバーの起動
HDDを接続し直し、NASサーバーを起動しても立ち上がらない!!
/etc/fstabに登録したHDDのUUIDが変わったため、HDDドライブを組み込めず起動途中でストップする
ここはOSのinstallからやり直すが、NTFSフォーマットにしたことで「3.NASサーバー設定」の変更点は次の通り
①exfat-fuseとexfat-utilsのinstallに変えて、ntfs-3gをinstallする
②fstabへの登録は、次のようになる
1 |
UUID="~$sudo blkidで調べたUUID~" /mnt/nashdd ntfs-3g defaults,nofail 0 0 |
(6)Webサーバー、PCにMOUNT、ネットワークドライブ接続
(7)Linux,Windows側からバックアップ動作確認