現在、ZFSベースのスナップショットを作成していますNAS毎晩、毎週、お尻を数回保存したプロセスです。ただし、スナップショットの作成は(cronから)自動で行われますが、古いスナップショットの削除は依然として手動のタスクです。バスに当たった場合、または手動のタスクが実行されなかった場合、NASがディスク領域を使い果たしてしまうというリスクがあります。 。
ZFSシステムに保存されているスナップショットの数を管理するために使用する良い方法/スクリプトはありますか?理想的には、特定のZFSファイルシステムのすべてのスナップショットを反復処理し、そのファイルシステムの最後のnスナップショットを除くすべてを削除するスクリプトが必要です。
例えば。私は2つのファイルシステムを持っています。1つはtank
と呼ばれ、もう1つはsastank
と呼ばれます。スナップショットは作成された日付を使用して名前が付けられます:sastank@AutoD-2011-12-13
したがって、単純なsort
コマンドでそれらを順番にリストする必要があります。過去2週間分のtank
の毎日のスナップショットを保持したいと考えていますが、sastank
の過去2日間のスナップショットのみを保持しています。
あなたはこのようなものをもう少し簡単に見つけるかもしれません
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@Auto
とgrep ^tank@Auto
に一致するもののみを保持するようにフィルタリングしますtac
を使用してリストを逆にします(以前は最も古いものから新しいものにソートされていました)。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
でテストしてください。
名前ではなく作成日に基づいて最新のスナップショットを取得する、より一般的なケース。
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
:先頭にパイプして最初の行のみを返します。
これは完全に質問自体には答えませんが、スナップショットの範囲を削除できることを忘れないでください。
zfsはzpool1/dataset @ 20160918%20161107を破棄します
「20160918」から「20161107」までのすべてのスナップショットを破棄します。どちらの端も空白のままにして、「最も古い」または「最も新しい」を意味する場合があります。したがって、 "n"を計算して "...%n"を破壊するようなものを作成できます。
古い質問を復活させて申し訳ありません。
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
これを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"
ワオ。それはとても間違っていると感じています。
zfs-Prune-snapshots も確認してください。
特定の基準に一致する1つ以上のzpoolからスナップショットを削除します
スナップショットを削除するためのかなり堅牢な時間ベースのメカニズム、ドキュメントの例があります:
文字列 "_frequency"で終わるタンクプールで2か月以上前のスナップショットを削除します
zfs-Prune-snapshots -s '_frequent' 2M tank
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