Pourquoi ce n'est cp --reflink=auto
pas le comportement par défaut? Cela pourrait-il nuire à son activation?
Est-il possible de l'activer au moment de la compilation, afin qu'il soit utilisé dans tout le système, pas seulement dans des shells interactifs?
Réponses:
Ce n'est pas la valeur par défaut, car pour des raisons de robustesse, on peut souhaiter qu'une copie soit effectuée pour se protéger contre la corruption des données. Aussi, pour des raisons de performances, vous souhaiterez peut-être que les écritures se produisent au moment de la copie plutôt qu'un processus sensible à la latence travaillant sur un fichier CoW et retardé par les écritures, éventuellement sur une autre partie d'un disque mécanique. Notez que à partir de coreutils v8.24, mv reflink par défaut, car il n'a pas les contraintes ci-dessus.
la source
Je ne sais pas pourquoi ce n'est pas la valeur par défaut, peut - être pour qu'il se comporte de la même chose que d' autres utilitaires de copie (
rsync
,cpio
,pax
,tar
...) qui ne les supporte pas (ou lorsque les fichiers sont copiés dans une interface qui ne permet pas (comme NFS, samba, fusionner les couches des systèmes de fichiers ...).J'étais dans la même situation il y a quelques années, et en regardant rapidement le code cp GNU, c'est toujours la même chose, vous devez patcher le code pour obtenir un comportement par défaut différent:
la source
Un gros problème est le risque de manquer d'espace pour faire la copie lorsque vous écrivez.
Avec une copie normale, dès que la copie est terminée, vous n'avez jamais à vous soucier de l'échec d'une écriture dans des parties existantes du fichier: l'espace est entièrement alloué et ne disparaîtra pas tant que vous n'aurez pas supprimé le fichier. Mais avec une copie de refixation, il y a toujours un risque qu'à un moment donné des semaines ou des mois, une écriture dans une partie existante du fichier échoue car il n'y avait pas assez d'espace pour faire une copie.
Découvrir que votre système avait fait des copies de reflink derrière votre dos lorsqu'une opération comme celle-ci a échoué serait une très mauvaise surprise.
la source
est plus logique que de patcher le code
la source
/bin/cp
et le remplacer par un script shell similaireDes raisons de robustesse peuvent vouloir qu'une copie soit effectuée pour se protéger contre la «perte» de données.
Nous ne savons pas que c'est la raison, mais les mauvaises choses qui peuvent arriver se limitent à la destruction des médias. La plupart de tous les périphériques de bloc auront une forme d'identification de corruption (crc), sinon une correction d'erreur (parité).
Pas pour des raisons de performances.
CoW se produit lorsque seulement une partie de la? Effacer? le bloc est écrit. Avec le disque! Moderne! périphérique la taille du bloc matériel est un multiple de 4k. Changer une partie du 4k amène le lecteur à lire le 4k entier et à le réécrire, mais en plus de cela, le noyau va faire la même chose donc il n'y aura pas d'écritures partielles atteignant le périphérique de bloc, SSD ou autre . Le noyau doit effectuer le CoW pour les mêmes raisons, sauf si nous avons une copie en cache, nous ne pouvons pas créer les données qui existent dans les autres parties de l'appareil, sauf pour la fin du conte d'un fichier, mais le point est discutable. Mais la mise en cache d'une copie d'un fichier et la copie d'un fichier sont différentes opérations différentes, la première est beaucoup moins chère.
L'adresse de l'écriture est sans importance, mais faites savoir que "une partie inutilisée de l'appareil" est moins chère à découvrir que "où résident actuellement les blocs du fichier".
Le fait est que toute méthode CoW est moins chère ou équivalente à la simple mise à jour d'un périphérique bloc. Maintenant, si nous ne parlions pas de blocs, alors ce serait une autre histoire ... écrite quelque part sur bande.
la source