On Wed, Sep 03, 2014 at 01:27:00PM +0800, shhuiw wrote: > I'm reading the source code of cow.c: > https://github.com/qemu/qemu/blob/master/block/cow.c > and try to understand the format better.
The 'cow' format is an old format that is rarely used. It's not a good example. qcow2 is actively developed and performs better. Unfortunately it is a lot more complex. > I created a cow format imagefile and can run 'qume-img info' to query the > header info > ------------------------------------------------------------------------------- > -bash-4.1$ qemu-img create -f cow dummy 1M > Formatting 'test/dummy', fmt=cow size=1048576 > -bash-4.1$ qemu-img info dummy > image: dummy > file format: cow > virtual size: 1.0M (1048576 bytes) > disk size: 4.0K > > > But when I used hexdump to dis the header part, I cannot find all info > recorded: > (compared the define of struct cow_header_v2 and cow_create()) > ------------------------------------------------------------------------------ > 1) recognize the magic and version info: > -bash-4.1$ hexdump -C dummy -n 8 > 00000000 4f 4f 4f 4d 00 00 00 02 |OOOM....| > 00000008 > > 2) backing_file and mtime fields are 0s: > # I think the "dummy" should be recorded > -bash-4.1$ hexdump -C dummy -n 1032 > 00000000 4f 4f 4f 4d 00 00 00 02 00 00 00 00 00 00 00 00 |OOOM............| > 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| > * > 00000400 00 00 00 00 00 00 00 00 |........| > 00000408 > -bash-4.1$ hexdump -C dummy -n 1036 > 00000000 4f 4f 4f 4d 00 00 00 02 00 00 00 00 00 00 00 00 |OOOM............| > 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| > * > 00000400 00 00 00 00 00 00 00 00 00 00 00 00 |............| > 0000040c > > 3) size field is 0s: > -bash-4.1$ hexdump -C dummy -n 1044 > # size should be 1M > 00000000 4f 4f 4f 4d 00 00 00 02 00 00 00 00 00 00 00 00 |OOOM............| > 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| > * > 00000410 00 00 00 00 |....| > 00000414 $ sudo yum install dwarves $ pahole block/cow.o ... struct cow_header_v2 { uint32_t magic; /* 0 4 */ uint32_t version; /* 4 4 */ char backing_file[1024]; /* 8 1024 */ /* --- cacheline 16 boundary (1024 bytes) was 8 bytes ago --- */ int32_t mtime; /* 1032 4 */ /* XXX 4 bytes hole, try to pack */ uint64_t size; /* 1040 8 */ uint32_t sectorsize; /* 1048 4 */ /* size: 1056, cachelines: 17, members: 6 */ /* sum members: 1048, holes: 1, sum holes: 4 */ /* padding: 4 */ /* last cacheline: 32 bytes */ }; Ooops, the compiler has inserted padding into the struct because the size field was not aligned. We can't change this because QEMU must stay backwards compatible. Stefan
pgpfsbQjbYwzm.pgp
Description: PGP signature