Estoy jugando con btrfs, que permite cp --reflink
copiar sobre escritura. Otros programas, como lxc-clone
, también pueden utilizar esta función. Mi pregunta es, ¿cómo saber si un archivo es CoW de otro? Al igual que con el enlace duro, lo puedo saber por el número de inodo.
Respuesta1
Buena pregunta. Parece que actualmente no existen formas sencillas de saberlo de alto nivel.
Un problema es que un archivo sólo puede compartir parte de los datos mediante Copia en escritura. Esto se llama extensión física, yalguno o todode las extensiones físicas pueden compartirse entre archivos CoW.
No hay nada análogo a un (Editar: vermi otra respuesta).inode
archivo que, al compararlo entre archivos, le indique que los archivos comparten la misma extensión física.
La respuesta de bajo nivel es que puede preguntarle al kernel qué extensiones físicas se usan para el archivo usando elFS_IOC_FIEMAP
ioctl
, cual esdocumentado enDocumentation/filesystems/fiemap.txt
. En principio, si todas las extensiones físicas son iguales, entonces el archivo debe compartir el mismo almacenamiento subyacente.
Pocas cosas implementan una forma de ver esta información a un nivel superior. Encontré algunosir código aquí. Aparentemente elfilefrag
Se supone que la utilidad muestra las extensiones con -v. Además,btrfs-debug-tree
muestra esta información.
Sin embargo, tendría cuidado, ya que estas cosas pueden haber tenido poco uso en la naturaleza para este propósito, podría encontrar errores que le den respuestas incorrectas, así que tenga cuidado al confiar en estos datos para decidir operaciones que podrían causar corrupción de datos.
Algunas preguntas relacionadas:
Respuesta2
Más allá de mi respuesta anterior, acabo de liberarfienode
que calcula un hash SHA1 de las extensiones físicas del archivo y se puede usar para encontrar algunas copias de reflink (idénticas). Sin embargo, tenga cuidado, hay advertencias (consultela documentación). BTRFS decidió cambiar algunas, pero no todas, las extensiones físicas de una copia refinada que hice sin provocación ni previo aviso, lo que provocó que el valor cambiara.
Respuesta3
La solución más fácil para esto es usar btrfs filesystem du .
Exclusive, que será 0.00B si es CoW.
Encontrado aquí:https://unix.stackexchange.com/a/655813/525352
Respuesta4
Esto no agrega mucho a la respuesta aceptada, pero alguien ha resumido los problemas y varios métodos aquí:https://www.ctrl.blog/entry/distinguir-file-link-clone.html
Problemas:
- distinguir enlaces simbólicos y enlaces físicos de enlaces de referencia
- identificar clones parciales (archivos que comparten algunos pero no todos los datos)
Soluciones:
- Usar fragmento de archivo
- Úselo
stat
para identificar el dispositivo, ya que los clones deben residir en el mismo sistema de archivos.
Cita:
Los enlaces físicos comparten el mismo número de inodo que su destino, mientras que los clones tienen sus propios inodos. Esta distinción (más un sistema de archivos de copia en escritura) es lo que permite a los clones actuar independientemente de sus originales incluso cuando son modificados por programas que no son conscientes de la clonación".
- Ejecute el comando filefrag -v file1 file2 (parte de e2fsprogs). Compare los rangos de desplazamiento_físico de los archivos dentro de las filas de extensión que tienen establecido el indicador compartido.
Los dos archivos comparten datos deduplicados/clonados en la unidad de almacenamiento si comparten rangos idénticos o superpuestos.
En cuanto a determinar cuál es el original y cuál es el clon…. Esto es casi imposible de determinar sin una máquina del tiempo.