Как выполнить команду на всех выводах моментальных снимков ZFS в FreeBSD?

Вопрос или проблема

Когда я загружаюсь в однопользовательский режим и перечисляю снимки ZFS, которые меня интересуют, я хочу вернуться к снимку “xfcedesktop”. Однако для этого мне нужно вручную вводить команду zfs rollback snapshotname@xfcedesktop для каждого снимка, например, так:

# zfs list -t snapshot -o name | grep xfcedesktop
zroot@xfcedesktop
zroot/ROOT@xfcedesktop
zroot/ROOT/default@xfcedesktop
zroot/home@xfcedesktop
zroot/home/zoliky@xfcedesktop
zroot/tmp@xfcedesktop
zroot/usr@xfcedesktop
zroot/usr/ports@xfcedesktop
zroot/usr/src@xfcedesktop
zroot/var@xfcedesktop
zroot/var/audit@xfcedesktop
zroot/var/crash@xfcedesktop
zroot/var/log@xfcedesktop
zroot/var/mail@xfcedesktop
zroot/var/tmp@xfcedesktop

# теперь мне нужно ввести это для каждой строки:
zfs rollback zroot@xfcedesktop
zfs rollback zroot/ROOT@xfcedesktop
zfs rollback zroot/ROOT/default@xfcedesktop
.. и так далее

Это отнимает много времени и подвержено ошибкам. Интересно, есть ли трюк в оболочке или однострочная команда, которая позволит мне пройтись по выводу grep и выполнить команды отката для каждого снимка. Я использую sh (не bash) на FreeBSD, работающей в однопользовательском режиме. В идеале, я хотел бы, чтобы это было однострочная команда, а не скрипт.

Используйте либо простой цикл while, как в

zfs list -H -t snapshot -o name | grep '@xfcedesktop$' |
while IFS= read -r snapshot; do
    zfs rollback "$snapshot"
done

… или используйте xargs

zfs list -H -t snapshot -o name | grep '@xfcedesktop$' |
xargs -r -I {} zfs rollback {}

Опция -r для xargs поддерживается, но не нужна на FreeBSD. В GNU’s xargs эта опция предотвращает попытку утилиты запустить утилиту, если ввод пуст. Это поведение по умолчанию для FreeBSD’s xargs.

Я также был более осторожен с регулярным выражением, используемым с grep, чтобы убедиться, что мы получаем только ожидаемые снимки (те, которые оканчиваются именно на @xfcedesktop).

Это не копирование-вставка — удалите ## до конца строки. Я использую комментарии ##, чтобы объяснить.

zfs list -t snapshot | grep xfcedesktop | \
  untabify | \ ## замените TABы пробелами.
  cut "-d " -f1 | \ ## первый поле, разделенное пробелом
  xargs -n 1 -r | \ ## применяется по одному элементу к
    echo zfs rollback

Удалите команду echo, когда будете довольны выводом.

Оба решения имеют положительные аспекты. И я обычно использую очень простую команду awk при пакетной обработке файловых систем или снимков ZFS.

Объединив разумное использование -Ho name вместе с подходом “посмотри, прежде чем прыгнешь” с помощью echo-команд, прежде чем выполнять их, я предлагаю:

zfs list -Hrt snap -o name zroot |
    awk '/@xfcedesktop$/ {print "zfs rollback \"" $0 "\""}'

Если вам нравятся команды, которые вы видите, нажмите вверх, чтобы повторить эту команду, и добавьте | sh, чтобы выполнить команды zfs rollback.

Ответ или решение

Вопрос о том, как запустить команду на всех результатах вывода ZFS snapshot в FreeBSD, поднимает несколько аспектов управления файловыми системами, особенно в контексте работы в однопользовательском режиме. В этой ситуации основной целью является автоматизация процесса возврата к конкретному снимку (snapshot) под названием "xfcedesktop" для каждой соответствующей файловой системы, что сильно упрощает администрирование. Рассмотрим способы достижения оптимального решения этой задачи в командной оболочке sh на FreeBSD.

Теория

ZFS (Zettabyte File System) — это современная файловая система, известная своей мощной системой моментальных снимков (snapshots), которые можно использовать для резервного копирования данных и восстановления их до определенного момента времени. Каждая файловая система или том ZFS может иметь несколько снимков, и сам процесс отката к конкретному снимку известен как "rollback".

В описанном сценарии необходимо выполнить откат ко всем снимкам, соответствующим шаблону "xfcedesktop". Вручную выполнять команду zfs rollback snapshotname@xfcedesktop для каждого снимка было бы утомительным и подверженным ошибкам процессом. Таким образом, основной задачей является автоматизация этого процесса с использованием стандартных инструментов оболочки командного интерпретатора (shell).

Примеры

1. Простой цикл while:

Стандартный UNIX-командный интерпретатор (sh) предоставляет простой способ управления списками и повторения команд посредством цикла while. Вот пример командной строки, которая использует этот механизм:

zfs list -H -t snapshot -o name | grep '@xfcedesktop$' |
while IFS= read -r snapshot; do
    zfs rollback "$snapshot"
done
  • Здесь zfs list с параметрами -H, -t snapshot, -o name получает список всех снимков. Опция -H убирает заголовки из вывода, обеспечивая более точную обработку данных.
  • Использование grep '@xfcedesktop$' фильтрует только те снимки, которые оканчиваются на @xfcedesktop.
  • Цикл while проходит по каждому отфильтрованному снимку и выполняет команду zfs rollback, тем самым реализуя запрашиваемый откат.

2. Использование xargs:

Инструмент xargs перерабатывает входные данные в аргументы команды. Пример использования с xargs выглядит следующим образом:

zfs list -H -t snapshot -o name | grep '@xfcedesktop$' |
xargs -I {} zfs rollback {}
  • xargs обеспечивает гибкость, позволяя выполнять команду zfs rollback со списком обнаруженных снимков непосредственно посредством передачи их в виде аргументов.
  • Параметр -I {} указывает xargs заместить {} на имя снимка, переданное в команду zfs rollback.

Практическое применение

Безопасность и проверка:

Перед тем, как непосредственно выполнять операции над системой, крайне важно убедиться в корректности сформированных команд. Одним из методов минимизации рисков является предварительный вывод команд с помощью echo, что позволяет визуально проверить команды на предмет корректности перед их выполнением:

zfs list -H -t snapshot -o name | grep '@xfcedesktop$' |
while IFS= read -r snapshot; do
    echo "zfs rollback $snapshot"
done

После проверки можно убрать echo и выполнить команды.

Альтернативный способ с awk:

Если вам требуется еще более мощный инструмент для манипуляции строками, awk является отличным выбором:

zfs list -Hrt snap -o name zroot |
awk '/@xfcedesktop$/ {print "zfs rollback \"" $0 "\""}' | sh
  • awk здесь используется для фильтрации и формирования команд отката.
  • Команды, сформированные awk, затем передаются на исполнение в sh с помощью конвейера.

Заключение

Автоматизация управления снимками в ZFS через командную строку FreeBSD не только экономит время, но и повышает надежность администрирования. Представленные методы обеспечивают удобство использования и безопасный способ управления снимками. Выбор конкретного метода реализации зависит от ваших предпочтений, но каждый из предложенных вариантов гарантирует существенное упрощение работы с моментальными снимками ZFS.

Оцените материал
Добавить комментарий

Капча загружается...