vmdk-rs is a Rust library to read data from the VMware Virtual Disk (VMDK)
files. This project is in active development and should be considered beta
quality, with no known issues.
- raw (flat)
- VMDK3 COWD (sparse)
- VMDK4 (sparse)
- SESPARSE
- flat types: monolithicFlat, 2GbMaxExtentFlat, vmfsThin
- sparse types: monolithicSparse, 2GbMaxExtentSparse, vmfsSparse, streamOptimized
- grain compression
- data markers
- zeroed grain table entries
- delta links (snapshots)
Read from a VMDK in Rust:
use vmdk::vmdk_reader::VmdkReader;
let vmdk_reader = VmdkReader::open(&vmdk_path).unwrap();
let mut buf: Vec<u8> = vec![0; 1048576];
let mut offset = 0;
while offset < vmdk_reader.total_size {
let read = vmdk_reader.read_at_offset(offset, &mut buf).unwrap();
if read == 0 {
break;
}
// do something with buf[..read]
offset += read as u64;
}Read from a VMDK in C:
#include "vmdkrs.h"
VmdkError* err = nullptr;
VmdkHandle* handle = vmdk_open(vmdk_path, &err);
if (err) {
printf("%s\n", err->message);
vmdk_free_error(err);
return;
}
char buf[4096];
uint64_t offset = 0;
while (offset < handle.image_size) {
uintptr_t r = vmdk_read(handle, offset, buf, sizeof(buf), &err);
if (err) {
printf("%s\n", err->message);
vmdk_free_error(err);
return;
}
// do something with buf[..r]
offset += r;
}
vmdk_close(handle);| vmdk-rs | libvmdk | go-vmdk | |
|---|---|---|---|
| VMDK3 (COWD) | ✅ | ✅ | |
| VMDK4 | ✅ | ✅ | |
| FLAT extents | ✅ | ✅ | ✅ |
| VMFS extents | ✅ | ✅ | ✅ |
| VMFSSPARSE extents | ✅ | ✅ | |
| VMFSRAW extents | ✅ | ✅ | |
| VMFSRDM extents | ✅ | ✅ | |
| SPARSE extents | ✅ | ✅ | ✅ |
| SESPARSE extents | ✅ | ||
| ZERO extents | ✅ | ||
| grain compression | ✅ | ✅ | |
| data markers | ✅ | ✅ | |
| zeroed grain table entries | ✅ | ✅ | |
| embedded descriptors | ✅ | ✅ | |
| delta links (snapshots) | ✅ | ✅ | |
| read from local filesystem | ✅ | ✅ | ✅ |
| read from S3 | ✅ |
Copyright 2025–6, LevelBlue. vmdk-rs is licensed under the Apache License, Version 2.0.