Advertencia: este artículo se aplica a todos los sistemas de archivos CoW en Linux que admiten reflink al copiar. Por el momento, estos son: BTRFS, XFS y OCFS2.
Abstenerse de holivars sobre qué FS es mejor: Btrfs, XFS, Reiser4, NILFS2, ZFS o algunos no mencionados.Antecedentes
- 21 de julio de 2001 - Namesys publica el anuncio de Reiser4 . DARPA patrocina el desarrollo.
- 20 de noviembre de 2003 - Namesys publica algunos puntos de referencia de Reiser4 .
- 24 de agosto de 2004 - Namesys hace un lanzamiento público de Reiser4 .
- 14 de septiembre de 2004: anuncio de ZFS.
- 16 de noviembre de 2005: ZFS se incluye en OpenSolaris build 27.
- Septiembre de 2006: Hans Reiser arrestado por matar a su esposa, Nina Reiser. Principio del fin de Namesys
- 12 de junio de 2007: anuncio de Btrfs por Chris Mason (ex empleado de Namesys).
- 22 de septiembre de 2011: en ZFSonLinux apareció un ticket con una solicitud de implementación de reflink.
- 2012 - Btrfs reconocido como Oracle Linux estable y SUSE Linux Enterprise
- 21 de enero de 2013: la etiqueta del experimento se eliminó con Btrfs en el código fuente del kernel de Linux.
- Mayo de 2019: Btrfs eliminado de RHEL 8 (razones políticas ocultas sospechosas como Btrfs promovidas por Oracle)
Copiar las expectativas en los sistemas de archivos CoW
Cuando se anunció Reiser4 en 2001, me sentí inspirado y apasionado por Copy-on-Write. ¡Solo piense, podemos tener fácil y simplemente tantas copias de diferentes proyectos como desee, y físicamente el disco solo almacenará diferencias entre ellos!
Además, la velocidad de copia debería crecer indecentemente. Debido al hecho de que al copiar, solo se creará un enlace de referencia al archivo anterior. Al escribir en un archivo nuevo, los sectores para los datos modificados se asignarán automáticamente. Como resultado, tendríamos los mismos sectores para las partes comunes de los archivos, y diferentes partes se registrarían en diferentes sectores.
Luego parecía una panacea para crear cuentas para alojamiento compartido, y ahora es la mejor solución para máquinas virtuales y contenedores livianos. Después de todo, no podíamos desperdiciar espacio en archivos idénticos, al mismo tiempo que permitíamos a los usuarios cambiarlos fácilmente.
Sin embargo, Hans Riser se fue al techo y mató a su esposa, y su creación (muy probablemente por razones políticas) no se incluyó en el núcleo. Tal vez la historia todavía depende del individuo.
ZFS se publicó bajo una licencia incompatible con Linux y, por lo tanto, no se incluyó en el núcleo. Por lo tanto, la introducción de ZFS en Linux se ralentizó durante mucho tiempo.
Después de eso comencé a esperar a Btrfs. Y solo 6 años después del anuncio, los desarrolladores del kernel de Linux lo reconocieron como estable.
Después de eso, no tuve prisa por usar los sistemas Cow, ya que el paradigma de Copiar en escritura implica una mayor fragmentación, porque los cambios de datos se escriben en un lugar nuevo cada vez.
Para HDD, la fragmentación mata el rendimiento, ya que el proceso de reposicionamiento del bloque de cabezales de lectura es una operación muy larga.
Por lo tanto, personalmente pospuse la implementación de btrfs en mis máquinas hasta que cambiaron a SSD.
Observo que a los SSD tampoco les gusta la fragmentación, todos saben que para un SSD, la escritura / lectura lineal puede ser decenas de veces más rápida que el acceso aleatorio.
Pero el rendimiento de un SSD fragmentado no es tan dramático como el de un HDD.
Entonces, ¿qué pasa con la velocidad de copia con CoW?
Y finalmente, ha llegado el momento. Cuando los SSD se volvieron lo suficientemente confiables, comencé a usar sistemas de archivos CoW con might y main. Más específicamente, Btrfs y Nilfs2.
Dominando las emocionantes posibilidades de las instantáneas, por un tiempo olvidé mis expectativas de la década de 2000 sobre la copia ultrarrápida de archivos.
Después de un tiempo, decidí realizar pruebas. Y para mi gran decepción, no vi ningún aumento de velocidad de CoW al copiar. Aquí está el resultado en un SSD SATA:
time cp -a /usr /usr1 real 0m15,572s user 0m0,240s sys 0m4,739s
Resultó que para usar CoW necesitas especificar una clave especial.
time cp -a --reflink=auto /usr /usr2 real 0m3,166s user 0m0,178s sys 0m2,891s
Solo en este caso vemos una ventaja de 5 veces. Por cierto, el tamaño de la ventaja crece indefinidamente al aumentar la longitud del archivo. La carpeta
/usr
que copié es principalmente archivos pequeños.
Me sorprendió increíblemente por qué la ventaja clave del sistema de archivos CoW no se usa por defecto. De hecho, ¡para esto fue creada!
En este caso, probé copiando en la sección Btrfs. Pero obtendrá un resultado similar con cualquier otro sistema de archivos CoW que admita reflink.
¿Cuál es el problema, Billy?
El problema está en cp. Por defecto, no usa CoW al copiar. Aunque puede.
Puedes decir: no uso cp. Sin embargo, bajo el capó de Linux, se usa en casi todas partes. Muchos programas, cuando necesitan copiar algo, usan cp
, y no sus "bicicletas".
¿Por qué los desarrolladores de coreutils tomaron una decisión tan ambigua, que tachó la mitad de las ventajas de los sistemas de archivos CoW?
Resulta que eso es lo que decidió Pádraig Brady, responsable del desarrollo de los coreutils de GNU.
Aquí está su lógica :
- Por defecto, cp no usa CoW, ya que alguien puede usar la copia para aumentar la probabilidad de guardar el archivo en el disco después de la destrucción del sistema de archivos.
- En términos de rendimiento, si hay algún tipo de proceso sensible al retraso, es posible que desee que el registro principal se haga durante la copia, por lo que si esto sucede más tarde, puede haber un retraso al reposicionar los cabezales del disco duro. Tenga en cuenta que a partir de la versión 8.24 coreutils, mv usa la opción reflink por defecto.
Pádraig Brady texto de respuesta en inglésNo es el valor predeterminado ya que, por razones de robustez, es posible que desee una copia para proteger contra la corrupción de datos. También, por razones de rendimiento, es posible que desee que las escrituras se realicen en el momento de la copia en lugar de que algún proceso sensible a la latencia trabaje en un archivo CoW y se retrase posiblemente por las escrituras en una parte diferente de un disco mecánico. Tenga en cuenta que desde coreutils v8.24 mv se vinculará de forma predeterminada, ya que no tiene las restricciones anteriores.
En términos de velocidad para mv, prácticamente no hay beneficio de CoW al mover archivos. Dentro de un solo sistema de archivos, mv casi siempre funciona muy rápido.
Nuevamente, surge la cuestión de la influencia de la personalidad en la historia. Al poner varias letras en el código fuente del programa de manera diferente, puede ralentizar el copiado para decenas / cientos de millones de usuarios (aquí debe tener en cuenta que ahora la mayoría de las personas usan servicios en la nube de una forma u otra, incluso si no tienen una computadora), reduzca la eficiencia del uso de unidades y aumentar sus ventas en todo el mundo.
Análisis del argumento Pádraig
El primer argumento tiene algún sentido. Los usuarios sin experiencia pueden hacer copias de seguridad de archivos valiosos en el mismo sistema de archivos.
Segundo argumento Si lee más comentarios sobre los retrasos de Pádraig, encontrará que tenía en cuenta las situaciones de la base de datos en las que al escribir en un archivo existente, puede haber un retraso debido a que el sistema de archivos busca espacio libre. Pero en el caso del sistema de archivos CoW, siempre se buscarán nuevos sectores para la grabación debido a la naturaleza de CoW, como señaló Jan Kanis. Por lo tanto, en mi opinión, el segundo argumento es insostenible.
Sin embargo, en los sistemas CoW, de hecho, es posible obtener un retraso o incluso el error "Sin espacio" al escribir en el archivo de la base de datos. Para evitar esto, debe crear inicialmente un directorio vacío con CoW deshabilitado para la base de datos.
Deshabilite CoW en el directorio / archivo de esta manera:
chattr +C /dir/file chattr +C /dir/dir
También existe la opción de montar nodatacow. Se aplicará a todos los archivos recién creados.
Pero, ¿qué pasa si queremos usar CoW al copiar de forma predeterminada?
- La forma radical es parchear coreutils. Quizás cree su paquete en su repositorio privado.
Archivo parche cp.c :
-x->reflink_mode = REFLINK_NEVER; +x->reflink_mode = REFLINK_AUTO;
- Una solución menos radical es escribir un alias cp para su shell. Para bash, por ejemplo:
En la carpeta /etc/profile.d
, cree un cp_reflink.sh
cp_reflink.sh con el contenido:
Esta solución funcionará en casi todos los casos cuando se accede a cp desde un shell por su nombre. Pero si se usará / bin / cp en los scripts, entonces el alias no funcionará y la copia se realizará como de costumbre.
Administradores de archivos y reflink
Estado al 31 de octubre de 2019:
- Midnight Commander - apoyos.
- Krusader: no es compatible.
- Dolphin: no es compatible.
- Nautilus: no es compatible.
- Nemo - Soportes.
Lenguajes de programación, llamadas al sistema y reflink
La mayoría de los lenguajes de programación no tienen soporte de reflink.
En C, muchos programadores todavía copian
usando bucles y buffers .
La llamada al sistema
sendfile no usa reflink.
cp
usa la
llamada al sistema
ioctl con el indicador FICLONE.
Creo que si necesita copiar algo en el código, es recomendable hacerlo como lo hace
cp
o simplemente llamar a
cp --reflink=auto
.
Conclusiones
Con el advenimiento de la era de la virtualización ubicua y la SSD, se ha vuelto muy importante usar sistemas de archivos CoW. Son convenientes para crear imágenes, copiar rápidamente. De hecho, cuando usamos CoW al copiar,
automáticamente hacemos deduplicación de datos .
Actualmente, solo 3 sistemas de archivos admiten este tipo de copia: BTRFS, XFS y OCFS2.
Espero sinceramente que el soporte de reflink se complete en ZFS y NILFS2, ya que ya admiten CoW por mecanismos internos.
Sin embargo, en todas las distribuciones de Linux, CoW está deshabilitado al copiar archivos, y necesitamos especificar explícitamente las claves correspondientes o usar varios trucos, como alias o parches.
Han pasado 18 años desde el anuncio de Reiser4, sin embargo, hasta ahora la copia ligera de CoW no ha entrado en nuestra vida en todas partes.
PS Docker y CoW
¿Sabes que Docker admite btrfs para su almacenamiento? Esta opción debe estar habilitada. No está seleccionado por defecto.
El sistema de archivos CoW en teoría es el complemento perfecto para una virtualización fácil cuando diferentes máquinas virtuales usan el mismo núcleo.
En mi opinión, es mucho más orgánico que OverlayFS y Aufs, que son muletas tecnológicas para simular CoW.
Para usar Btrfs en Docker necesitas:
- En una instalación nueva (sin imágenes y máquinas virtuales) de Docker, monte un volumen Btrfs separado en
/var/lib/docker
- Agregar opciones al archivo de configuración de inicio de Docker
Para Gentoo y Calculate Linux, esto es
/etc/conf.d/docker
DOCKER_OPTS="--storage-driver btrfs --data-root /var/lib/docker"
Y aquí está la
instrucción completa para todas las distribuciones.
Adiciones de comentarios
XFS y CoW
constb (
fuente ): en XFS, CoW tampoco siempre es compatible. Necesita crear un sistema de archivos con
mkfs.xfs -m reflink=1
.
Ya en el FS creado, no puede "habilitar" el soporte de CoW. Además, en los núcleos hasta 4.11, la inclusión de esta opción provoca advertencias rojas en dmesg de que la característica es experimental.
MacOS y CoW
MMik (
fuente ): en OS X, una opción similar al comando
cp
es
-c
.
Implica el uso de la llamada al sistema atómico
clonefile()
, que crea una entrada en el sistema de archivos sobre un nuevo archivo en el que las referencias a los bloques de datos son idénticas a las originales. Se copian los atributos y los atributos extendidos del archivo, las entradas de la lista de control de acceso (ACL), con la excepción de la información del propietario del archivo y con el restablecimiento de los bits setuid / setgid. Funciona dentro del mismo sistema de archivos, requiere soporte del sistema de archivos (atributo ATTR_VOL_CAPABILITIES, marca VOL_CAP_INT_CLONE).
Compatible desde OS X 10.12 (Sierra) y solo en el sistema de archivos
APFS .
Agradecimientos
PPS Directo los errores notados en un personal. Aumento el karma para esto.
Puede experimentar con los sistemas de archivos CoW ordenando una máquina virtual de
RUVDS con el cupón a continuación.
