18

GNU/Linux has union mount that overlays dirs. So you can mount a writeable dir on top of a read-only dir. When the writeable dir is unmounted the read-only dir is untouched.

I am looking for the same functionality for block devices - preferably with the writeable part stored in a file. So I would like to run something like:

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

If I write to /dev/newdevice the changes should be stored in overlayfile. If I read the sectors written to, I should get the data from overlayfile. If I read sectors not written to, I should get the data from /dev/read-only-device.

Does such a tool exist?

1

1 Answer 1

28

You can do that with the device mapper and its snapshot target.

Basically, you'd do the same as what LVM does when you create a writable snapshot.

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"

Then you can access the overlayed device as /dev/mapper/newdevice.

If you also need access to the original device at the same time, you can do:

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

And access it over /dev/mapper/originaldevice.

You can write to that device, then in addition to the chunks written to the snapshot device, the overlay file will contain a copy of the chunks that have been overwritten when writing to the snapshot-origin.

The overlay file can be a sparse file. (for instance, create it as truncate -s10G the-file), and doesn't have to be as large as the original device. You can tell how full it is with dmsetup status "$newdevname".

Note: There are size and contents reqirements on a snapshot device.

14
  • 1
    A subsequent interesting question is whether the acc.umulated changes can later be merged into the original device Commented Aug 3, 2014 at 15:54
  • 1
    The subsequent answer: yes. "Device-mapper allows you … *) To merge a snapshot of a block device back into the snapshot's origin device." kernel.org/doc/Documentation/device-mapper/snapshot.txt Commented Aug 3, 2014 at 17:02
  • What does the chunksize parameter to the snapshot target (8 in your case) mean? How to choose it? Commented Aug 4, 2014 at 4:21
  • 1
    @Tom Those numbers in DM tables always refer to 512 byte units, not physical sector size of underlying block devices. So using something that is not a multiple of 8 a snapshot on top of a device with 4K sectors would be a bad idea. Commented Sep 17, 2017 at 6:15
  • 1
    @Tom, the chunksize determines the granularity of the snapshoting. it's not about the blocksize of the FS for the overlay file, but the ganularity of I/O operations done on whatever is sitting on the block device. Hence the rollback. Thanks for the getsz vs getsize. Commented Sep 17, 2017 at 13:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .