Monthly Archives: 12月 2018

[zfs] zfsnap2を使った日々のzfs snapshot(削除編)

Pocket

zfsnap2(以降、zfsnap)をperiodicで自動取得する方法はこちらで触れた。
同期時でも触れた通り、zfsnapには自動削除するperiodic scriptもある。
が、実はそのままでは動かない。
変更内容を本記事で示す。

結論

付属のスクリプトではdestroyするfsの指定がないので補う。
具体的には以下の個所。

 
<         xPREFIXx/zfsnap destroy $OPTIONS -p "hourly- daily- weekly- monthly- reboot- $xPERIODICx_zfsnap_delete_prefixes" $xPERIODICx_zfsnap_delete_fs -r $xPERIODICx_zfsnap_delete_recursive_fs
---
>         xPREFIXx/zfsnap destroy $OPTIONS -p "hourly- daily- weekly- monthly- reboot- $xPERIODICx_zfsnap_delete_prefixes"

 

 

同時に、/etc/periodic.confで$xPERIODICx_zfsnap_delete_fs、$xPERIODICx_zfsnap_delete_recursive_fsの指定も行うこと。

結果

dailyの削除スクリプト例(dailyのみ)

 
#!/bin/sh

# This file is licensed under the BSD-3-Clause license.
# See the AUTHORS and LICENSE files for more information.

# If there is a global system configuration file, suck it in.
if [ -r /etc/defaults/periodic.conf ]; then
    . /etc/defaults/periodic.conf
    source_periodic_confs
fi

# daily_zfsnap_delete_enable   - Delete old snapshots periodicaly (values: YES | NO)
# daily_zfsnap_delete_flags    - <code>zfsnap destroy</code> flags
# daily_zfsnap_delete_verbose  - Verbose output (values: YES | NO)
# daily_zfsnap_delete_prefixes - Space-separated list of prefixes of expired zfsnap snapshots to delete
#                                     'hourly-', 'daily-', 'weekly-', 'monthly-', and 'reboot-' prefixes are hardcoded
# daily_zfsnap_delete_fs                - Space-separated ZFS filesystems to create non-recursive snapshots
# daily_zfsnap_delete_recursive_fs      - Space-separated ZFS filesystems to create recursive snapshots

case &quot;${daily_zfsnap_delete_enable-&quot;NO&quot;}&quot; in
    [Yy][Ee][Ss])
        OPTIONS=&quot;$daily_zfsnap_delete_flags&quot;

        case &quot;${daily_zfsnap_delete_verbose-&quot;NO&quot;}&quot; in
            [Yy][Ee][Ss]) OPTIONS=&quot;$OPTIONS -v&quot; ;;
        esac

        /usr/local/sbin/zfsnap destroy $OPTIONS -p &quot;hourly- daily- weekly- monthly- reboot- $daily_zfsnap_delete_prefixes&quot; $daily_zfsnap_delete_fs -r $daily_zfsnap_delete_recursive_fs
        exit $?
        ;;

    *)
        exit 0
        ;;
esac

# vim: set ts=4 sw=4:

/etc/periodic.confの例(dailyのみ)

# zfsnap_daily
daily_zfsnap_enable="YES"
daily_zfsnap_recursive_fs="vault"
daily_zfsnap_verbose="YES"
daily_zfsnap_flags="-s -S -z"
daily_zfsnap_ttl="1w1d"
daily_zfsnap_delete_enable="YES"
daily_zfsnap_delete_flags="-s -S"
daily_zfsnap_delete_verbose="YES"
daily_zfsnap_delete_recursive_fs="vault"

上手くいけばdaily outputで以下のような内容が通知される。

/sbin/zfs destroy vault/chamber@daily-2018-12-21_04.00.00--1w1d ... DONE
/sbin/zfs destroy vault/itunes@daily-2018-12-21_04.00.00--1w1d ... DONE
/sbin/zfs destroy vault@daily-2018-12-21_04.00.00--1w1d ... DONE
No tags for this post.

[zfs]ディスク交換、zpool容量の拡張

Pocket

HDDがいっぱいになってきたので容量の大きい別のHDDに移した。
zfsなのでmirrorをしつつ入れ替えができる。
その時のメモ。

端的に言えばディスク交換後zpool online -eをすればよい。
以下、経緯。

ディスク追加

2.5TのHDD, ada1上に作られたzpool、vaultがあり、残容量は150Gである。
もともとzfsは残容量が少なくなると格段にパフォーマンスが落ちると言われていて、これはちょっと危険な状態である。

ada1 at ahcich1 bus 0 scbus1 target 0 lun 0
ada1: <WDC WD25EZRX-00MMMB0 80.00A80> ATA8-ACS SATA 3.x device
ada1: Serial Number WD-WMAWZ0230443
ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada1: Command Queueing enabled
ada1: 2384658MB (4883781168 512 byte sectors)
ada1: quirks=0x1<4K>

# zpool status
  pool: vault
 state: ONLINE
  scan: none requested
config:

        NAME           STATE     READ WRITE CKSUM
        vault          ONLINE       0     0     0
          gpt/disk_01  ONLINE       0     0     0

# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
vault          2.05T   150G    88K  /vault
vault/chamber  1017G   150G  1017G  /chamber
vault/itunes   1.06T   150G  1.05T  /itunes

そこで、zpoolにmirrorとして容量の大きいディスクを追加し、その後オリジナルのディスクを外す、という手順。

追加するのは以下のディスク。3T。
2.5Tから3Tじゃ焼け石に水ですがね…。

ada2 at ahcich2 bus 0 scbus2 target 0 lun 0
ada2: <WDC WD30EZRX-00D8PB0 80.00A80> ACS-2 ATA SATA 3.x device
ada2: Serial Number WD-WMC4N0765033
ada2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada2: Command Queueing enabled
ada2: 2861588MB (5860533168 512 byte sectors)
ada2: quirks=0x1<4K>

既存のzpoolにmirrorとしてディスクを追加するには、zpool attachを使う。
zpool attachに続けてzpool名、既存ディスク、追加ディスクの順で指定。
以下の例では、ディスクの指定をada2などのデバイス名ではなくGPT名で行っている。


# zpool attach vault gpt/disk_01 gpt/disk_02

以下のようにzpoolがmirror構成になり、resilveringが始まる。

# zpool status
  pool: vault
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scrub: resilver in progress for 0h0m, 0.01% done, 7h1m to go
config:

        NAME             STATE     READ WRITE CKSUM
        vault            ONLINE       0     0     0
          mirror-0       ONLINE       0     0     0
            gpt/disk_01  ONLINE       0     0     0
            gpt/disk_02  ONLINE       0     0     0

しばらく待つと;

  pool: vault
 state: ONLINE
  scan: resilvered 2.04T in 6h48m with 0 errors on Sun Dec 16 19:15:11 2018
config:

        NAME             STATE     READ WRITE CKSUM
        vault            ONLINE       0     0     0
          mirror-0       ONLINE       0     0     0
            gpt/disk_01  ONLINE       0     0     0
            gpt/disk_02  ONLINE       0     0     0

resilvering終了。

 

旧ディスクの除去

2.5Tと3Tのディスクでmirrorを構成しているので、当然ながら残容量に変化はない。

NAME            USED  AVAIL  REFER  MOUNTPOINT
vault          2.05T   150G    88K  /vault
vault/chamber  1017G   150G  1017G  /chamber
vault/itunes   1.06T   150G  1.05T  /itunes

では旧ディスクを外す。
mirrorからディスクを外すにはdetachを使う。
zpool detachに続けてzpool名、ディスク名を指定。

# zpool detach vault gpt/disk_01
# zpool status
  pool: vault
 state: ONLINE
  scan: resilvered 2.04T in 6h48m with 0 errors on Sun Dec 16 19:15:11 2018
config:

        NAME          STATE     READ WRITE CKSUM
        vault         ONLINE       0     0     0
          gpt/disk_02 ONLINE       0     0     0

errors: No known data errors

ご覧の通りmirror構成が解除される。

容量の拡張

さてこの状態ではまだ残容量が増えない。

NAME            USED  AVAIL  REFER  MOUNTPOINT
vault          2.05T   150G    88K  /vault
vault/chamber  1017G   150G  1017G  /chamber
vault/itunes   1.06T   150G  1.05T  /itunes

ただ物理ディスクは3Tなので、zpoolに「安心して容量を増やしたまえ」と通知する。
通知にはzpool online -eを使う。
zpool onlineは物理ディスクを有効にするコマンドだが、-eを付ければ、使用可能な領域をすべて使うようにできる。
manを以下に引用する。

     zpool online [-e] pool device ...

         Brings the specified physical device online.

         This command is not applicable to spares or cache devices.

         -e      Expand the device to use all available space. If the device
                 is part of a mirror or raidz then all devices must be
                 expanded before the new space will become available to the
                 pool.

ご覧の通り残容量が増えた。
たったの450Gだけど。

# zpool online -e vault gpt/disk_02
$ zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
vault          2.05T   599G    88K  /vault
vault/chamber  1017G   599G  1017G  /chamber
vault/itunes   1.06T   599G  1.05T  /itunes

No tags for this post.

[zfs] zfsnap2を使った日々のzfs snapshot(取得編)

Pocket

zfsnap2(面倒くさいので以降zfsnap)のおかげで気軽にzfs snapshotできるようになった。
あとはこれをcronに仕込んで日々、snapshotを取得、削除するだけである。

zfsnapをpkg、あるいはportsからインストールすると、cron用のシェルスクリプトも付いてくる。
これを加工してperiodic用のディレクトリに放り込めば、あとは全部、zfsnapがやってくれる。

基本はここを見ながら。
https://github.com/zfsnap/zfsnap/wiki/zfSnap-periodic.conf

なお、本稿で扱う周期、契機は日週月次に限る。

全体の流れ

  1. スナップショットの方針を決める
  2. cron用シェルスクリプトを日・週・月ごとのperiodicディレクトリにコピーし、ファイル名を変更する
  3. スクリプトの内容を修正する
  4. /etc/periodic.confにバックアップ方針に沿った設定を書き加える

では早速。

スナップショット方針を決める

ここでは簡単に、あるzpool丸ごとに対して;

  • 毎日のスナップショットは1週間と1日、保存する
  • 毎週のスナップショットは1か月と1日、保存する
  • 毎月のスナップショットは1年と1週間、保存する

とする

[補足]periodicから実行されるときのsnapname

zfsnap付属のスクリプトを使うと、snapnameの頭にdaily, weekly, monthlyと付く。
もちろん変更可能だが、本稿ではそのまま使う。

zfsnapのcron用スクリプトはどこにある

cron用スクリプトは、zfsnapインストール時にshareにコピーされる。
例えば以下のようにして探す

$ pkg list|grep zfsnap
/usr/local/etc/bash_completion.d/zfsnap.sh
/usr/local/man/man8/zfsnap.8.gz
/usr/local/sbin/zfsnap
/usr/local/share/doc/zfsnap/AUTHORS
/usr/local/share/doc/zfsnap/NEWS
/usr/local/share/doc/zfsnap/PORTABILITY
/usr/local/share/doc/zfsnap/README.md
/usr/local/share/examples/zfsnap/completion/zfsnap-completion.bash
/usr/local/share/examples/zfsnap/completion/zfsnap-completion.tcsh
/usr/local/share/examples/zfsnap/completion/zfsnap-completion.zsh
/usr/local/share/examples/zfsnap/periodic/xPERIODICx_zfsnap.sh
/usr/local/share/examples/zfsnap/periodic/xPERIODICx_zfsnap_delete.sh
/usr/local/share/licenses/zfsnap2-2.0.0.b3/BSD3CLAUSE
/usr/local/share/licenses/zfsnap2-2.0.0.b3/LICENSE
/usr/local/share/licenses/zfsnap2-2.0.0.b3/catalog.mk
/usr/local/share/zfsnap/commands/destroy.sh
/usr/local/share/zfsnap/commands/recurseback.sh
/usr/local/share/zfsnap/commands/snapshot.sh
/usr/local/share/zfsnap/core.sh
/usr/local/share/zsh/site-functions/_zfsnap

上記のうち以下が狙いのスクリプトである。
スナップショット取得用、削除用の2種類。
なお削除用はそのままでは期待する動作にならないので別記事で扱う。
/usr/local/share/examples/zfsnap/periodic/xPERIODICx_zfsnap.sh
/usr/local/share/examples/zfsnap/periodic/xPERIODICx_zfsnap_delete.sh

スクリプトのコピーとファイル名の変更

さてこれを、日・週・月のperiodicディレクトリにコピーし設定していくが、まずは日次で試す。
日ごとのperiodicディレクトリは/usr/local/etc/periodic/dailyである。
ここにコピーし、ファイル名を変える。
ファイル名のxPERIODICxを、日次・週次・月次、どの周期用かに合わせて変える。
具体的にはそれぞれdaily, weekly, monthlyに。
以下の例では日次のスクリプトなので、dailyに変えている。
prefixの番号は好きなようにしたまえ。


$ cd /usr/local/etc/periodic/daily
$ sudo cp /usr/local/share/examples/zfsnap/periodic/* .
$ sudo mv ./xPERIODICx_zfsnap.sh ./500.daily_zfsnap.sh
$ sudo mv ./xPERIODICx_zfsnap_delete.sh  ./500.daily_zfsnap_delete.sh
$ ls
411.pkg-backup                  500.daily_zfsnap_delete.sh      998.ntpdate
490.status-pkg-changes          500.daily_zfsnap.sh             smart

スクリプトの修正

スクリプト(取得用)の内容は以下の通りである。
変える場所はxPERIODICxとxPREFIXxである。
xPERIODICxは周期に合わせて、xPREFIXxはzfsnapの置いてあるパス、つまり/usr/local/sbin/zfsnapに。


#!/bin/sh

# This file is licensed under the BSD-3-Clause license.
# See the AUTHORS and LICENSE files for more information.

# If there is a global system configuration file, suck it in.
if [ -r /etc/defaults/periodic.conf ]; then
    . /etc/defaults/periodic.conf
    source_periodic_confs
fi

# xPERIODICx_zfsnap_enable          - Enable xPERIODICx snapshots (values: YES | NO)
# xPERIODICx_zfsnap_flags           - <code>zfsnap snapshot</code> flags
# xPERIODICx_zfsnap_fs              - Space-separated ZFS filesystems to create non-recursive snapshots
# xPERIODICx_zfsnap_recursive_fs    - Space-separated ZFS filesystems to create recursive snapshots
# xPERIODICx_zfsnap_ttl             - Explicit TTL value
# xPERIODICx_zfsnap_verbose         - Verbose output (values: YES | NO)
# xPERIODICx_zfsnap_enable_prefix   - Create snapshots with prefix (values: YES | NO) (Default = YES)
# xPERIODICx_zfsnap_prefix          - set prefix for snapshots (Default = xPERIODICx)

case &quot;${xPERIODICx_zfsnap_enable-&quot;NO&quot;}&quot; in
    [Yy][Ee][Ss])
        OPTIONS=&quot;$xPERIODICx_zfsnap_flags&quot;

        case &quot;${xPERIODICx_zfsnap_verbose-&quot;NO&quot;}&quot; in
            [Yy][Ee][Ss]) OPTIONS=&quot;$OPTIONS -v&quot; ;;
        esac

        case &quot;${xPERIODICx_zfsnap_enable_prefix-&quot;YES&quot;}&quot; in
            [Yy][Ee][Ss]) OPTIONS=&quot;$OPTIONS -p ${xPERIODICx_zfsnap_prefix:-&quot;xPERIODICx-&quot;}&quot; ;;
        esac

        case 'xPERIODICx' in
            'hourly')
                default_ttl='3d'
                ;;
            'daily'|'reboot')
                default_ttl='1w'
                ;;
            'weekly')
                default_ttl='1m'
                ;;
            'monthly')
                default_ttl='6m'
                ;;
            *)
                printf '%s\n' &quot;ERR: Unexpected error&quot; &gt;&amp;2
                exit 1
                ;;
        esac

        xPREFIXx/zfsnap snapshot $OPTIONS -a ${xPERIODICx_zfsnap_ttl:-&quot;$default_ttl&quot;} $xPERIODICx_zfsnap_fs -r $xPERIODICx_zfsnap_recursive_fs
        exit $?
        ;;

    *)
        exit 0
        ;;
esac

# vim: set ts=4 sw=4:

vimなら:%s/xPERIODICx/daily/g などとコマンド叩いて一括置換する。
以下が修正後。


#!/bin/sh

# This file is licensed under the BSD-3-Clause license.
# See the AUTHORS and LICENSE files for more information.

# If there is a global system configuration file, suck it in.
if [ -r /etc/defaults/periodic.conf ]; then
    . /etc/defaults/periodic.conf
    source_periodic_confs
fi

# daily_zfsnap_enable          - Enable daily snapshots (values: YES | NO)
# daily_zfsnap_flags           - <code>zfsnap snapshot</code> flags
# daily_zfsnap_fs              - Space-separated ZFS filesystems to create non-recursive snapshots
# daily_zfsnap_recursive_fs    - Space-separated ZFS filesystems to create recursive snapshots
# daily_zfsnap_ttl             - Explicit TTL value
# daily_zfsnap_verbose         - Verbose output (values: YES | NO)
# daily_zfsnap_enable_prefix   - Create snapshots with prefix (values: YES | NO) (Default = YES)
# daily_zfsnap_prefix          - set prefix for snapshots (Default = daily)

case &quot;${daily_zfsnap_enable-&quot;NO&quot;}&quot; in
    [Yy][Ee][Ss])
        OPTIONS=&quot;$daily_zfsnap_flags&quot;

        case &quot;${daily_zfsnap_verbose-&quot;NO&quot;}&quot; in
            [Yy][Ee][Ss]) OPTIONS=&quot;$OPTIONS -v&quot; ;;
        esac

        case &quot;${daily_zfsnap_enable_prefix-&quot;YES&quot;}&quot; in
            [Yy][Ee][Ss]) OPTIONS=&quot;$OPTIONS -p ${daily_zfsnap_prefix:-&quot;daily-&quot;}&quot; ;;
        esac

        case 'daily' in
            'hourly')
                default_ttl='3d'
                ;;
            'daily'|'reboot')
                default_ttl='1w'
                ;;
            'weekly')
                default_ttl='1m'
                ;;
            'monthly')
                default_ttl='6m'
                ;;
            *)
                printf '%s\n' &quot;ERR: Unexpected error&quot; &gt;&amp;2
                exit 1
                ;;
        esac

        /usr/local/sbin/zfsnap snapshot $OPTIONS -a ${daily_zfsnap_ttl:-&quot;$default_ttl&quot;} $daily_zfsnap_fs
 -r $daily_zfsnap_recursive_fs
        exit $?
        ;;

    *)
        exit 0
        ;;
esac

# vim: set ts=4 sw=4:

削除用も同じようにしたら、periodic.confに指示を書き入れる。

/etc/periodic.confにおけるzfsnap設定の書式

/etc/periodic.confは無ければ作る。

zfsnapのperiodic向け書式は以下の通り。
https://github.com/zfsnap/zfsnap/wiki/zfSnap-periodic.conf

以下、日次のものとして記す。
週、月次の場合はdailyをそれぞれweekly, monthlyに変えればよい。

snapshot取得の有効化

daily_zfsnap_enable
YES/NOで指定

共通オプション(generic option)

daily_zfsnap_flags
例えばscrub, resilver中は避け、日付シリアルの秒を切り捨て、というような設定をここで行う。。
-v, -dを指定しないこと。
初めて作るときにはテスト実行オプションを付けて試験する。

zfs, zpoolの指定

daily_zfsnap_fs
daily_zfsnap_recursive_fs
recursiveとなっているのは、当然ながら子孫も含めて再帰的に取得される
複数あるなら、スペースを空けて列挙

冗長アウトプット指定

daily_zfsnap_verbose
YES/NOで指定

保存期間指定

daily_zfsnap_ttl
指定がなければ日次は1週間、週次は1か月、月次は6か月になる。

スナップショット削除有効化

daily_zfsnap_delete_enable
YES/NOで指定

periodic.conf例

ということで、periodic.confに追加したのは以下の通り。


# zfsnap_daily
daily_zfsnap_enable="YES"
daily_zfsnap_recursive_fs="vault"
daily_zfsnap_verbose="YES"
daily_zfsnap_delete_enable="YES"
daily_zfsnap_flags="-n -s -S -z"
daily_zfsnap_ttl="1w1d"

試験

zfsnap_flagsに-nを付けた状態で試験。


$ sudo /usr/local/etc/periodic/daily/500.daily_zfsnap.sh
/sbin/zfs snapshot  vault/chamber@daily-2018-12-03_02.14.00--1w1d
/sbin/zfs snapshot  vault/itunes@daily-2018-12-03_02.14.00--1w1d

大丈夫そうなので-nを外す。

最終的なperiodic.confの結果

週次、月次で同じようにperiodic用のスクリプトを作成する。


$ pwd
/usr/local/etc/periodic
$ find ./ -name '*zfsnap*'
./weekly/999.weekly_zfsnap.sh
./weekly/999.weekly_zfsnap_delete.sh
./daily/500.daily_zfsnap.sh
./daily/500.daily_zfsnap_delete.sh
./monthly/910.monthly_zfsnap.sh
./monthly/910.monthly_zfsnap_delete.sh

最終的なperiodic.confの結果は以下の通り。


# zfsnap_weekly
weekly_zfsnap_enable="YES"
weekly_zfsnap_recursive_fs="vault"
weekly_zfsnap_verbose="YES"
weekly_zfsnap_delete_enable="YES"
weekly_zfsnap_flags="-s -S -z"
weekly_zfsnap_ttl="1m1d"
# zfsnap_daily
daily_zfsnap_enable="YES"
daily_zfsnap_recursive_fs="vault"
daily_zfsnap_verbose="YES"
daily_zfsnap_delete_enable="YES"
daily_zfsnap_flags="-s -S -z"
daily_zfsnap_ttl="1w1d"
# zfsnap_monthly
monthly_zfsnap_enable="YES"
monthly_zfsnap_recursive_fs="vault"
monthly_zfsnap_verbose="YES"
monthly_zfsnap_delete_enable="YES"
monthly_zfsnap_flags="-s -S -z"
monthly_zfsnap_ttl="1y1d"

翌日以降、root宛には以下のようなメールが届くので、結果はここで確認する。

/sbin/zfs snapshot -r vault@daily-2018-12-02_04.47.0<wbr />0--1w1d ... DONE
No tags for this post.

[zfs][zpool] らくらくスナップショットzfsnap2

Pocket

zfsは本当に本当に便利で助かるのだが、それでも面倒なことはある。
私にとって面倒なのは、スナップショット作成とスナップショットの差分転送である。

スナップショットの簡素化について。
スナップショットを作成する際には、ファイルシステムやボリュームに続けてスナップショットの名前、スナップネームを指定する必要がある。
スナップネームはスナップショットを特定するために必要なものなので文句を言う筋合いはないのだが、いちいち名前を付けるのが面倒なんである。日付でもなんでも自動的に付けてほしい。

なんとか改善したくていろいろ調べてみた。

スナップショット取得補助ツール

スナップショット関連ではzfstools, zfsnap2, zapの三つを調べた。
結論から言うと、zfsnap2を選択した。

zfstools

https://github.com/bdrewery/zfstools
https://www.freshports.org/sysutils/zfstools/
よさそうだけどruby依存なのでその一点で対象外に。
このツールのためだけにrubyを入れますか、という話で。
なるべく依存の少ないツールがよい。

zap

https://www.freshports.org/sysutils/zap
https://github.com/Jehops/zap
よさそうだけど、zfsに独自のプロパティ(zap:)を設定する必要があるっぽい。
独自プロパティの設定が、zfsとして許容されている作法であっても、対象のファイルシステムに何らかの手を加えるのは躊躇する

zfsnap2

https://www.freshports.org/sysutils/zfsnap2
https://github.com/zfsnap/zfsnap
単純なシェルスクリプト。
よさそう。

zfsnap2 お手軽snapshot

まず、zfsnap2は、取得すると日付シリアルをsnapnameに付けてくれる。
例えば。

 
vault/chamber@2018-11-11_09.48.00--1y
 

ご覧の通り2018/11/11 09:48:00と日付をsnapnameに付ける
なお、末尾に1yと書いてあるがこれは1年という意味である。
これは何かというと(次項につづく)

zfsnap2 snapshot削除の仕組みとTTL

snapshotは取得するだけでなく、消す方の面倒を見ることも重要。
zfsnap2は、取得したタイムスタンプとTTL(Time To Live)をsnapnameに含めておくのがアイデア(他みも同じようなツールあるかもしれないけど)。
先ほどの例でいえば、末尾の1yがそれ。1yだから1 year、1年ですな。

vault/chamber@2018-11-11_09.48.00--1y

上記の通り、取得日付、保存期間をsnapname自体に持たせるので、ツール側では状態を記憶しておく必要がない。
削除を指示されたら、zfsnap2はその都度、snapnameだけを見て判断・処理をするということ。
何より人間もsnapnameから保存期限を判断できる。これはよい。

とりあえず使う

管理者権限でzfsnap snapshotに続けてzfs/zpoolを指定するだけ。
日付も付けてくれる。

# zfsnap snapshot zroot/var/tmp
$ zfs list -t snapshot|grep 'zroot/var/tmp'
zroot/var/tmp@20181120                   56K      -    88K  -
zroot/var/tmp@2018-12-01_22.19.13--1m      0      -    88K  -

zfsnap書式概要

詳細はman等するとして、概要を示す。
書式は以下の通り。

zfsnap コマンド <共通オプション> <個別オプション> zpool/zfs

zfsnapのコマンド

コマンドにはsnapshot, destroy, recursebackの三つがある。
それらに続けてzpool, zfsを指定する。こちらの指定は複数でもよい。
共通オプション(generic option)は、その名の通り、共通的なオプション。
個別オプションはzpool, zfsごとのオプションである。

コマンドのsnapshot, destroyは当然ながらそれぞれsnapshot作成、削除。
recursebackは、zfs rollbackの拡張で、rollbackの際、指定のdataset配下すべてをrollbackするもの。
本稿では扱わない。

共通オプション(generic option)

主なものだけ示す

-s  : resilver中は作業しない
-S : scrub中は作業しない
-z : 日付シリアルの秒切り捨て(18:06:15を18:06:00にする)
-n : dry run。テスト実行。ファイルシステムに変更を加えない。
-v : 冗長output

-s, -Sは常時付けておいたほうがいいかな。

個別オプション

個別オプションなので、これに続けて指定されたzpool/zfsにのみ効果がある。
主なものだけ示す

-a : TTL。指定がなければ1m = 1か月
-r : 再帰オプション。再帰的にsnapshotを取得
-R : 非再帰オプション。再帰的なsnapshotを取得「しない」

TTLオプション

以下のうち、必要なものだけをズラズラ書けばよい

y : 年(365日)
m : 月(30日)
w : 週(7日)
d : 日
h : 時
M : 分
s : 秒

1週間と1日なら-a 1w1d。
2か月なら-a 2m。

実行例

以上を踏まえて;
resilver, scrub中は実行せず、日付シリアルの秒切り捨て、冗長アウトプットでsnapshotをテスト実行。
対象zfsその1はzroot/usrで、再帰的に取得し、TTLは1週間と1日。その2はzroot/ROOTで、再帰的に取得「せず」、TTLは1分。
という実行例。

# zfsnap snapshot -sSvzn -a1w1d -r zroot/usr -R -a1M zroot/ROOT
/sbin/zfs snapshot -r zroot/usr@2018-12-01_22.33.00--1w1d
/sbin/zfs snapshot  zroot/ROOT@2018-12-01_22.33.00--1M

よさそうなのでテスト実行オプションを省いて本番実行すると;

# zfsnap snapshot -sSvz -a1w1d -r zroot/usr -R -a1M zroot/ROOT
/sbin/zfs snapshot -r zroot/usr@2018-12-01_22.34.00--1w1d ... DONE
/sbin/zfs snapshot  zroot/ROOT@2018-12-01_22.34.00--1M ... DONE

zfs listで結果を確認。zroot/usrにのみ配下にもスナップショットが出来ている。

$ zfs list -t snapshot | grep '2018-12-01'
zroot/ROOT@2018-12-01_22.34.00--1M             0      -    88K  -
zroot/usr@2018-12-01_22.34.00--1w1d            0      -    88K  -
zroot/usr/home@2018-12-01_22.34.00--1w1d       0      -  5.97M  -
zroot/usr/ports@2018-12-01_22.34.00--1w1d      0      -    88K  -
zroot/usr/src@2018-12-01_22.34.00--1w1d        0      -    88K  -

では削除のほうも。
zroot/ROOT、zroot/usr配下のTTL切れsnapshotを削除
ただしzroot/ROOTは非再帰的、zroot/usrは再帰的に。
テスト実行。

# zfsnap destroy -sSvn -R zroot/ROOT -r zroot/usr
/sbin/zfs destroy zroot/ROOT@2018-12-01_22.34.00--1M

期限切れはzroot/ROOT@2018-12-01_22.34.00–1Mのみ。
じゃ、それで本番実行

# zfsnap destroy -sSv -R zroot/ROOT -r zroot/usr
/sbin/zfs destroy zroot/ROOT@2018-12-01_22.34.00--1M ... DONE

以上。

No tags for this post.