Làm cách nào để xóa tất cả nhưng ảnh chụp nhanh [n] ZFS cuối cùng?


24

Tôi hiện đang chụp nhanh NAS dựa trên ZFS hàng đêm và hàng tuần, một quá trình đã cứu được mông của tôi một vài lần. Tuy nhiên, trong khi việc tạo ảnh chụp nhanh là tự động (từ cron), việc xóa các ảnh chụp nhanh cũ vẫn là một tác vụ thủ công. Rõ ràng có một rủi ro là nếu tôi bị xe buýt đâm, hoặc tác vụ thủ công không được thực hiện, NAS sẽ hết dung lượng đĩa.

Có ai có bất kỳ cách / tập lệnh tốt nào họ sử dụng để quản lý số lượng ảnh chụp nhanh được lưu trữ trên hệ thống ZFS của họ không? Lý tưởng nhất, tôi muốn một tập lệnh lặp qua tất cả các snapshot cho một hệ thống tập tin ZFS nhất định và xóa tất cả trừ n snapshot cuối cùng cho hệ thống tập tin đó.

Ví dụ: tôi có hai hệ thống tập tin, một được gọi tankvà một hệ thống khác được gọi sastank. Ảnh chụp nhanh được đặt tên theo ngày mà chúng được tạo: sastank@AutoD-2011-12-13vì vậy một sortlệnh đơn giản sẽ liệt kê chúng theo thứ tự. Tôi đang tìm cách để giữ các ảnh chụp nhanh hàng ngày trong 2 tuần qua tank, nhưng chỉ có các ảnh chụp nhanh trong hai ngày qua sastank.

Câu trả lời:


35

Bạn có thể tìm thấy một cái gì đó như thế này đơn giản hơn một chút

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • xuất danh sách ảnh chụp nhanh (chỉ tên) với zfs list -t snaphot -o name
  • bộ lọc chỉ giữ những cái phù hợp tank@Autovớigrep ^tank@Auto
  • đảo ngược danh sách (trước đây được sắp xếp từ cũ nhất đến mới nhất) với tac
  • giới hạn đầu ra cho kết quả cũ nhất thứ 16 và theo sau với tail -n +16
  • sau đó phá hủy với xargs -n 1 zfs destroy -vr

xóa ảnh chụp nhanh theo thứ tự ngược lại được cho là hiệu quả hơn.

hoặc sắp xếp theo thứ tự ngược lại của sáng tạo

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

Kiểm tra nó với ...|xargs -n 1 echo


1
Tôi nghĩ rằng điều này cần một sort -rtrước khi sedlệnh. seddường như xuất ra cuối danh sách ngoài 15 dòng đầu tiên, trong đó sắp xếp mặc định là gần đây nhất. Lật danh sách có nghĩa là tôi nhận được các ảnh chụp nhanh nhất ở phía dưới.
triển

1
Ông tuyên bố "xóa ảnh chụp nhanh theo thứ tự ngược được cho là hiệu quả hơn", do đó, thứ tự sắp xếp.
tgunr 17/03/2017

19

Trường hợp tổng quát hơn về việc có được ảnh chụp gần đây nhất dựa trên ngày tạo, không phải theo tên.

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

Phạm vi một tên hệ thống tập tin cụ thể TestOne

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

-H: Không có tiêu đề để dòng đầu tiên là tên ảnh chụp nhanh

-t snapshot: Danh sách ảnh chụp nhanh (danh sách có thể liệt kê những thứ khác như nhóm và khối lượng)

-o name: Hiển thị thuộc tính tên ảnh chụp.

-S creation: Vốn Sbiểu thị sắp xếp giảm dần , dựa trên thời gian tạo. Điều này đặt ảnh chụp gần đây nhất là dòng đầu tiên.

-d1 TestOne: Nói bao gồm trẻ em, có vẻ khó hiểu nhưng vì liên quan đến lệnh này, ảnh chụp nhanh của TestOne là trẻ em. Điều này sẽ KHÔNG liệt kê các ảnh chụp nhanh của các tập trong TestOne, chẳng hạn như TestOne/SubVol@someSnapshot.

| head -1: Ống đến đầu và chỉ trở lại dòng đầu tiên.


1
Cảm ơn vì -d1. Đó là chìa khóa cho câu hỏi "Làm thế nào để tôi có được tất cả các ảnh chụp nhanh cho một tập dữ liệu nhất định?"
Jonathon Reinhart

8

Điều này hoàn toàn không trả lời chính câu hỏi, nhưng đừng quên bạn có thể xóa phạm vi ảnh chụp nhanh.

zfs phá hủy zpool1 / tập dữ liệu @ 20160918% 20161107

Sẽ phá hủy tất cả các ảnh chụp nhanh từ "20160918" đến "20161107". Một trong hai kết thúc có thể để trống, có nghĩa là "cũ nhất" hoặc "mới nhất". Vì vậy, bạn có thể nấu một cái gì đó mà tìm ra "n" rồi phá hủy "...% n" ..

Xin lỗi để làm sống lại một câu hỏi cũ.


Điều này hoạt động như sự quyến rũ và nhanh hơn 100 lần so với câu trả lời được chấp nhận!
NeilWang

5

growse's không hoạt động trên OpenIndiana đối với tôi. Nó không hiểu -0 cho xargs.

Nếu sử dụng sort, hãy lưu ý rằng nó sắp xếp theo thứ tự abc có thể không mong muốn vì có lẽ bạn đang muốn tìm gần đây nhất.

Đây là mã sẽ xóa tất cả trừ các ảnh chụp nhanh cuối cùng.

Xóa 'tiếng vang' để phát trực tiếp.

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

Nguồn: http://sed.sourceforge.net/sed1line.txt


2
Upvote bởi vì bất cứ ai có thể sử dụng sed như thế đều xứng đáng.
gầm gừ

2
Sau một bản cập nhật phần mềm gần đây, chuỗi sed đó đã ngừng hoạt động với tôi và nó bắt đầu xóa tất cả các ảnh chụp nhanh! xấu sed! May mắn là máy chủ sản xuất đã cũ và an toàn. Bây giờ tôi sử dụng sed -n -e: a -e '1, $ {RETENTION}! {P; N; D;}; N; ba'
Dan Buhler

Tôi chưa bao giờ thấy ai SED như thế.
Jason

3

Tôi có thể đã giải quyết điều này với một số 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"

Ồ Nó cảm thấy rất sai.


1

Đường dẫn cho đầu là cần thiết trên Solaris, nhưng nên hoạt động mà không có đường dẫn trên các bản phát hành khác.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.