Почему «cp -R --reflink = всегда» выполняет стандартное копирование в файловой системе btrfs?

12

Btrfs поддерживает копирование при записи. Я попытался использовать эту функцию для клонирования каталога:

cp -R --reflink=always foo_directory foo_directory.mirror

Я ожидал, что команда завершится почти мгновенно (например, a btrfs subvolume snapshot), но cpкоманда, кажется, выполняет медленное, стандартное копирование.

Согласно справочной странице, я бы ожидал --reflink=alwaysпринудительного выполнения Copy-On-Write:

Если указан параметр --reflink [= всегда], выполните упрощенное копирование, при котором блоки данных копируются только после изменения. Если это невозможно, копирование завершится неудачно или если задано --reflink = auto, вернитесь к стандартной копии.

Вопросов:

  • Вы знаете, почему --reflink=alwaysне работает?
  • Какие опции (или другие команды) я должен использовать вместо этого?
Филипп Классен
источник

Ответы:

20

cp --reflink=alwaysпочти наверняка работает правильно. Если бы это было не так, вы бы получили ошибку. По дизайну это разница между --reflink=alwaysи --reflink=auto. Ошибка будет выглядеть так:

# Filesystem that does not support the feature at all
cp: failed to clone `xx' from `yy': Inappropriate ioctl for device

# Filesystem that does support it, but copy across filesystems
cp: failed to clone `xx' from `yy': Invalid cross-device link

Вы копируете структуру каталогов с большим количеством маленьких файлов? В этом случае cpвсе равно придется создавать каждый каталог, открывать и закрывать каждый файл, так что в отличие от этого, все равно потребуется время btrfs subvolume snapshot. Это, скорее всего, объясняет время, необходимое для выполнения операции.

Celada
источник
3
Да, он содержит огромное количество файлов, большинство из них небольшие текстовые файлы. Я не знал, что cp все еще должен обрабатывать каждый файл. Спасибо, это была часть, которую я не понял. Я думаю, в моем случае лучше создать записываемый снимок.
Филипп Классен
1
Да, если вы можете создать снимок, то сделайте это. cp --reflink=alwaysвсе еще может пригодиться, когда то, что вы пытаетесь клонировать, не является корнем подобъема, поскольку btrfs subvolume snapshotдействует только на подобъемы, а не на части подобъемов.
Селада