¿Por qué "cp -R --reflink = always" realiza una copia estándar en un sistema de archivos btrfs?

12

Btrfs admite copia en escritura. Traté de usar esa función para clonar un directorio:

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

Esperaba que el comando terminara casi al instante (como un btrfs subvolume snapshot), pero el cpcomando parece realizar una copia lenta y estándar.

De acuerdo con la página del manual, esperaría --reflink=alwaysaplicar Copiar en escritura:

Cuando se especifica --reflink [= always], realice una copia ligera, donde los bloques de datos se copian solo cuando se modifican. Si esto no es posible, la copia falla, o si se especifica --reflink = auto, retroceda a una copia estándar.

Preguntas:

  • ¿Sabes por qué --reflink=alwaysno funciona?
  • ¿Qué opciones (u otros comandos) debo usar en su lugar?
Philipp Claßen
fuente

Respuestas:

20

cp --reflink=alwaysEs casi seguro que funciona correctamente. Si no fuera así, obtendría un error. Por diseño, esa es la diferencia entre --reflink=alwaysy --reflink=auto. El error se vería así:

# 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

¿Está copiando una estructura de directorio con muchos archivos pequeños? En ese caso, cptodavía tiene que crear cada directorio y abrir y cerrar cada archivo, por lo que aún llevará tiempo, a diferencia btrfs subvolume snapshot. Eso probablemente explica el tiempo que lleva realizar la operación.

Celada
fuente
3
Sí, contiene una gran cantidad de archivos, la mayoría de ellos pequeños archivos de texto. No sabía que cp todavía tiene que procesar cada archivo. Gracias, esa fue la parte que no entendí. Creo que en mi caso de uso, es mejor crear una instantánea grabable.
Philipp Claßen
1
Sí, si puedes crear una instantánea, entonces hazlo. cp --reflink=alwaysTodavía puede ser útil cuando lo que está intentando clonar no es la raíz de un subvolumen, ya que btrfs subvolume snapshotsolo opera en subvolúmenes, no en porciones de subvolúmenes.
Celada