¿Algún sistema de archivos implementa el mecanismo de copia en escritura para CP

16

Hemos visto que el sistema operativo realiza la optimización de Copia en escritura al bifurcar un proceso. La razón es que la mayoría de las veces la bifurcación es ejecutada por un ejecutivo, por lo que no queremos incurrir en el costo de las asignaciones de páginas y la copia innecesaria de los datos del espacio de direcciones de la persona que llama.

Esto también sucede cuando se hace CP en un linux con sistemas de archivos ext4 o xfs (journaling). Si no sucede, entonces ¿por qué no?

Mridul Verma
fuente
Espero que alguien responda esta pregunta interesante
Karim Manaouil
Sin embargo, no lo creo porque, por ejemplo, copiar un archivo grande llevaría mucho más tiempo (copiar datos en nuevos bloques). Si hubiera una VACA en dichos sistemas de archivos (ext3 / ext4 al menos) no notaría la latencia de tiempo (tal vez en tal caso solo replicaría el inodo sin punteros a los bloques de datos y marcaría alguna bandera de VACA).
Karim Manaouil
Copy-on-Write se implementa en ZFS, y tiene clones de volumen / sistema de archivos muy baratos. ext4 / xfs tiene un formato de disco demasiado primitivo, creo, para soportar eso
myaut

Respuestas:

7

La palabra clave para buscar es reflink. Recientemente se implementó en XFS.

EDITAR: la implementación de XFS se marcó inicialmente como EXPERIMENTAL. Esta advertencia se eliminó en la versión 4.16 del kernel, varios meses después de que escribí lo anterior :-).

sourcejedi
fuente
11

Desde la cp página del manual :

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.

Esto funciona en sistemas de archivos que admiten Copia en escritura ( reflink ), principalmente BTRFS en este momento. La implementación de XFS reflink está en desarrollo [1] [2] .

sebasth
fuente
1
Algunos sistemas de archivos de red como NFS, CIFS, OCFS2 también pueden pasarlos al servidor.
Stéphane Chazelas
2

Linux tiene una llamada al sistema que permite que los procesos del espacio de usuario le digan al núcleo que haga copias de copias de escritura de archivos. FICLONERANGE y FICLONE utilizados como opciones para ioctl permiten realizar copias de escritura y escritura de archivos y rangos dentro de los archivos.

Esto lo utiliza cp --reflink para hacer las copias donde el sistema de archivos lo admite.

Q el ornitorrinco
fuente
1

A menos que introduzca una llamada al sistema cp(o al menos para copiar un bloque), el sistema operativo tiene dificultades para darse cuenta de que los datos que el cpprograma va a escribir son los mismos que acaba de leer de otro bloque. Además de eso, tendría una sobrecarga adicional para administrar el escenario "varios archivos comparten los mismos bloques". Los archivos similares grandes que solo difieren en pocos bloques ocurren raramente. Por lo tanto, en general es más barato copiar esos bloques y luego agregar esta sobrecarga administrativa a todos los archivos.

Ahora, si "copia" archivos (muchos de ellos) agregando otro clon / instantánea del sistema de archivos en, por ejemplo, BTRFS, la situación es diferente: ahora ha "copiado" todos los archivos en el sistema de archivos y cualquier cambio en ellos serán copia en escritura. Esto existe, pero no en ext4.

"Journalling" es un concepto completamente independiente de eso, son las estructuras administrativas para los archivos que cuentan.

dirkt
fuente
Los archivos grandes, uno de los cuales es una copia binaria de los otros, extremadamente raros, difieren en un solo bit y, debido a un error.
bitifet
Se ha introducido una llamada al sistema para copiar (ver mi respuesta).
Q the Ornitorrinco