마지막 [n] ZFS 스냅 샷을 제외하고 모두 삭제하는 방법?


24

현재 ZFS 기반 NAS를 야간 및 주 단위로 스냅 샷하고 있는데,이 과정에서 엉덩이가 몇 번 절약되었습니다. 그러나 스냅 샷 생성은 cron에서 자동으로 수행되지만 이전 스냅 샷 삭제는 여전히 수동 작업입니다. 버스에 부딪 히거나 수동 작업을 수행하지 않으면 NAS에 디스크 공간이 부족해질 위험이 있습니다.

누구나 ZFS 시스템에 저장된 스냅 샷 수를 관리하는 데 사용할 수있는 좋은 방법 / 스크립트가 있습니까? 이상적으로는 주어진 ZFS 파일 시스템의 모든 스냅 샷을 반복하고 해당 파일 시스템의 마지막 n 개의 스냅 샷을 모두 삭제하는 스크립트를 원합니다 .

예를 들어 두 개의 파일 시스템이 있는데 하나는이라는 tank것과 다른 하나는 이라고 sastank합니다. 스냅 샷은 생성 된 날짜로 이름이 지정 sastank@AutoD-2011-12-13되므로 간단한 sort명령으로 순서대로 나열해야합니다. 지난 2 주일 동안의 매일 스냅 샷을 유지하려고 tank하지만 마지막 2 일 동안의 스냅 샷 만 에 유지하려고합니다 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@Autogrep ^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 줄 이상으로 목록의 맨 아래를 출력하는 것으로 보입니다. 기본 정렬에서 가장 최근입니다. 목록을 뒤집 으면 맨 아래에 가장 오래된 스냅 샷이 표시됩니다.
키우기

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. 이것이 "주어진 데이터 세트에 대한 모든 스냅 샷을 어떻게 얻습니까?"라는 질문의 핵심이었습니다.
Jonathon Reinhart 2014

8

이것은 완전히 질문 자체에 대한 답은 아니지만 스냅 샷 범위를 삭제할 수 있음을 잊지 마십시오.

zfs는 zpool1 / dataset을 파괴합니다 @ 20160918 % 20161107

"20160918"에서 "20161107"까지의 모든 스냅 샷을 삭제합니다. "가장 오래된"또는 "최신"을 의미하기 위해 끝을 비워 둘 수 있습니다. 따라서 "n"을 알아 낸 다음 "... % n"을 (를) 파괴하는 것을 요리 할 수 ​​있습니다.

오래된 질문을 부활 시켜서 죄송합니다.


이것은 매력처럼 작동하며 허용되는 답변보다 100 배 빠릅니다!
NeilWang

5

growse 's는 OpenIndiana에서 작동하지 않았습니다. 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
sed를 사용할 수있는 사람이라면 누구나 가치가 있기 때문에 공감하십시오.
23:05에

2
최근 소프트웨어 업데이트 후 sed 문자열이 작동을 멈추고 모든 스냅 샷 삭제가 시작되었습니다! 나쁜 sed! 운 좋게 프로덕션 서버는 오래되었고 안전을 유지했습니다. -e '바; N 1, $ {유급} {, N, D, P}!': 지금 나오지 -n -e 사용
댄 BUHLER

그런 SED를 본 사람은 없습니다.
Jason

3

나는 이것을 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"

와우. 너무 잘못 느낀다.


1

헤드 경로는 Solaris에서 필요하지만 다른 배포판에서는 경로없이 작동해야합니다.

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.