Soru Son [n] ZFS anlık görüntülerinin tümü nasıl silinir?


Şu anda benim ZFS tabanlı NAS'ımı gece ve haftada bir arada tutuyorum, bu da kıçımı birkaç kez kurtardı. Ancak, anlık görüntüsünün oluşturulması otomatikken (cron'dan), eski anlık görüntülerin silinmesi hala manuel bir görevdir. Açıkçası, bir otobüse çarptığında veya manuel görev gerçekleştirilmezse, NAS'ın disk alanı tükeneceği riski vardır.

ZFS sistemlerinde saklanan anlık görüntü sayısını yönetmek için kullandığı herhangi iyi bir yol / komut dosyası var mı? İdeal olarak, belirli bir ZFS dosya sistemi için tüm anlık görüntülerde yinelenen bir betik istiyorum ve en sonuncuyu siler. n Bu dosya sistemi için anlık görüntüler.

Örneğin. İki dosya sistemim var. tank ve başka bir sastank. Anlık görüntüler, oluşturuldukları tarihle adlandırılır: sastank@AutoD-2011-12-13 çok basit sort komut onları sırayla listelemelidir. Son 2 haftanın günlük fotoğraflarını çekmeye çalışıyorum. tankama sadece son iki güne ait fotoğrafların çekilmesi sastank.


23
2017-12-14 12:27


Menşei




Cevaplar:


Böyle bir şeyi biraz daha basit bulabilirsiniz

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • anlık görüntülerin listesini (sadece isimler) zfs list -t snaphot -o name
  • sadece eşleşenleri tutmak için filtre tank@Auto ile grep ^tank@Auto
  • listeyi tersine çevir (daha önce en eskiden en yeniye doğru sıralanır) tac
  • çıkışı en eski 16 sonuca sınırlamak ve tail -n +16
  • sonra yok etmek xargs -n 1 zfs destroy -vr

Anlık görüntülerin ters sırayla silinmesi söz konusu olduğunda daha verimli.

ya da yaratılışın tersi 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

İle test edin ...|xargs -n 1 echo 


34
2017-09-01 10:20



Bunun bir ihtiyacı var sort -r önce sed Komut. sed listenin altını, varsayılan sıralamada en yeni olan ilk 15 satırın ötesine çıkarmış gibi görünüyor. Listeyi çevirmek en alttaki en eski fotoğrafları almam anlamına geliyor. - growse
"Sırasıyla anlık görüntülerin silinmesi sözde daha verimli", yani sıralama düzenini belirtti. - tgunr


En son anlık görüntünün, oluşturulma tarihine göre değil, adla değil, daha genel olması durumu.

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 bir anlık fotoğraf adıdır

-t snapshot: Liste anlık görüntüleri (liste, havuzlar ve birimler gibi diğer şeyleri listeleyebilir)

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

-S creation: Başkent S O anlamına gelir Azalan sıralama, oluşturma süresine göre. Bu, en son anlık görüntüyü ilk satır olarak gösterir.

-d1 TestOne: Çocuğa, kafa karıştırıcı gibi görünen, ancak bu komuta kadarıyla TestOne'un enstantaneleri çocukların olduğu söylenir. Bu irade DEĞİL TestOne içindeki hacimlerin anlık görüntülerini listeler. TestOne/SubVol@someSnapshot.

| head -1: Boru kafaya ve sadece ilk sıraya dönüş.


16
2018-05-25 23:01



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


Growse benim için OpenIndiana üzerinde çalışmadı. Xargs için -0 anlamadı.

Sıralamayı kullanıyorsanız, alfabetik olarak sıraladığınızı unutmayın; bu, muhtemelen en güncel olanı bulmak istediğiniz için istenmeyebilir.

İşte son görüntülerin tümünü silecek kod.

Canlı gitmek için 'echo' çıkarı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


5
2017-11-11 02:21



Vur gibi sed kullanabilen herkes bunu hak ediyor. - growse
Son bir yazılım güncellemesinden sonra, bu sed dizisi 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
Daha önce hiç böyle bir SED görmedim. - Jason


Bu tamamen soruyu kendisi yanıtlamıyor, ancak unutmayın, anlık görüntü aralığını silebilirsiniz.

zfs zpool1 / dataset'i imha eder @ 20160918% 20161107

"20160918" ile "20161107" arasındaki tüm anlık görüntüleri yok eder. Her iki uç boş bırakılabilir, "en eski" veya "en yeni" anlamına gelir. Yani "n" 'den daha sonra bir şey pişirebilirsin, sonra da "...% n" yi yok et.

Eski bir soruyu yeniden direttiğim için üzgünüm.


5
2017-12-14 12:58





Bunu bazh-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.


3
2017-10-16 16:41





Solaris'te kafaya giden yol gereklidir, ancak diğer dağıtımlarda yol olmadan çalışmalıdır.

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