Dans RHEL / CentOS 7, mv fait-il réellement un cp & rm sur le même système de files?

À la lumière des réponses aux deux questions précédentes , il semble que sous RHEL / CentOS 7 mv même sur le même système de files fait réellement un cp puis rm .

Dans les éditions précédentes de CentOS / RHEL, un mv sur le même système de files (même d'un directory profond à un nouveau directory profond) était très rapide même sur des files volumineux.

Cependant, sur mon server CentOS personnel, lorsque je regarde ce que mv fait en fait lors du déplacement de files volumineux, cela prend aussi longtime qu'un cp suivi de rm .

Ce qui me fait me requestr pourquoi le comportement a apparemment changé d'être un wrapper à rename() (selon la norme POSIX ).

Est-ce correct? Et, si oui, pourquoi l'utilitaire mv changé de comportement dans CentOS 7?

La command CentOS 7.2 mv essaiera d'utiliser l'appel rename(3) .

par exemple si je fais strace mv XY alors je vois dans la sortie

 rename("X", "Y") = 0 

Nous pouvons donc voir que mv réussi à renommer.

Si, à la place, j'essaie de renommer ce directory sur un autre disque:

 rename("X", "/home/sweh/X") = -1 EXDEV (Invalid cross-device link) 

Nous pouvons voir que mv essayé d'utiliser l'appel rename() et cela a échoué. À ce stade, il commence à faire du travail récursif

 rmdir("/home/sweh/X") = -1 ENOENT (No such file or directory) mkdir("/home/sweh/X", 0700) = 0 lstat("/home/sweh/X", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0 openat(AT_FDCWD, "X", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 getdents(3, /* 2 ensortinges */, 32768) = 48 

Ici, nous pouvons voir qu'il est fait le directory cible, puis a commencé à lire le directory courant pour faire la copy lente / supprimer.

Nous pouvons donc conclure que mv essaiera d'utiliser l'appel fast rename() et ne retombera dans la version lente que si cela échoue.