ZFS स्नैपशॉट सभी लेकिन अंतिम [n] कैसे हटाएं?


24

मैं वर्तमान में अपने ZFS-आधारित NAS को रात और साप्ताहिक रूप से स्नैपशॉट कर रहा हूं, एक ऐसी प्रक्रिया जिसने मेरे गधे को कुछ समय बचाया है। हालाँकि, जबकि स्नैपशॉट का निर्माण स्वचालित है (क्रोन से), पुराने स्नैपशॉट को हटाना अभी भी एक मैन्युअल कार्य है। जाहिर है कि एक जोखिम है कि अगर मैं किसी बस की चपेट में आ जाऊं या मैनुअल टास्क न किया जाए तो एनएएस डिस्क स्थान से बाहर चला जाएगा।

क्या किसी के पास अपने ZFS सिस्टम पर संग्रहीत स्नैपशॉट की संख्या को प्रबंधित करने के लिए कोई अच्छा तरीका / स्क्रिप्ट है? आदर्श रूप से, मैं एक स्क्रिप्ट पसंद करूंगा जो किसी दिए गए ZFS फाइल सिस्टम के लिए सभी स्नैपशॉट के माध्यम से पुनरावृत्त करता है और उस फाइल सिस्टम के लिए अंतिम n स्नैपशॉट को हटा देता है ।

जैसे मुझे दो फाइल सिस्टम मिले हैं, एक को कॉल किया गया tankऔर दूसरे को कॉल किया गया sastank। स्नैपशॉट्स को उस तारीख के साथ नामित किया जाता है जिस पर वे बनाए गए थे: sastank@AutoD-2011-12-13इसलिए एक साधारण sortआदेश उन्हें क्रम में सूचीबद्ध करना चाहिए। मैं पिछले 2 सप्ताह के दैनिक स्नैपशॉट के मूल्य को चालू रखना चाहता हूं tank, लेकिन केवल पिछले दो दिनों के स्नैपशॉट के लायक है 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 -rकि sedकमांड से पहले इसकी जरूरत है । sedपहली 15 लाइनों से परे सूची के निचले हिस्से को आउटपुट करने के लिए लगता है, जो कि डिफ़ॉल्ट क्रम में सबसे हाल ही में है। सूची को फ़्लिप करने का मतलब है कि मुझे सबसे नीचे स्नैपशॉट मिलें।
growse

1
उन्होंने कहा, "रिवर्स ऑर्डर में स्नैपशॉट को हटाना अधिक कुशल है", इस प्रकार क्रम।

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/SubVol@someSnapshot

| head -1: सिर तक पाइप करें और केवल पहली पंक्ति में लौटें।


1
के लिए धन्यवाद -d1। यह प्रश्न की कुंजी थी "मैं किसी दिए गए डेटासेट के लिए सभी स्नैपशॉट कैसे प्राप्त करूं?"
जोनाथन रेनहार्ट

8

यह पूरी तरह से सवाल का जवाब नहीं देता है, लेकिन यह मत भूलो कि आप स्नैपशॉट की श्रेणियों को हटा सकते हैं।

zfs ने zpool1 / डेटासेट @ 20160918% 20161107 को नष्ट कर दिया

"स्नैपचैट" को "20160918" से "20161107" समावेशी सभी नष्ट कर देगा। या तो अंत को खाली छोड़ा जा सकता है, जिसका अर्थ "सबसे पुराना" या "नवीनतम" है। तो आप कुछ बना सकते हैं जो आंकड़े "एन" को नष्ट करते हैं, फिर "...% n" को नष्ट करते हैं।

एक पुराने प्रश्न को पुनर्जीवित करने के लिए क्षमा करें।


यह स्वीकृत उत्तर की तुलना में आकर्षण और 100 गुना तेजी से काम करता है!
नीलवांग

5

ग्रोसे ने मेरे लिए ओपनइंडियाना पर काम नहीं किया है। यह 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
अपवोट करें क्योंकि जो कोई भी इस तरह से सेड का उपयोग कर सकता है, वह इसका हकदार है।
बढ़ो

2
हाल ही में एक सॉफ़्टवेयर अपडेट के बाद, उस सेड स्ट्रिंग ने मेरे लिए काम करना बंद कर दिया और इसने सभी स्नैपशॉट को हटाना शुरू कर दिया! बुरी सीड! सौभाग्य से उत्पादन सर्वर पुराना था और सुरक्षित रहा। अब मैं sed -n -e: a -e '1, $ {RETENTION}! {P; B; D;};}; N; ba' का उपयोग करता हूं
Dan Buhler

मैंने कभी किसी को SED जैसा नहीं देखा।
जेसन

3

मैंने इसे कुछ बैश-फू के साथ हल किया होगा।

 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

सोलारिस पर सिर के लिए पथ की आवश्यकता है, लेकिन अन्य डिस्ट्रोस पर पथ के बिना काम करना चाहिए।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.