Як видалити всі, крім останніх [n] знімків ZFS?


25

Наразі я знімаю щомісяця та щотижня мою NAS на базі ZFS, що врятувало мою дупу кілька разів. Однак, хоча створення знімка відбувається автоматично (з cron), видалення старих знімків все ще є ручним завданням. Очевидно, є ризик того, що якщо мене потрапить шина, або якщо завдання вручну не буде виконано, у 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 рядками, який у сортуванні за замовчуванням є самим останнім. Перегортання списку означає, що я отримую найстаріші знімки внизу.
приріст

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. Це було ключем до питання "Як отримати всі знімки для заданого набору даних?"
Джонатан Райнхарт

9

Це абсолютно не відповідає самому питанню, але не забувайте, що ви можете видалити діапазони знімків.

zfs знищують zpool1 / набір даних @ 20160918% 20161107

Знищить усі знімки від "20160918" до "20161107" включно. Будь-який кінець може залишатися порожнім, щоб означати "найстаріший" або "найновіший". Таким чином, ви можете приготувати щось, що з'ясує "n", а потім знищити "...% n" ..

Вибачте, що відновив старе питання.


1
Це працює як шарм і в 100 разів швидше прийнятої відповіді!
NeilWang

5

На мене OpenEndiana не працював. Це не зрозуміло -0 для xargs.

Якщо ви використовуєте сортування, майте на увазі, що він сортує в алфавітному порядку, що може не бути бажаним, оскільки ви, мабуть, хочете знайти найсвіжіші.

Ось код, який видалить усі, крім останніх знімків.

Видаліть «відлуння», щоб перейти в прямому ефірі.

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, заслуговує цього.
приріст

2
Після недавнього оновлення програмного забезпечення ця струна перестала працювати для мене, і вона почала видаляти всі знімки! поганий sed! На щастя, сервер виробництва був старим і залишався в безпеці. Зараз я використовую sed -n -e: a -e '1, $ {RETENTION}! {P; N; D;}; N; ba'
Dan Buhler

Я ніколи не бачив нікого такого СЕД.
Джейсон

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.