qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] Question about cow format with hexdump
@ 2014-09-03  5:27 shhuiw
  2014-09-03 10:59 ` Stefan Hajnoczi
  2014-09-04 13:28 ` shhuiw
  0 siblings, 2 replies; 4+ messages in thread
From: shhuiw @ 2014-09-03  5:27 UTC (permalink / raw)
  To: qemu-devel@nongnu.org


Hi,

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.

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

4) sectorsize is 512:
-bash-4.1$ hexdump -C dummy -n 1048
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 00 10 00 00                           |........|
00000418


Can anyone help to explain this? Or how to debug further?

--

Regards,
shhuiw

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] Question about cow format with hexdump
  2014-09-03  5:27 [Qemu-devel] Question about cow format with hexdump shhuiw
@ 2014-09-03 10:59 ` Stefan Hajnoczi
  2014-09-03 15:35   ` Kevin Wolf
  2014-09-04 13:28 ` shhuiw
  1 sibling, 1 reply; 4+ messages in thread
From: Stefan Hajnoczi @ 2014-09-03 10:59 UTC (permalink / raw)
  To: shhuiw; +Cc: qemu-devel@nongnu.org

[-- Attachment #1: Type: text/plain, Size: 3226 bytes --]

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

[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] Question about cow format with hexdump
  2014-09-03 10:59 ` Stefan Hajnoczi
@ 2014-09-03 15:35   ` Kevin Wolf
  0 siblings, 0 replies; 4+ messages in thread
From: Kevin Wolf @ 2014-09-03 15:35 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: shhuiw, qemu-devel@nongnu.org

[-- Attachment #1: Type: text/plain, Size: 3504 bytes --]

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

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] Question about cow format with hexdump
  2014-09-03  5:27 [Qemu-devel] Question about cow format with hexdump shhuiw
  2014-09-03 10:59 ` Stefan Hajnoczi
@ 2014-09-04 13:28 ` shhuiw
  1 sibling, 0 replies; 4+ messages in thread
From: shhuiw @ 2014-09-04 13:28 UTC (permalink / raw)
  To: shhuiw; +Cc: qemu-devel@nongnu.org

Sorry to trouble you all.

I found the right way: I should use the -o option when I create cow image files.
Then hexdump can give full info.


~> touch testcow               # maked up backing_file ahead to get non-0s .mtime

~> qemu-img create -f cow -o backing_file=testcow,size=1M dummy
Formatting 'dummy', fmt=cow size=1048576 backing_file='testcow' 

~> hexdump -C dummy 
00000000  4f 4f 4f 4d 00 00 00 02  74 65 73 74 63 6f 77 00  |OOOM....testcow.|
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  54 08 66 e8 00 00 00 00  |........T.f.....|
00000410  00 10 00 00 00 00 02 00  00 00 00 00 00 00 00 00  |................|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000510  00 00 00 00 00 00 00 00                           |........|
00000518


--

Regards,
shhuiw




At 2014-09-03 01:27:00, "shhuiw" <shhuiw@163.com> wrote:
>
>Hi,
>
>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.
>
>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
>
>4) sectorsize is 512:
>-bash-4.1$ hexdump -C dummy -n 1048
>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 00 10 00 00                           |........|
>00000418
>
>
>Can anyone help to explain this? Or how to debug further?
>
>--
>
>Regards,
>shhuiw

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-09-04 13:28 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-03  5:27 [Qemu-devel] Question about cow format with hexdump shhuiw
2014-09-03 10:59 ` Stefan Hajnoczi
2014-09-03 15:35   ` Kevin Wolf
2014-09-04 13:28 ` shhuiw

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).