Pi ZERO ファイルサーバー 3.5inchHDDを増設する

最近のHDDは大容量化が進んでいますが同時にそのバックアップも重要になると思います。
使用年数がそれほど経っていなくても決して油断はできません。1TBのディスクのヘッドが飛んでしまった場合などは10TB以上の精神的、経済的ショックそして時間のロスがやってきます。
HDDのケースを開腹しなければいけない事態となれば事実上素人にはお手上げと言っていいと思います。
バックアップはローカルに保存するか外部のクラウドと契約するかの選択になるかと思いますがどちらも一長一短がありますが当サイトとしてはコスト的に且つ特に制限のないローカルに保存することにします。
当サイトもマメにバックアップを取るということができない性分なのでディスクまるごとクローンを取る方向で行ってみたいと思います。

前回試した1TB3.5inchHDDはPi ZEROで問題なく稼働していることからこれに設定を加えていきます。

なんとか電源からの引き込みは1本で済ませられないかUSB Bコネクタと標準ケーブルで接続してみたのですがやはり容量不足で2本仕様になりました。(電源はATX電源)PiにはGPIO端子を介して電源供給
マイクロUSBケーブルもある程度太いものが必要です。電力不足の場合ORICOのLEDはスローな点滅をします。

ORICOケースにはゴム足を貼り付けて熱対策をしています。

マウント

通常の読み書きには今までどおり2.5inchHDDを使用してバックアップに3.5inchHDDを使用するものとします。
/etc/fstabからマウントした場合RaspbianはHDDを認識できないと起動できません。障害時対応のためfstabのoptionにnoautoを指定して、マウントは/etc/rc.localから実行してみました。(マウント位置は適宜に)
2.5inchHDD

# blkid /dev/sda1
/dev/sda1: UUID="1d402e29-277b-47a5-90b2-ff3b02e853d6" TYPE="ext4" PARTUUID="c0b17145-01"

/etc/fstab
PARTUUID=c0b17145-01 /home/hda   ext4 defaults,noauto,noatime    0 0

/etc/rc.local
-------------
fi
/bin/mount /home/hda 追記
exit 0

ここで2.5inchHDDを接続した状態で再起動、正常にマウントできることを確認

3.5inchHDD

3.5inchHDDも同様にrc.localからマウントできるはずですが今回はautofsを導入してみました。
参考 Autofs – ArchWiki

# apt install autofs

/etcには以下のファイルが新たに作成されます。
/etc/autofs.conf
/etc/auto.master
/etc/auto.misc
/etc/auto.net
/etc/auto.smb
マウント位置は/home/hd3.5に設定してみました。

# mkdir /home/hd3.5

新たに/etc/auto.hd3.5を作成

# blkid /dev/sdb1
/dev/sdb1: UUID="3c1a930c-6175-4ef7-be64-31d3771e86f6" TYPE="ext4" PARTUUID="d4db4d02-01"

/etc/auto.hd3.5
/home/hd3.5 -fstype=ext4,defaults   :PARTUUID=d4db4d02-01

/etc/auto.masterを編集

/etc/auto.master
#
/- /etc/auto.hd3.5  --timeout=60 追記
+auto.master
autofs 再起動
# systemctl restart autofs

/etc/exportsの編集(クライアントからマウント)

/etc/exports
/home/hda   192.168.0.0/24(rw,async,crossmnt,no_root_squash,no_subtree_check)
/home/hd3.5 192.168.0.0/24(rw,async,crossmnt,no_root_squash,no_subtree_check)
nfs-server 再起動
# systemctl restart nfs-server rpcbind

3.5inchHDDを接続してオートマウントできることを確認します。
ssh接続して$ dfすると3.5inchHDDはまだマウントされていないはずです。
$ ls -la /home/hd3.5を実行するとマウントを開始、ファイルが見えてきます。使用していなければtimeoutで指定した時間後マウントは解除されます。

#メインの2.5inchHDDもオートマウントは可能ですがSMBの設定が面倒なのでやめておきます。

運用

どんなポリシーでバックアップを実行するかはそれぞれですが、今回の2.5inchHDDにはhda1からhda4のディレクトリを作成しているものとします。
hda1,hda2はよく出し入れするファイルや消失しては困るファイル、hda3,hda4は音楽ファイルやOS関連のバックアップなど割と大容量のしかもそれほど緊急性の高くないファイルがあるものとします。
以上からhda1,hda2は書き込んだらlsyncdで随時バックアップ、hda3,hda4はrsyncで深夜にバックアップを実行することとします。

lsyncdのインストール、設定

# apt install lsyncd

# dpkg -l | grep lsyncd
ii  lsyncd    2.1.6-1   armhf   daemon to synchronize local directories using rsync

/etcにディレクトリlsyncdを作成
設定ファイルの雛形が/usr/share/doc/lsyncd/examples以下にあります。その中からlrsync.luaをlsyncd.conf.luaのファイル名で作成したディレクトリにコピー編集します。(書式が古いようです)

# mkdir /etc/lsyncd
# cp /usr/share/doc/lsyncd/examples/lrsync.lua /etc/lsyncd/lsyncd.conf.lua

/etc/lsyncd/lsyncd.conf.lua
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings {
    logfile = "/var/log/lsyncd.log",
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1,
}

sync {
    default.rsync,
    source = "/home/hda/hda1",
    target = "/home/hd3.5/hda1",
--    delete = false,
    delay  = 60,
    rsync = {
            archive = true
        }
}

sync {
    default.rsync,
    source = "/home/hda/hda2",
    target = "/home/hd3.5/hda2",
--    delete = false,
    delay  = 60,
    rsync = {
            archive = true
        }
}

delete = falseをコメントにしています。デフォルトはtrueなのでsourceのファイルを削除した場合targetのファイルも削除されます。delete = falseを有効にすると削除しなくなります。
delayは60秒(default 10)を設定、万一誤って必要なディレクトリを削除した場合バックアップ先のディレクトリも削除してしまいます。60秒あればサーバーにログイン# systemctl stop lsyncdで同期を止めることができます。実際には設定した値+5秒で書込を開始しているようです。
その他のオプションはここで確認できます。 Config Layer 4: Default Config

lsyncd 再起動
# systemctl restart lsyncd

監視するファイル数の設定
大量のファイルがある場合OSの制限に引っ掛かってしまうようです。

$ cat /proc/sys/fs/inotify/max_user_watches
8192

/etc/sysctl.conf
fs.inotify.max_user_watches = 100000 末尾に追加

# sysctl -p
fs.inotify.max_user_watches = 100000

rsyncの設定
userのディレクトリにディレクトリbinを作成、そこにスクリプトを置くことにします。

$ mkdir ~/bin

/home/"user"/bin/backup.sh
#!/bin/sh
sudo /usr/bin/rsync -a --delete /home/hda/hda3/ /home/hd3.5/hda3/
sudo /usr/bin/rsync -a --delete /home/hda/hda4/ /home/hd3.5/hda4/

$ chmod 755 backup.sh

cronから実行

$ crontab -e
# m h  dom mon dow   command
0 2 * * * /home/"user"/bin/rsync.sh 2時に実行

lsyncdもrsyncを利用しています。初回はファイル数、容量が多いとかなりの時間を要します。
2回目以降は差し分けファイルのみの更新になります。コマンドラインからテストディレクトリ、ファイルで十分テストした上で実行するのがいいと思います。

障害対応
HDDも消耗品なのでいつかは壊れます。突然来ることもあります。容量が不足したら必然的に新しいものに交換するのですが間に合っているうちはできるだけ長く使いたいと思っています。(Poor)
と言う訳でいざ障害を考慮してみたいと思います。
上記の設定でPiはUSB-HDDを接続していなくても起動できるはずです。(確認済)
HDDの取り外し(umount)
クライアント側でファイルを使用していないことを確認して -l option でumountします。

# umount -l /home/hda
# umount -l /home/hd3.5

dfで確認、HDDのUSBコネクタを外します。
Pi ZEROをreboot
正常に起動、sshで接続できればPi ZEROは取り敢えずは正常ですね。
次にメインの2.5inchHDDが壊れたという想定でバックアップの3.5inchHDDをメインにします。
2.5inchHDDをコメントにして3.5inchHDDのPARTUUIDを記載します。

/etc/fstab
PARTUUID=c0b17145-01  /home/hda     ext4 defaults,noauto,noatime    0 0
#PARTUUID=d4db4d02-01  /home/hda     ext4 defaults,noauto,noatime    0 0

nfs-server再起動 (3.5inchHDD接続)

# systemctl restart nfs-server rpcbind
# mount /home/hda

クライアント(Pi3)
Pi3でnfs mountで使用していればマウントは外れていますが同様にumountしてから再度mountします。
umountしないと mount.nfs: Stale file handle こんなエラーになります。

# umount -l /home/hda
# mount /home/hda

正常にマウントできました。
あとはPi ZEROサーバー側で不要になったサービスを止めればOKですね。

ATX電源は容量その他問題が無ければ1個にまとめる予定でいます。