GNU / Linux: périphérique de bloc de superposition / périphérique de bloc empilable

14

GNU / Linux a un montage union qui superpose les répertoires. Vous pouvez donc monter un répertoire accessible en écriture au-dessus d'un répertoire en lecture seule. Lorsque le répertoire inscriptible est démonté, le répertoire en lecture seule n'est pas modifié.

Je recherche la même fonctionnalité pour les périphériques blocs - de préférence avec la partie inscriptible stockée dans un fichier. Je voudrais donc exécuter quelque chose comme:

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

Si j'écris dans / dev / newdevice, les modifications doivent être stockées dans un fichier de superposition. Si je lis les secteurs écrits, je devrais obtenir les données du fichier de superposition. Si je lis des secteurs non écrits, je devrais obtenir les données de / dev / read-only-device.

Un tel outil existe-t-il?

Ole Tange
la source
Un Q & A similaire: instantané de type LVM sur un périphérique de bloc normal .
imz - Ivan Zakharyaschev

Réponses:

22

Vous pouvez le faire avec le mappeur de périphériques et sa snapshotcible.

Fondamentalement, vous feriez la même chose que LVM lorsque vous créez un instantané accessible en écriture.

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"

Ensuite, vous pouvez accéder au périphérique superposé en tant que /dev/mapper/newdevice.

Si vous avez également besoin d'accéder à l'appareil d'origine en même temps, vous pouvez faire:

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

Et accédez-y par-dessus /dev/mapper/originaldevice.

Vous pouvez écrire sur ce périphérique, puis en plus des segments écrits sur le périphérique de capture instantanée, le fichier de superposition contiendra une copie des fragments qui ont été remplacés lors de l'écriture dans l'origine de la capture instantanée.

Le fichier de superposition peut être un fichier clairsemé. (par exemple, créez-le en tant que truncate -s10G the-file) et n'a pas besoin d'être aussi grand que l'appareil d'origine. Vous pouvez dire à quel point il est plein dmsetup status "$newdevname".

Remarque: Il existe des exigences de taille et de contenu sur un périphérique d'instantané .

Stéphane Chazelas
la source
1
Une question intéressante subséquente est de savoir si les modifications accumulées peuvent être fusionnées plus tard dans le dispositif d'origine
imz - Ivan Zakharyaschev
1
La réponse suivante: oui. "Device-mapper vous permet… *) de fusionner un instantané d'un périphérique de bloc dans le périphérique d'origine du instantané." kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz - Ivan Zakharyaschev
Que signifie le paramètre chunksize de la cible d'instantané (8 dans votre cas)? Comment le choisir?
imz - Ivan Zakharyaschev
1
@Tom Ces nombres dans les tables DM se réfèrent toujours à des unités de 512 octets, et non à la taille du secteur physique des périphériques de blocs sous-jacents. Donc, utiliser quelque chose qui n'est pas un multiple de 8 un instantané au-dessus d'un appareil avec des secteurs 4K serait une mauvaise idée.
Stéphane Chazelas
1
@Tom, la taille de bloc détermine la granularité de l'instantané. il ne s'agit pas de la taille de bloc du FS pour le fichier de superposition, mais de la ganularité des opérations d'E / S effectuées sur tout ce qui se trouve sur le périphérique de bloc. D'où le retour en arrière. Merci pour le getsz vs getsize.
Stéphane Chazelas