go-qcow2reader provides io.ReaderAt for qcow2 images.
Use io.NewSectionReader to wrap io.ReaderAt into io.Reader:
f, _ := os.Open("a.qcow2")
defer f.Close()
img, _ := qcow2reader.Open(f)
r := io.NewSectionReader(img, 0, img.Size()))The convert package copies an image to an io.WriterAt,
skipping unallocated and zero extents. The target can be a raw file, or a
vhdx.Writer to create a dynamic
VHDX image.
Zero ranges are skipped rather than written, so a raw target has to be sized by the caller:
f, _ := os.Create("a.raw")
defer f.Close()
_ = f.Truncate(img.Size())
_ = convert.Convert(f, img, convert.Options{})A vhdx.Writer sizes its own file:
f, _ := os.Create("a.vhdx")
defer f.Close()
w, _ := vhdx.NewWriter(f, img.Size(), vhdx.WriterOptions{})
_ = convert.Convert(w, img, convert.Options{})
_ = w.Close()The following features are not supported yet:
The following features are experimentally supported: