Проверьте, существует ли подуровень btrfs

439
prometheos

У меня проблема в процедуре bash, которая должна портировать мою старую резервную копию диска rsync (и архив) в мою будущую резервную копию снимка btrfs.

Я хочу использовать строку:

 # btrfs subvolume snapshot /targetdir/@monthly.9 /targetdir/@monthly.8 

Если моментальный снимок /targetdir/@monthly.8 не существует, то он создается, как я хочу.

Но если /targetdir/@monthly.8 уже был там, то вместо него создается /targetdir/@monthly.8/@onthly.9.

Я пропускаю здесь тест на существование, скажем:

# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap! 

Как я могу преодолеть эту проблему?

0
Мой btrfs-progs v4.4 здесь, на ubuntu 16.4 (ежедневно обновляется), кажется, слишком сильно интерпретирует человека btrfs-subvolume, который говорит: "... snapshot [-r] | [/] ... Если только дается, подобъем будет назван базовым именем «Похоже, что неявно добавить:« Если / имя уже существует, затем создать // $ (Базовое Я бы назвал это ошибкой или злой особенностью. prometheos 6 лет назад 0

2 ответа на вопрос

0
Kamil Maciorowski

Я думаю, вы не хотите бежать, btrfs subvolume snapshot …если /targetdir/@monthly.8существует, независимо от того, что это такое. Просто проверьте, существует ли он:

[ -e /targetdir/@monthly.8 ] 

или не существует

[ ! -e /targetdir/@monthly.8 ] 

что бы ни было более полезным. Если оно существует, тогда не должно быть btrfs subvolume delete. Только если эта команда возвращает ERROR: not a subvolume, беспокоиться о том, что это за объект. Я советую вам организовать ваш рабочий процесс, подчиненные тома, точки монтирования, каталоги и их разрешения таким образом, чтобы он @monthly.8мог быть только подчиненным.


Но если вам действительно нужно знать

btrfs subvolume show /targetdir/@monthly.8 

преуспеет, если это подобъем; иначе не получится. Пример:

btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!" 
Я хотел бы добавить свою команду в качестве дополнительной опции в вашем ответе. Затем я удаляю свой ответ, чтобы немного ослабить спор. Я не думаю, что я такой привередливый! prometheos 6 лет назад 0
@prometheos См. [* Могу ли я ответить на свой вопрос? *] (https://superuser.com/help/self-answer) Наши ответы могут сосуществовать. Вы можете принять свой собственный ответ, если он вам больше подходит. Kamil Maciorowski 6 лет назад 0
0
prometheos

Ответ @Kamil Maciorowski хороший. Но позвольте мне сосредоточиться на тесте на существование.

Скажем, я отлаживаю, и мне нужно повторить попытку, и целевой снимок уже был там. Тогда я был очень осторожен и сидел "bash -e" (то есть первая ошибка выходит из моей оболочки. Помните, что я должен запустить ее как root ...). Затем я предпочитаю команду, которая сообщает мне, что произошло, а затем выходит. Поэтому я делаю:

 btrfs subvolume list /targetdir/@monthly.9 | grep @monthly.8 && echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit 

Команда «subvolume list» не выдает ошибок и перечисляет их все. Затем я фильтрую по мере необходимости и принимаю решения.

К сожалению! Почему мой ответ прыгнул на вершину? Я думал, что они идут в хронологическом порядке, если у них нет голосов. prometheos 6 лет назад 0
Хронологически, если вы нажмете «самый старый» чуть выше первого ответа. Это зависит от предпочтений пользователя, и сайт не является форумом. Kamil Maciorowski 6 лет назад 0
Я надеюсь, что вы знаете, что он не проверяет точно `` targettdir / @ month.8`. Я думаю, что любой подобъем с `@ month.8` в своем пути (я имею в виду внутренний путь в файловой системе) вызовет` echo`, даже если этот конкретный подобъем недоступен в вашем дереве каталогов в данный момент. Мое решение, с другой стороны, тестирует именно тот объект, который отображается как `/ targettdir / @ month.8` в дереве каталогов. Kamil Maciorowski 6 лет назад 0

Похожие вопросы