Можно ли создать моментальный снимок BTRFS для каталога?

Это действительно то, что вам решать. То, что может повлиять на это решение, может быть связано с тем, хорошо ли оно выглядит или читабельно. С точки зрения скорости выполнения, это не имело бы большого значения.

Возможность создания трех подкаталогов в уже существующем каталоге/path/to/dir:

mkdir /path/to/dir/a \
      /path/to/dir/b \
      /path/to/dir/b
( cd /path/to/dir && mkdir a b c )

(подоболочка позволяет пропустить cdобратно в исходный рабочий каталог)

С оболочкой, которая знает раскрытие фигурных скобок (, это по существу то же самое, что и версияcd-без вышеизложенного, поскольку оболочка расширит раскрытие фигурных скобок перед вызовомmkdir):

mkdir /path/to/dir/{a,b,c}

Утилита mkdir, скорее всего, будет использовать функцию mkdir()библиотеки C. Эта функция не изменяет рабочие каталоги перед созданием каталога, для создания которого она предназначена 1 .

Другое дело, когда вы запускаете скрипты, которым важно выполняться в определенном рабочем каталоге. Если скрипт ожидает найти файлы, используя относительные пути из своего текущего рабочего каталога, то, очевидно, вам придется убедиться, что рабочий каталог правильный, прежде чем запускать команду, возможно, с помощью

( cd directory && thescript )

... если скрипт не сделает это сам.


1 Небольшое исправление :В Linux командаmkdir -p a/b/cбудет вызывать mkdir("a"),chdir("a"), mkdir("b"), chdir("b"), mkdir("c"), а в OpenBSD будет просто вызывать mkdir("a"), mkdir("a/b"), mkdir("a/b/c"). В Linux создание дополнительного одиночного каталога a/b/c/dс mkdir a/b/c/dвызовет просто mkdir("a/b/c/d").

Таким образом, в Linux mkdir -pдействительно будет внутренне "выполнять cd" для каждого промежуточного пути при создании каталогов (, тогда как mkdirбез -pэтого не делает ).

Флаг -pдля утилиты mkdirзаставляет ее создавать любой отсутствующий промежуточный каталог, и очевидно, что разработчики BSD и Linux делают это немного по-разному.

0
08.01.2021, 01:38
2 ответа

Мне не известен простой способ. Я бы сказал нет, это невозможно напрямую.

Если бы admin2/был подобъемом, тогда не было бы проблем. Я не думаю, что вы можете прозрачно и мгновенно преобразовать каталог в подтом.

Есть обходной путь:

  1. Создайте снимок всего подтома, который содержит admin2/.

  2. Удалите из снимка все, кроме admin2/*.

  3. Изменение порядка данных в снимке:

    • переместить содержимоеadmin2/*в каталог верхнего -уровня моментального снимка;
    • удалить остатки (напр. Каталог admin2/*, теперь пустой )из моментального снимка.
  4. Измените владельца и режим каталога верхнего уровня -моментального снимка в соответствии с исходным каталогом admin2/.

Таким образом, вы вручную создаете подтом, который является тем, что вам нужно :снимком каталога.

Если вы хотите повторить этот процесс в будущем, рассмотрите возможность замены исходного каталога подтомом. Переместите каталог в сторону (, переименуйте или удалите его ), затем переместите подтом на его место. Обратите внимание, что подтом становится /home/admin2/, так что вы, скорее всего, захотите создать еще один снимок.Но теперь создать снимок легко, команда, которую вы попробовали, теперь должна работать.


*Не путайте admin2/в снимке с исходным каталогом. Там, где я обозначаю admin2/звездочкой, я имею в виду admin2/на снимке.


Мета-примечание :Честно говоря, я почти продублировал этот другой ответ . Вопрос заключается в преобразовании каталога в подтом, что вы можете или не хотите делать. Из-за этой разницы я не просто указал вам на другой ответ; Я решил объяснить процедуру в контексте вашего вопроса. Но разница в основном в вопросе. Единственная разница в процедуре заключается в том, измените ли вы в конечном итоге несколько имен или нет. Если вы найдете мой ответ полезным, подумайте о том, чтобы проголосовать за связанный.

2
18.03.2021, 22:37

Моментальные снимки можно делать только для подтомов. Не существует прямого способа преобразовать каталог в подтом.

Но если вам нужна только копия каталога с теми же данными на диске, вы можете следовать BTRFS Wiki и использоватьcp --reflink:

cp -ax --reflink=always src/. dest

Это создаст обычную копию вашего каталога, но вместо копирования всех файловых данных они будут общими (= reflinked )с исходным каталогом. По сути, это то же самое, что и моментальный снимок, и если вы хотите иметь копию в отдельном подтоме, вы можете просто создать пустой подтом и скопировать в него каталог.

В зависимости от ваших данных это может быть быстрее, чем ответ @Kamils ​​, потому что удаление всех остальных файлов может занять некоторое время для огромного количества файлов.

1
18.03.2021, 22:37

Теги

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