最後の[n] ZFSスナップショットを除くすべてを削除する方法は?


24

現在、毎晩ZFSベースのNASのスナップショットを撮っています。これにより、数回、お尻が救われました。ただし、スナップショットの作成は(cronから)自動で行われますが、古いスナップショットの削除は依然として手動のタスクです。明らかに、バスに衝突したり、手動タスクが実行されなかったりすると、NASのディスク容量が不足するリスクがあります。

ZFSシステムに保存されているスナップショットの数を管理するために使用する良い方法/スクリプトはありますか?理想的には、特定のZFSファイルシステムのすべてのスナップショットを反復処理し、そのファイルシステムの最後のn個を除くすべてのスナップショットを削除するスクリプトが必要です。

たとえば、2つのファイルシステムがあります。1つはを呼び出しtank、もう1つはを呼び出しsastankます。スナップショットには、作成された日付の名前が付けられます。sastank@AutoD-2011-12-13したがって、簡単なsortコマンドでスナップショットを順番にリストする必要があります。過去2週間分の毎日のスナップショットをオンtankにしたいのですが、最後の2日間分のスナップショットのみをオンにしsastankます。

回答:


35

このようなものをもう少し簡単に見つけることができます

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • スナップショットのリスト(名前のみ)を出力します zfs list -t snaphot -o name
  • 試合というものだけを維持するためのフィルタtank@Auto付きgrep ^tank@Auto
  • リストを逆にする(以前に古いものから新しいものにソートされた) tac
  • 出力を16番目に古い結果に制限し、それに続く tail -n +16
  • その後で破壊する xargs -n 1 zfs destroy -vr

スナップショットを逆順に削除する方が効率的であると思われます。

または作成の逆順で並べ替える

zfs list -t snapshot -o name -S creation | grep ^tank@Auto | tail -n +16 | xargs -n 1 zfs destroy -vr

でテストする ...|xargs -n 1 echo


1
これsort -rsedコマンドの前に必要だと思います。sedデフォルトのソートでは最新のものである、最初の15行を超えてリストの下部を出力するようです。リストを反転すると、一番下にある最も古いスナップショットが取得されます。
成長

1
彼は、「スナップショットを逆順で削除する方が効率的であると思われる」、つまりソート順を述べた。
tgunr

19

名前ではなく作成日に基づいて最新のスナップショットを取得するより一般的なケース。

zfs list -H -t snapshot -o name -S creation | head -1

特定のファイルシステム名にスコープされます TestOne

zfs list -H -t snapshot -o name -S creation -d1 TestOne | head -1

-H:ヘッダーがないため、最初の行はスナップショット名です

-t snapshot:スナップショットのリスト(リストには、プールやボリュームなどの他のものをリストできます)

-o name:スナップショット名のプロパティを表示します。

-S creation:大文字Sは、作成時間に基づいた降順ソートを示します。これにより、最新のスナップショットが最初の行になります。

-d1 TestOne:子が含まれていると言いますが、これは混乱しているようですが、このコマンドに関する限り、TestOneのスナップショットは子であるためです。これは、TestOne内のボリュームのスナップショットをリストしませんTestOne/SubVol@someSnapshot

| head -1:先頭にパイプし、最初の行のみを返します。


1
をありがとう-d1。それが、「特定のデータセットのすべてのスナップショットを取得するにはどうすればよいか」という質問の鍵となりました。
ジョナサンラインハルト

8

これは質問自体にはまったく答えませんが、スナップショットの範囲を削除できることを忘れないでください。

zfs destroy zpool1 / dataset @ 20160918%20161107

「20160918」から「20161107」までのすべてのスナップショットを破壊します。どちらの端も空白のままにして、「最も古い」または「最新の」を意味する場合があります。したがって、「n」を把握して「...%n」を破壊する何かを作成できます。

古い質問を復活させてすみません。


これはチャームのように機能し、受け入れられた答えの100倍高速です!
ニールワング

5

growseはOpenIndianaでは動作しませんでした。xargsの-0を理解しませんでした。

ソートを使用する場合は、アルファベット順でソートすることに注意してください。これは、おそらく最新のものを見つけたいので、望ましくないかもしれません。

最後のスナップショットを除くすべてを削除するコードを次に示します。

「エコー」を削除して公開します。

RETENTION=5
FS=tank1/test
SNAPNAME=daily-

zfs list -t snapshot -o name | grep ^$FS@${SNAPNAME} |  sed -n -e :a -e '1,${RETENTION}!{P;N;D;};N;ba' | xargs -n 1 echo zfs destroy -r

ソース:http : //sed.sourceforge.net/sed1line.txt


2
そのようなsedを使用できる人は誰でもそれに値するからです。
12

2
最近のソフトウェアの更新後、そのsed文字列は機能しなくなり、すべてのスナップショットが削除され始めました!悪いセッド!幸いなことに、運用サーバーは古く、安全なままでした。現在はsed -n -e:a -e '1、$ {RETENTION}!{P; N; D;}; N; ba'を使用しています
ダンビューラー

私はそのようなSEDを見たことがありません。
ジェイソン

3

これをbash-fuで解決したかもしれません。

 zfs list -t snapshot -o name | grep ^tank@AutoD- | sort -r | wc -l | xargs -n 1 expr -$NUM_TO_KEEP + | tr -d '\n' | xargs -0 -i bash -c "zfs list -t snapshot -o name | grep ^tank@AutoD- | sort -r | tail -n{} | sort |xargs -t -n 1 zfs destroy -r"

ワオ。それはとても間違っているように感じます。


1

Solarisではheadのパスが必要ですが、他のディストリビューションではパスなしで機能するはずです。

retention=14
dataset=vmstorage-17/824

zfs list -rt snap -H -o name ${dataset} | \
/usr/gnu/bin/head -n -${retention} | xargs -n 1 zfs destroy -r
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.