8 votes

Est-il possible de cloner des répertoires en APFS?

APFS soi-disant

offre la duplication pour les fichiers et répertoires

J'aimerais comprendre comment cela fonctionne, mais je ne trouve pas de moyen d'utiliser cette fonctionnalité.

La seule page de manuel qui semble vaguement pertinente est clonefile(2), qui dit :

Si src désigne un répertoire, la hiérarchie des répertoires est dupliquée comme si chaque élément était cloné individuellement. Cependant, l'utilisation de copyfile(3) est plus appropriée pour copier de grandes hiérarchies de répertoires au lieu de clonefile(2)

Mais lorsque vous consultez la page de manuel pour copyfile(3), il est dit :

Remarquez également qu'il n'y a pas de support pour la duplication de répertoires : si un répertoire est fourni en tant que source, une erreur sera renvoyée. (Ceci est uniquement applicable pour la fonction copyfile().)

Cela est encore clarifié plus loin dans la page :

Parce que copyfile() ne permet pas la duplication de répertoires, un clonage récursif va plutôt copier tout répertoire qu'il trouve (tout en clonant son contenu).

Cependant, quelques articles de blog sur le sujet semblent suggérer que Finder peut effectuer cette opération en utilisant la combinaison option + glisser-déposer de la souris, mais quand je le teste ici, cela semble identique à une copie récursive et ne clone même pas les fichiers contenus, encore moins le répertoire.

Alors, qu'en est-il vraiment ici ? La fonctionnalité est-elle implémentée ? Si c'est le cas, comment puis-je la faire fonctionner ? Ou est-ce quelque chose qu'ils ont implémenté dans le format sur disque mais jamais raccordé à des API ou des outils ?

7voto

SuperDuck Points 1026

clonefile() est l'appel système qui vous intéresse. Il a été introduit dans macOS 10.12 (Sierra), en même temps que la version bêta publique de l'APFS.

copyfile() est une fonction de bibliothèque C qui a été introduite dans Mac OS X 10.5 (Leopard). Comme vous l'avez vu dans la page de manuel, bien qu'elle prenne en charge la copie de fichiers, ce n'est pas le comportement par défaut.

Je ne sais pas pourquoi clonefile(2) indique que "l'utilisation de copyfile(3) est plus appropriée pour copier de vastes hiérarchies de répertoires au lieu de clonefile(2)" — Je suppose que c'est pour des raisons d'efficacité. Quoi qu'il en soit, ces deux API vous permettront de cloner des fichiers sans dupliquer les étendues de fichiers sur le disque.

Je peux confirmer que, du moins pour moi, macOS 10.15 (Catalina) clone des fichiers volumineux lors de leur "copie" dans Finder, que ce soit en utilisant CMD-C et CMD-V, ou le glisser-déposer ALT. Il en va de même pour les répertoires, dans le sens décrit dans clonefile(2). Autrement dit, tous les répertoires concernés sont copiés (de nouveaux inodes et dentries apparaîtront sur le disque), et tous les fichiers concernés sont clonés.

Il est bon de noter que, pour être conforme à POSIX, cp est censé effectuer des copies non-clonées (dupliquer les étendues de fichiers sur le disque), mais en l'utilisant avec le drapeau -c, vous pouvez remplacer ce comportement et cloner les fichiers via clonefile() à la place — voir cp(1). Le comportement est identique à celui du drapeau --reflink de la commande cp sous Linux, que vous connaissez peut-être si vous utilisez ZFS ou similaire.

Ainsi, cp -Rc est ce que vous cherchez si vous voulez cloner des répertoires dans le terminal. Je ne sais pas quand ce drapeau a été introduit, mais c'était probablement en même temps que la sortie de clonefile() dans macOS 10.12. Selon cette présentation (fichier MP4 de 1,28 Go) de Tim Standing, c'est en tout cas le cas pour les versions publiques de macOS depuis janvier 2018.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X