Вопрос или проблема
Когда я загружаюсь в однопользовательский режим и перечисляю снимки 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.