zfsのスナップショット管理はsanoidで良いよね!

Table of Content

広告

はじめに

zfsのスナップショットは、シェルスクリプトを組めば簡単に取ることができます。しかし、取得したスナップショットをある期間で削除するのはシェルスクリプトでは中々難しいです。自分でpythonなりで作っても良いんですが出来合いで優れたものがあれば、それを使うのが一番かなと…私はssanoidチョイスしました。スナップショットの定義が/etc/sanoid/sanoid.confで一元管理できるのが良いですね。ただ、タイムゾーンはGMTでないと動かないので、そこが欠点ですが運用上あまり問題にならないかなぁと思います。

前提

Ubuntu 20.04 LTSを前提としています。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal

sanoidのインストール

sanoidはubuntu 20.04 LTSのパケージとして提供されています。
以下のコマンドでsanoidをインストールします。

sudo apt install --yes sanoid
sudo systemctl enable --now sanoid.timer

sanoidの定義

sanoidの定義を行うために/etc/sanoidディレクトリを作成し/etc/sanoid/sanoid.confを編集します。

sudo mkdir /etc/sanoid
sudo vi /etc/sanoid/sanoid.conf

/etc/sanoid/sanoid.confはini形式で作成します。私の/etc/sanoid/sanoid.confを晒して定義例を説明します。

[zpool0/home]
    use_template = daily
    hourly       = 24
    recursive    = yes
    process_children_only = yes

[zpool0/machines]
    use_template = daily

[zpool0/images]
    use_template = daily

[rpool/usr/local]
    use_template = daily

[template_daily]
    hourly      = 0
    daily       = 31
    monthly     = 12
    yearly      = 10
    autosnap    = yes
    autoprune   = yes

セクションでスナップショットを取るzfsのデータセットを指定します。hory,daily,monthry,yearyのキーで保存するスナップショットの数を指定します。template_dailyセクションは各セクションで共通化する定義を指定します。共通化したセクションは各セクションでuse_templateキーで指定します。

syncoidでスナップショットをsend/recvする。

sanoidをチョイスした理由は、sanoid付属のsyncoidでスナップショットを別ボリュームにsend/recvできるのも理由の一つです。
同じマシンで違うプールにスナップショットをsend/recvするには以下のコマンドで出来てしまいます。

sudo /usr/sbin/syncoid --no-sync-snap zpool0/home zpool1/home

もちろん他のマシンのプールにスナップショットをsend/recvできます。

--no-sync-snapは同記事に新しいスナップショットを作らない設定です。なお、syncoidはバックアップ先のボリュームは自動で作成されます。既に存在する場合はエラーになりますので、バックアップ先のボリュームは作らないようにします。
これをcronなりsystemd.timerに設定しておけばzfsのバックアップ運用は十分かな?と思います。

最後に

今までシェルスクリプトでスナップショットとsend/recvを行ってきましたが、sanoidを入れることによって定義ファイルの指定だけでスナップショットの削除までやってくれるようになりました。運用開始して1ヶ月以上立ちましたが、特に問題は発生していません。
zfsのスナップショットの管理にsanoidを使ってみては如何でしょうか。