Un système de fichiers implémente-t-il un mécanisme de copie sur écriture pour CP

16

Nous avons vu le système d'exploitation faire l'optimisation de la copie en écriture lors du démarrage d'un processus. La raison étant que la plupart du temps, fork est exécuté par exec, nous ne voulons donc pas encourir le coût des allocations de pages et copier les données de l'espace d'adressage de l'appelant inutilement.

Cela se produit également lorsque vous faites du CP sur un Linux avec des systèmes de fichiers ext4 ou xfs (journalisation). Si cela ne se produit pas, alors pourquoi pas?

Mridul Verma
la source
J'espère que quelqu'un répondra à cette question intéressante
Karim Manaouil
Cependant, je ne le pense pas parce que, par exemple, reculer un gros fichier prendrait beaucoup plus de temps (copier des données vers de nouveaux blocs). S'il y avait un COW dans de tels systèmes de fichiers (ext3 / ext4 au moins), vous ne remarqueriez pas la latence temporelle (peut-être que dans ce cas, ne répliquer l'inode sans pointeurs vers des blocs de données et marquer un indicateur COW).
Karim Manaouil
Copy-on-Write est implémenté sur ZFS, et il a en effet des clones de système de fichiers / volume très bon marché. ext4 / xfs ont un format sur disque trop primitif, je crois, pour le supporter
myaut

Réponses:

7

Le mot-clé à rechercher est reflink. Il a été récemment implémenté dans XFS.

EDIT: l'implémentation XFS était initialement marquée EXPERIMENTAL. Cet avertissement a été supprimé dans la version 4.16 du noyau, un certain nombre de mois après avoir écrit ce qui précède :-).

sourcejedi
la source
11

Depuis la cp page de manuel :

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.

Cela fonctionne sur les systèmes de fichiers qui prennent en charge la copie sur écriture ( reflink ), principalement BTRFS pour le moment. L'implémentation du reflink XFS est en cours de développement [1] [2] .

sebasth
la source
1
Certains systèmes de fichiers réseau comme NFS, CIFS, OCFS2 peuvent également les transmettre au serveur.
Stéphane Chazelas
2

Linux a un appel système qui permet aux processus de l'espace utilisateur de dire au noyau de faire une copie sur des copies d'écriture des fichiers. FICLONERANGE et FICLONE utilisés comme options pour ioctl autoriser la copie sur écriture de copies de fichiers et de plages dans les fichiers.

Il est utilisé par cp --reflink pour effectuer les copies là où le système de fichiers le prend en charge.

Q l'ornithorynque
la source
1

Sauf si vous introduisez un syscall pour cp(ou du moins pour copier un bloc), le système d'exploitation a du mal à comprendre que les données que le cpprogramme va écrire sont les mêmes que celles qu'il vient de lire à partir d'un autre bloc. En plus de cela, vous auriez des frais supplémentaires pour gérer le scénario "plusieurs fichiers partagent les mêmes blocs". Les gros fichiers similaires qui ne diffèrent que dans quelques blocs se produisent rarement. Il est donc moins cher dans l'ensemble de simplement copier ces blocs, puis d'ajouter cette surcharge administrative à tous les fichiers.

Maintenant, si vous "copiez" des fichiers (beaucoup d'entre eux) en ajoutant un autre clone / instantané du système de fichiers dans, disons, BTRFS, la situation est différente: vous avez maintenant "copié" tous les fichiers du système de fichiers, et toutes les modifications apportées à ils seront copiés sur écriture. Cela existe, mais pas dans ext4.

"Journalling" est un concept complètement indépendant de cela, ce sont les structures administratives des fichiers qui comptent.

dirkt
la source
Les fichiers volumineux, l'un étant une copie binaire des autres fois extrêmement rares, diffèrent en un seul bit et ce qui se produit est dû à une erreur.
bitifet
Un appel système pour copie a été introduit (voir ma réponse).
Q l'ornithorynque