web-dev-qa-db-ja.com

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

現在、ZFSベースのスナップショットを作成していますNAS毎晩、毎週、お尻を数回保存したプロセスです。ただし、スナップショットの作成は(cronから)自動で行われますが、古いスナップショットの削除は依然として手動のタスクです。バスに当たった場合、または手動のタスクが実行されなかった場合、NASがディスク領域を使い果たしてしまうというリスクがあります。 。

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

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

27
growse

あなたはこのようなものをもう少し簡単に見つけるかもしれません

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • zfs list -t snapshot -o nameを使用して、スナップショット(名前のみ)のリストを出力します
  • tank@Autogrep ^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でテストしてください。

37
user9517

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

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のスナップショットは子供であるためです。これは[〜#〜] not [〜#〜]TestOne/SubVol@someSnapshotなどのTestOne内のボリュームのスナップショットをリストします。

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

20
AaronLS

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

zfsはzpool1/dataset @ 20160918%20161107を破棄します

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

古い質問を復活させて申し訳ありません。

13
lundman

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

5
Dan Buhler

これを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"

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

3
growse

zfs-Prune-snapshots も確認してください。

特定の基準に一致する1つ以上のzpoolからスナップショットを削除します

スナップショットを削除するためのかなり堅牢な時間ベースのメカニズム、ドキュメントの例があります:

文字列 "_frequency"で終わるタンクプールで2か月以上前のスナップショットを削除します

zfs-Prune-snapshots -s '_frequent' 2M tank

1
DRAD

Solarisではヘッドのパスが必要ですが、他のディストリビューションではパスがなくても機能するはずです。

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
1
Josh Simon