(This is in answer to an IRC question, but the answer is a bit longer than I can cover in IRC)
Can you read and write at the block level in a .vmdk file? I think the questioner was asking about writing a backup/restore type tool. Using only free software, qemu can do reads. You can attach qemu-nbd to a vmdk file and that will expose the logical blocks as NBD, and you can then read at the block level using libnbd:
#!/usr/bin/python3 import nbd h = nbd.NBD() h.connect_systemd_socket_activation( ["qemu-nbd", "-t", "/var/tmp/disk.vmdk"]) print("size = %d" % h.get_size()) buf = h.pread(512, 0)
$ ./qemu-test.py size = 1073741824
The example is in Python, but libnbd would let you do this from C or other languages just as easily.
While this works fine for reading, I wouldn’t necessarily be sure that writing is safe. The vmdk format is complex, baroque and only lightly documented, and the only implementation I’d trust is the one from VMware.
#!/usr/bin/python3 import nbd h = nbd.NBD() h.connect_command( ["nbdkit", "-s", "--exit-with-parent", "vddk", "libdir=/var/tmp/vmware-vix-disklib-distrib", "file=/var/tmp/disk.vmdk"]) print("size = %d" % h.get_size()) buf = h.pread(512, 0) h.pwrite(buf, 512)
I quite like how we’re using small tools and assembling them together into a pipeline in just a few lines of code:
┌─────────┬────────┐ ┌─────────┬────────┐ │ your │ libnbd │ NBD │ nbdkit │ VDDK │ │ program │ ●──────────────➤ │ │ └─────────┴────────┘ └─────────┴────────┘ disk.vmdk
One advantage of this approach is that it exposes the extents in the disk which you can iterate over using libnbd APIs. For a backup tool this would let you save the disk efficiently, or do change-block tracking.