[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] Question about cow format with hexdump
From: |
Kevin Wolf |
Subject: |
Re: [Qemu-devel] Question about cow format with hexdump |
Date: |
Wed, 3 Sep 2014 17:35:02 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Am 03.09.2014 um 12:59 hat Stefan Hajnoczi geschrieben:
> 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.
We can at least make it explicit like I did for qcow1 in ea54feff.
Kevin
pgptMODJd6iRY.pgp
Description: PGP signature