Por lo que entiendo, los subvolúmenes btrfs comparten el mismo "almacenamiento" del sistema de archivos, por lo que me sorprendió saber que mover archivos entre diferentes subvolúmenes es una operación costosa, como moverse entre diferentes sistemas de archivos (copiar + eliminar).
Me sorprendió especialmente cuando alguien sugirió esta solución alternativa: vuelva a copiar los archivos entre subvolúmenes y luego elimine los originales. Se dice que es una operación barata (solo se mueve alrededor de los metadatos). ¿Cómo es que diferentes subvolúmenes pueden compartir bloques de datos cuando se usa COW, pero no en la operación más fácil de mover datos?
file-transfer
benchmarking
btrfs
m.alessandrini
fuente
fuente
mv
intentará un enlace de referencia antes de volver a una copia estándar ( registro de cambios ).cp --reflink
entre dos subvolúmenes me vi obligado a montar el subvolumen de nivel superior y emitir elcp
comando dentro de ese espacio de nombres , de lo contrariocp
saldría con un error que decía...Invalid cross-device link
Respuestas:
mv usa el cambio de nombre syscall para intentar el movimiento. El cambio de nombre de kernel de btrfs impl detecta el movimiento de subvolúmenes cruzados y lo rechaza explícitamente (incluso si está bajo el mismo punto de montaje):
Esto probablemente tiene que ver con la contabilidad de inodo de subvolumen y las rutas de código que toman estas operaciones. La copia de enlace de referencia en realidad está creando nuevos metadatos (pero los datos en sí mismos son CoW) contabilizados en el nuevo subvolumen. En teoría, probablemente podrían cambiar el nombre de "mover" los metadatos haciendo algo similar a lo que hace copia --reflink seguido de rm source ... simplemente nadie se ha esforzado por hacerlo.
fuente