この記事はWORDIAN Advent Calendarの9日目の記事です。 昨日は、hwajeonさんの生存のための食です。

今自分のデバイスのバックアップ方法についてメモしておこうと思う。

NAS

自宅と実家に双子のNASがある。

このマシンのデータは消えないという前提を置いて、 ここに他全部のマシンのバックアップを置いている。

これはESXi上のFreeBSDで動いていて、 4台の物理ディスクをgeliで暗号化した上で、ZFSでRAIDZしてある。

日次でZFSのスナップショットを取り、 お互いにスナップショットを差分で転送している。 スナップショットは消さずにキープしている。 将来消す事があるかもしれないが、 今のところ容量には余裕がある。 今使ってるのは3Tか4Tのディスクなので、 容量が不足するようなら、 先にディスクをアップグレードする。

HDDレベルの故障の場合、1台の故障であれば、 単にHDDを交換すれば、 そのマシン内だけでRAIDを再構築できる。 そのマシン内の2台の故障や、 マシンごと失われた場合であれば、 双子の相手側からのバックアップから復旧できる。

ディスクが動いてる事はprometheusで監視してる。

過去にハードウエアRAIDを使っていた時は、 RAIDカードの故障にあったことがあるが、 このようなマシン側の問題でも、ZFSが読めるマシンを用意すれば、 そのまま読み出せる。

うっかり、手違いでファイルを消した場合、 前の日のスナップショットから ファイルを取り出して復旧する事ができる。

まちがえて、スナップショットを消してしまった場合、 双子の相手側からスナップショットを取り出す事ができる。 これができる事を保証するために、 スナップショットに対する変更は1日では片方にしかやらない事にしてる。

一番多いトラブルは、HDDが壊れて動かなくなる事だ。 こういう時はさっさとディスクを入れかえて復旧する。 RAIDZの場合は、再構築中もファイルアクセスができる。

古いディスクは全く動作しなくなっている事もあるが、 暗号化してあったので、そのまま穴をあけたりせずに捨てる事にしてる。

次に多いのが、マシンが起動しなくなるトラブルだ。 マシンのSATAポートを全てデータディスクに割り振っているので、 起動ディスクはUSBメモリになっている。 ハードディスクが壊れたので、 交換して起動しようとするとUSBメモリも壊れていて起動しない、という事が複数回あった。 これもさくっと再インストールすればすむ。 システムの設定などはデータディスク側にバックアップしてあるのですぐ復活できる。

過去10年で1度だけ、ZFSが不整合を報告してきた事がある、 その時は、不整合を含むスナップショットを破棄して、 双子の反対側からスナップショットを取り寄せなおして復旧した。

サーバー

ハードウエア故障対策はしてない、 壊れたらダウンタイムがあるが、作りなおす。

/etc

サーバーの設定は基本的には、gitに入れてある。 /etcとか/usr/local/etcの下でgit initして、 変更したらコミットしておく事によって管理してある。

Docker

また、最近はアプリケーションには積極的にDockerを使うようにしている。 例えばDNSサーバーはDocker内で動いていて、 プライベートdocker registryかDockerfileからビルドすれば復旧できる。

アプリケーション

SQLサーバーの中身などは、定期的にrsyncでNASにコピーしてる。

端末マシン

デスクトップとかノートPCとか。

ハードウエア故障対策はしてない、 壊れたら作りなおすし、予備があちこちにある。

ディスクは常にluksで暗号化するようにしてる。

dotfiles

まず、.zshrcとか.vimrc、またはxmonad.hsなどは、 .dotfilesというレポジトリへのシンボリックリンクになっていて、 gitで管理している。 シンボリックリンクを貼ったり、必要なパッケージを入れるのはmitamaeを使ってる。 新しいマシンでは設定用のスクリプトを1つ実行すると、ほぼ全ての設定が完了する。

work

書いてるプログラムや、このblogのデータなどはworkというディレクトリで編集してる。 プログラムの場合、gitで管理してワーキングディレクトリがここに入ってる。

このディレクトリは、unisonというプログラムで同期を取っている。 unisonはファイル単位では3 way mergeを取ってくれるので、消したファイルが復活する事もない。

例えば15インチノートで書きかけでコミットしてないプログラムを、 同期を取った、サブノートで続きを書くとかもできる。

rsync

workはマシンが壊れた時対応としても使っているが、 手で間違ってファイルを消してしまった時対策として、 同じマシン内でrsyncでバックアップを取っている。

今は15分に一回、ホームディレクトリ全体のバックアップを取ってる。

rsyncには--link-destというオプションがあり、 これに前回のバックアップを指定して使うと、 差分だけコピーして残りは前のバージョンへのハードリンクにしてくれる。 使てない時ならほぼディスク容量は使われない。

将来的にはnilfsかbtrfsにしたいが、まだできてない。

携帯

携帯もOSの機能で暗号化してる。

rsync

携帯のストレージがいっぱいになったら、rsyncで吸い出してNASに保管してる。

1日目にNASにコピーして、 一晩おいて、NAS間でコピーされたのを確認してから、 携帯から消すようにしてる。

rsyncサーバーは、adbでrsyncを起動するか、 Wifi経由でSSHelperつかってます。

syncthing

rsyncは、バックアップを取る時につかってるけど、 それとは別に、syncthingをファイル共有用につかってる。

データシートのPDFとか、 携帯にもPCでも参照したい時に入っていて欲しいのは、 syncthingのフォルダに放り込んである。

自宅のWifiに繋がってる時だけ、同期するようにしてる。

こんなもんかな。