Pourquoi «cp -R --reflink = always» effectue-t-il une copie standard sur un système de fichiers btrfs?

12

Btrfs prend en charge la copie sur écriture. J'ai essayé d'utiliser cette fonctionnalité pour cloner un répertoire:

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

Je m'attendais à ce que la commande se termine presque instantanément (comme un btrfs subvolume snapshot), mais la cpcommande semble effectuer une copie lente et standard.

Selon la page de manuel, je m'attendrais --reflink=alwaysà appliquer la copie sur écriture:

Lorsque --reflink [= toujours] est spécifié, effectuez une copie légère, où les blocs de données sont copiés uniquement lorsqu'ils sont modifiés. Si cela n'est pas possible, la copie échoue ou si --reflink = auto est spécifié, retournez à une copie standard.

Des questions:

  • Savez-vous pourquoi --reflink=alwaysça ne marche pas?
  • Quelles options (ou autres commandes) dois-je utiliser à la place?
Philipp Claßen
la source

Réponses:

20

cp --reflink=alwaysfonctionne presque certainement correctement. Si ce n'était pas le cas, vous obtiendriez une erreur. De par sa conception, c'est la différence entre --reflink=alwayset --reflink=auto. L'erreur ressemblerait à ceci:

# 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

Copiez-vous une structure de répertoires avec beaucoup de petits fichiers? Dans ce cas, il faut cptoujours créer chaque répertoire et ouvrir et fermer chaque fichier, donc cela prendra encore du temps, contrairement à btrfs subvolume snapshot. Cela explique très probablement le temps nécessaire pour effectuer l'opération.

Celada
la source
3
Oui, il contient un grand nombre de fichiers, pour la plupart de petits fichiers texte. Je ne savais pas que cp devait encore traiter chaque fichier. Merci, c'était la partie que je ne comprenais pas. Je pense que dans mon cas d'utilisation, il est préférable de créer un instantané accessible en écriture.
Philipp Claßen
1
Oui, si vous pouvez créer un instantané, allez-y. cp --reflink=alwayspeut toujours être utile lorsque ce que vous essayez de cloner n'est pas la racine d'un sous-volume, car il btrfs subvolume snapshotne fonctionne que sur des sous-volumes, pas sur des portions de sous-volumes.
Celada