GNU / Linux: dispositivo de bloque superpuesto / dispositivo de bloque apilable

14

GNU / Linux tiene montaje de unión que superpone directorios. Por lo tanto, puede montar un directorio de escritura encima de un directorio de solo lectura. Cuando el directorio de escritura se desmonta, el directorio de solo lectura no se toca.

Estoy buscando la misma funcionalidad para dispositivos de bloque, preferiblemente con la parte grabable almacenada en un archivo. Entonces me gustaría ejecutar algo como:

device-setup /dev/newdevice /dev/read-only-device overlayfile

Si escribo en / dev / newdevice, los cambios deberían almacenarse en un archivo de superposición. Si leo los sectores escritos, debería obtener los datos del archivo de superposición. Si leo sectores en los que no se ha escrito, debería obtener los datos de / dev / read-only-device.

¿Existe tal herramienta?

Ole Tange
fuente
Un Q&A similar: instantánea similar a LVM en un dispositivo de bloque normal .
imz - Ivan Zakharyaschev

Respuestas:

22

Puede hacerlo con el mapeador de dispositivos y su snapshotobjetivo.

Básicamente, haría lo mismo que lo que hace LVM cuando crea una instantánea grabable.

dev=/dev/read-only-device
ovl=/path/to/overlay.file
newdevname=newdevice
size=$(blockdev --getsz "$dev")

loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" |
  dmsetup create "$newdevname"

Luego puede acceder al dispositivo superpuesto como /dev/mapper/newdevice.

Si también necesita acceso al dispositivo original al mismo tiempo, puede hacer lo siguiente:

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice

Y accede a ella /dev/mapper/originaldevice.

Puede escribir en ese dispositivo, luego, además de los fragmentos escritos en el dispositivo de instantánea, el archivo de superposición contendrá una copia de los fragmentos que se han sobrescrito al escribir en el origen de la instantánea.

El archivo de superposición puede ser un archivo disperso. (por ejemplo, créelo como truncate -s10G the-file) y no tiene que ser tan grande como el dispositivo original. Puedes decir qué tan lleno está dmsetup status "$newdevname".

Nota: Hay requisitos de tamaño y contenido en un dispositivo de instantánea .

Stéphane Chazelas
fuente
1
Una pregunta interesante posterior es si los cambios acumulados pueden fusionarse más tarde en el dispositivo original
imz - Ivan Zakharyaschev
1
La respuesta posterior: sí. "Device-mapper le permite ... *) Fusionar una instantánea de un dispositivo de bloque nuevamente en el dispositivo de origen de la instantánea". kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz - Ivan Zakharyaschev
¿Qué significa el parámetro chunksize para el objetivo de instantánea (8 en su caso)? ¿Cómo elegirlo?
imz - Ivan Zakharyaschev
1
@Tom Esos números en las tablas DM siempre se refieren a unidades de 512 bytes, no al tamaño del sector físico de los dispositivos de bloque subyacentes. Por lo tanto, usar algo que no sea un múltiplo de 8 una instantánea en la parte superior de un dispositivo con sectores 4K sería una mala idea.
Stéphane Chazelas
1
@ Tom, el tamaño de fragmento determina la granularidad de la instantánea. no se trata del tamaño de bloque del FS para el archivo de superposición, sino de la ganularidad de las operaciones de E / S realizadas en cualquier cosa que se encuentre en el dispositivo de bloque. De ahí la reversión. Gracias por el getsz vs getsize.
Stéphane Chazelas