家のサーバーを NAS にバックアップ ― AD の毎日の控え、日付ごとの rsync、動かしたままの仮想マシンの写し
家のサーバー(AlmaLinux)と、その中の仮想マシン2台(AD の vm2、AI 用の vm1)のバックアップを、NAS に自動で取るようにしました。それまで、DB の控えはサーバーの中にあるだけで、AD のバックアップは1つもありませんでした。サーバーごと壊れると全部失うので、別の機械(NAS)に置きます。NAS は空きが 46TB あるので、容量は気にしていません。

1. AD(Samba)の毎日の控え
vm2 は Ubuntu の Samba で AD を動かしています。Samba には公式のバックアップの機能があり、offline の方式なら AD を動かしたまま取れます。
# vm2 の /etc/cron.daily/samba-ad-backup
d=/var/backups/samba
samba-tool domain backup offline --targetdir="$d" >/var/log/samba-ad-backup.log 2>&1 \
|| logger -t samba-ad-backup "失敗"
find "$d" -name "samba-backup-*.tar.bz2" -mtime +7 -delete
1回は約2秒、1.8MB でした。家のサーバーには、vm2 から受け取る専用の鍵を作り、vm2 側の authorized_keys で「いちばん新しいバックアップを流すだけ」のコマンドに固定しました(restrict,from="家のサーバー",command="…")。この鍵では、ほかのコマンドを送ってもバックアップが返るだけです。家のサーバーは毎朝受け取り、壊れていないか(bzip2 -t)確かめてから、曜日ごとに7世代残します。
2. 家のサーバーの毎日の控え(NAS へ)
- NAS に専用の共有フォルダーと専用のユーザーを作り、NFS で家のサーバーだけに読み書きを許可(すべてのユーザーを専用のユーザーとして扱う設定)
- 毎朝、DB の控えが作られた後に、そのときだけ NFS でつなぎ、rsync で写して、終わったら切る。つなぎっぱなしにすると、NAS の再起動で固まることがあったため
- 対象:
/etc・/root・/home・/var/www・/usr/local・cron・監視(Cacti・Uptime Kuma)のデータ・DB の控え・集めた記録・仮想マシンの設定(XML)。1回目は 7.3GB・約1分 - 日付ごとのフォルダーに14日分。
--link-destで、変わっていないファイルは前の日と共有するので、容量はほとんど増えない
rsync -rltpD --chmod=Du+rwx,Fu+rw --delete --relative --numeric-ids \
--link-dest="$前の日のフォルダー" $SRC "$NAS/$今日.partial/" \
&& mv "$NAS/$今日.partial" "$NAS/$今日"
NAS の側では、ファイルの持ち主が全部、専用のユーザーに置き換わります。そこで、持ち主と権限の一覧を getfacl -R で書き出し、一緒に控えます。戻すときは setfacl --restore で元に戻せます。
3. 仮想マシンのディスクの毎週の写し
動いている仮想マシンのディスクをそのままコピーすると、途中で中身が変わって、壊れた写しになることがあります。libvirt の virsh backup-begin を使うと、動かしたまま、ある一瞬の時点の写しを作れます。
<domainbackup><disks>
<disk name='vda' type='file'><target file='/var/lib/libvirt/backup/vm1-vda-日付.qcow2'/><driver type='qcow2'/></disk>
<disk name='sda' backup='no'/>
</disks></domainbackup>
- 終わるまで
virsh domjobinfoで待ち、家のサーバーに写しを作ってから NAS に送る。4週分を残す - ゲストエージェント(仮想マシンの中の手伝いのプログラム)が無いので、「電源を切ったときと同じ状態」の写し。AD は毎日の控えもあるので、こちらは丸ごと戻すときの予備
- 1回目は vm2 4.6GB・vm1 16GB
4. つまずき
- 写した先に書けない:元の権限のまま写したため、NAS の側に「持ち主も入れないフォルダー」ができ、その中に書けなかった → 写すときに
--chmod=Du+rwx,Fu+rwで、持ち主が必ず読み書きできるようにした - 大きいファイルで入出力エラー:NFS を「応答が遅いと諦める」設定(soft)で、待ち時間が短すぎた → 待ち時間を 60秒×10回に延ばした
- 読み取り専用のつなぎっぱなし:確かめるために読み取り専用でつないだまま切り忘れ、次のバックアップがそこに書こうとして失敗した → スクリプトの初めで、いったん切ってから書き込みでつなぎ直すようにした
