Tüm son [n] ZFS anlık görüntüleri nasıl silinir?


24

Şu anda ZFS tabanlı NAS'ımı gece ve haftalık olarak çekiyorum, birkaç kez kıçımı kurtardı. Ancak, anlık görüntünün oluşturulması otomatik (cron'dan) iken, eski anlık görüntülerin silinmesi hala manuel bir iştir. Açıkça görülüyor ki, eğer bir otobüse çarptığımda veya el ile yapılan bir iş yapılmadığında NAS'ın boş disk alanı bitmesi riski var.

ZFS sistemlerinde depolanan anlık görüntü sayısını yönetmek için kullandıkları herhangi bir iyi yöntem / komut dosyası var mı? İdeal olarak, belirli bir ZFS dosya sistemi için tüm anlık görüntüleri yineleyen ve o dosya sistemi için son n anlık görüntüleri silen bir komut dosyası istiyorum .

Örn, biri adı verilen tankdiğeri adı verilen iki dosya sistemim var sastank. Anlık görüntüler, oluşturuldukları tarihe göre adlandırılır: sastank@AutoD-2011-12-13bu nedenle basit bir sortkomut onları sırayla listelemelidir. Son 2 haftanın günlük anlık görüntü değerlerini açık tutmaya çalışıyorum tank, ancak yalnızca son iki gün anlık görüntü değerlerini açık tutmaya çalışıyorum sastank.

Yanıtlar:


35

Bunun gibi bir şeyi daha basit bulabilirsiniz

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • ile anlık görüntü listesini çıkartabilir (yalnızca adlar) zfs list -t snaphot -o name
  • maçın sadece olanları tutmak için filtre tank@Autoilegrep ^tank@Auto
  • listeyi tersine çevir (önceden en eskiden en yeniye doğru sıralı olarak) tac
  • çıktıyı en eski 16. sonuçla sınırlandırın ve tail -n +16
  • sonra yok et xargs -n 1 zfs destroy -vr

anlık görüntüleri ters sırayla silmek daha etkilidir.

veya tersini oluşturma sırasına göre sıralayın

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

Şununla test et ...|xargs -n 1 echo


1
Sanırım bunun emirden sort -rönce yapılması gerekiyor sed. sedListenin altını, varsayılan sıralamada en yeni olan ilk 15 satırın ötesine çıkarıyor gibi görünüyor. Listeyi çevirmek, en eski anlık görüntüleri aldığım anlamına gelir.
Aralık'ta büyümek

1
"Anlık görüntüleri ters sırayla silmek sözde daha verimli", yani sıralama düzenini belirtti.
tgunr

19

İsimle değil, en son anlık görüntüyü oluşturma tarihine göre almak için daha genel bir durum.

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

Belirli bir dosya sistemi adına göre TestOne

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

-H: Başlık yok, böylece ilk satır anlık görüntü adıdır

-t snapshot: Anlık görüntüleri listele (liste havuzlar ve hacimler gibi diğer şeyleri listeleyebilir)

-o name: Anlık görüntü adı özelliğini görüntüleyin.

-S creation: Sermaye oluşturma zamanına bağlı olarak azalan sıralama Sanlamına gelir . Bu, en son anlık görüntüyü ilk satır olarak koyar.

-d1 TestOne: Kafa karıştırıcı görünen çocukları içerdiğini söylüyor, ancak bunun nedeni, bu komut söz konusu olduğunda TestOne'un enstantaneleri çocuklar. Bu olacak DEĞİL gibi Testone içindeki hacimleri anlık listelemek TestOne/SubVol@someSnapshot.

| head -1: Boruyu başa ve sadece ilk satırı geri getirin.


1
İçin teşekkürler -d1. “Belirli bir veri kümesi için tüm anlık görüntüleri nasıl alabilirim?” Sorusunun anahtarı buydu.
Jonathon Reinhart

8

Bu tamamen sorunun kendisine cevap vermiyor, ancak anlık görüntü aralıklarını silebileceğinizi unutmayın.

zfs zpool1 / veri kümesini destekliyor @ 20160918% 20161107

"20160918" den "20161107" ye kadar olan tüm anlık görüntüleri yok eder. Her iki uç da "en eski" veya "en yeni" anlamına gelmek üzere boş bırakılabilir. Böylece "n" yi anlayan bir şey pişirebilirsin, sonra "...% n" i yok edebilirsin ..

Eski bir soruyu tekrar yönlendirdiğim için özür dilerim.


Bu cazibe gibi çalışır ve kabul edilen cevaptan 100 kat daha hızlı!
NeilWang

5

Growse benim için OpenIndiana'da işe yaramadı. Xargs için -0 anlamadı.

Eğer sıralama kullanıyorsanız, muhtemelen en yenisini bulmak istediğinizde istenmeyebilecek olanın alfabetik olarak sıralandığını unutmayın.

İşte en son anlık görüntüler dışındaki her şeyi silecek kod.

Yayına geçmek için 'echo'yu kaldırın.

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

Kaynaklar: http://sed.sourceforge.net/sed1line.txt


2
Olumlu bir şekilde çünkü sed'i bu şekilde kullanan herkes bunu hak ediyor.
12'de

2
Son bir yazılım güncellemesinden sonra, bu sed string benim için çalışmayı durdurdu ve tüm anlık görüntüleri silmeye başladı! Kötü sed! Neyse ki, üretim sunucusu eski ve güvenli kaldı. Şimdi sed -n -e kullanıyorum: a-e '1, $ {RETENTION}! {P; N; D;}; N; ba'
Dan Buhler

SED kimseyi böyle görmemiştim.
Jason,

3

Bunu bir bash-fu ile çözmüş olabilirim.

 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"

Vay. Çok yanlış geliyor.


1

Solaris'te kafa yolu gereklidir, ancak diğer dağıtımlardaki yol olmadan da çalışması gerekir.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.