วิธีลบทั้งหมดยกเว้น [n] สแนปชอต ZFS ล่าสุด


24

ขณะนี้ฉันกำลังจัดทำ NAS ที่ใช้ ZFS ของฉันทั้งรายวันและรายสัปดาห์ซึ่งเป็นกระบวนการที่ช่วยชีวิตฉันไว้สองสามครั้ง อย่างไรก็ตามในขณะที่การสร้างสแน็ปช็อตเป็นไปโดยอัตโนมัติ (จาก cron) การลบสแน็ปช็อตเก่ายังคงเป็นงานที่ทำด้วยมือ เห็นได้ชัดว่ามีความเสี่ยงที่ถ้าฉันโดนรถบัสหรืองานที่ทำด้วยมือไม่ได้ดำเนินการ NAS จะหมดพื้นที่ดิสก์

ทุกคนมีวิธี / สคริปต์ที่ดีที่พวกเขาใช้เพื่อจัดการจำนวนสแนปชอตที่เก็บไว้ในระบบ ZFS หรือไม่? โดยอุดมคติแล้วฉันต้องการสคริปต์ที่วนซ้ำสแน็ปช็อตทั้งหมดสำหรับระบบไฟล์ ZFS ที่กำหนดและลบทั้งหมดยกเว้นสแนปชอตnสุดท้ายสำหรับระบบไฟล์นั้น

เช่นฉันมีสอง filesystems หนึ่งเรียกว่าและอีกที่เรียกว่า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ก่อนหน้า ดูเหมือนว่าจะส่งออกด้านล่างของรายการเกิน 15 บรรทัดแรกซึ่งในการเรียงลำดับเริ่มต้นเป็นล่าสุด การพลิกรายการหมายความว่าฉันได้ภาพรวมที่เก่าที่สุดที่ด้านล่าง sedsed
Growse

1
เขากล่าวว่า "การลบสแนปชอตในลำดับย้อนกลับน่าจะมีประสิทธิภาพมากกว่า" ดังนั้นการเรียงลำดับ
tgunr

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 TestOne/SubVol@someSnapshotเช่น

| head -1: ไปป์และส่งคืนบรรทัดแรกเท่านั้น


1
-d1ขอบคุณสำหรับ นั่นคือกุญแจสำคัญในคำถาม "ฉันจะได้รับ snapshots ทั้งหมดสำหรับชุดข้อมูลที่กำหนดได้อย่างไร"
Jonathon Reinhart

8

ทั้งหมดนี้ไม่ตอบคำถาม แต่อย่าลืมว่าคุณสามารถลบช่วงของสแนปชอตได้

zfs ทำลาย zpool1 / dataset @ 20160918% 20161107

จะทำลายสแนปชอตทั้งหมดจาก "20160918" ถึง "20161107" ปลายทั้งสองด้านอาจเว้นว่างไว้เพื่อหมายถึง "เก่าที่สุด" หรือ "ใหม่ที่สุด" ดังนั้นคุณสามารถทำอาหารบางอย่างที่คิดออกว่า "n" แล้วทำลาย "... % n" ..

ขออภัยที่จะตอบคำถามเก่าอีกครั้ง


ใช้งานได้อย่างมีเสน่ห์และเร็วกว่าคำตอบที่ยอมรับ 100 เท่า!
NeilWang

5

Growse ไม่ได้ทำงานกับ OpenIndiana สำหรับฉัน ไม่เข้าใจ -0 สำหรับ xargs

หากใช้การเรียงลำดับโปรดระวังว่าเรียงลำดับตามตัวอักษรซึ่งอาจไม่ต้องการเนื่องจากคุณอาจต้องการค้นหาข้อมูลล่าสุด

นี่คือรหัสที่จะลบทั้งหมดยกเว้นสแนปชอตล่าสุด

ลบ 'echo' เพื่อแสดงสด

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
โหวตเพราะใครก็ตามที่สามารถใช้ sed อย่างที่ควรจะเป็น
Growse

2
หลังจากอัปเดตซอฟต์แวร์ล่าสุดสตริง sed หยุดทำงานเพื่อฉันและมันเริ่มลบสแน็ปช็อตทั้งหมด! แย่มาก! โชคดีที่เซิร์ฟเวอร์การผลิตเก่าและอยู่อย่างปลอดภัย ตอนนี้ฉันใช้ sed -n -e: a -e '1, $ {RETENTION}! {P; N; 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

จำเป็นต้องใช้พา ธ สำหรับหัวบน Solaris แต่ควรทำงานโดยไม่มีเส้นทางบน distros อื่น

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.