14

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?

21

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.

  • 1
    A subsequent interesting question is whether the acc.umulated changes can later be merged into the original device – imz -- Ivan Zakharyaschev Aug 3 '14 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 – imz -- Ivan Zakharyaschev Aug 3 '14 at 17:02
  • What does the chunksize parameter to the snapshot target (8 in your case) mean? How to choose it? – imz -- Ivan Zakharyaschev Aug 4 '14 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. – Stéphane Chazelas Sep 17 '17 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. – Stéphane Chazelas Sep 17 '17 at 13:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.