1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
|
assembly: 0.865
socket: 0.841
other: 0.830
instruction: 0.808
device: 0.806
semantic: 0.800
graphic: 0.800
KVM: 0.739
mistranslation: 0.732
boot: 0.693
network: 0.645
vnc: 0.587
qemu-img convert a overlay qcow2 image into a entire image
I have a base image file "base.qcow2" and a delta qcow2 image file "delta.qcow2" whose backing file is "base.qcow2".
Now I use qemu-img to convert "delta.qcow2" and will get a new image file "new.qcow2" which is complete and equivalent to combination of "base.qcow2" and "delta.qcow2".
In fact, i just want to convert the delta qcow2 image file and get a new delta overlay qcow2 image file. So the "new.qcow2" is not what i want. I have to admit that this is not bug. Could you please take this as a new feature and enable qemu-img to convert images in-place?
On 02/05/2017 09:19 PM, wayen wrote:
>
> I have a base image file "base.qcow2" and a delta qcow2 image file
> "delta.qcow2" whose backing file is "base.qcow2".
>
> Now I use qemu-img to convert "delta.qcow2" and will get a new image
> + file "new.qcow2" which is entire and equivalent to combination of
> "base.qcow2" and "delta.qcow2".
>
> In fact, i just want to convert the delta qcow2 image file and get a new
> delta overlay qcow2 image file. So the "new.qcow2" is not what i want. I
> have to admit that this is not bug. Could you please take this as a new
> feature and enable qemu-img to convert images in-place?
This feature already exists. Use:
qemu-img rebase -F $backing_fmt -b '' -f qcow2 delta.qcow2
and now delta.qcow2 will be a complete image.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
@Eric Blake, Thanks very much for your help. In your way, I have verified that this feature already exists.
@Eric Blake. Sorry, I didn't make it clear. In fact, I don't want to get a complete image. I just want to convert qcow2 overlay and get a new qcow2 overlay. Maybe you think my intention is meaningless, but this is what I want.
Can't you simply do a "cp delta.qcow2 new.qcow2" ?
@Thomas Huth, when we use qemu-img to convert a image "A" and will get a new image "B" which is equivalent to "A" . But "B" may be a lot different from "A",such as file size. The file size of "B" is usually less than "A" and this is very valuable to me. So I can't simply do a "cp delta.qcow2 new.qcow2" ?
I meant to copy B, not A ... but I likely just haven't really understood what you're really trying to do here, so never mind.
@Thomas Huth, I just want to reduce the file size of qcow2 overlay image by this conversion.
On 02/08/2017 02:16 AM, wayen wrote:
> @Thomas Huth, I just want to reduce the file size of qcow2 overlay image
> by this conversion.
Are you merely trying to sparsify the file (punch holes on the portion
of the file that is not mapped to disk), so that the apparent file size
is unchanged, but the actual disk usage is minimized? That's probably
already possible (virt-sparsify from libguestfs seems to be able to do
it; look at what steps it uses).
Or are you asking for a way to defragment the file, so that the apparent
size shrinks because all occupied clusters are now contiguous, so that
there are no longer any need for holes? The end result is the same
amount of disk usage, but right now, the only way to defragment is to
convert from one image to a copy; we don't support in-place
defragmentation yet. So far, no one has come up with a compelling
reason why it is needed, or a patch to implement it, but there's no
technical reason why it can't be done.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
@Eric Blake, I used virt-sparsify to sparsify the qcow2 overlay image. As you said, the actual disk usage is minimized and the apparent file size is unchanged.It is very valuable for me, because it means that my disk can hold more files.
But we need to be careful when transfer the sparse qcow2 overlays. Because some tools do not support sparse file and will convert it into a common file,for example, scp. And I doubt what will happen when transfer sparse files between different file systems.
So I want to use qemu-img to convert the sparse qcow2 overlay into common file. If this was feasible, the holes in the sparse overlay will be removed and the above problems will disappear.
On Thu, Feb 09, 2017 at 02:05:54AM -0000, wayen wrote:
> @Eric Blake, I used virt-sparsify to sparsify the qcow2 overlay image.
> As you said, the actual disk usage is minimized and the apparent file
> size is unchanged.It is very valuable for me, because it means that my
> disk can hold more files.
>
> But we need to be careful when transfer the sparse qcow2 overlays.
> Because some tools do not support sparse file and will convert it into a
> common file,for example, scp. And I doubt what will happen when transfer
> sparse files between different file systems.
>
> So I want to use qemu-img to convert the sparse qcow2 overlay into
> common file. If this was feasible, the holes in the sparse overlay will
> be removed and the above problems will disappear.
You can use the drive_mirror HMP command or drive-mirror QMP command on
a running QEMU instance to copy the data to a new file and switch to the
new file.
I'm curious what exactly is being optimized by copying out a fresh qcow2
image.
Please post the output of:
$ stat delta.qcow2
$ qemu-img map delta.qcow2
$ stat new.qcow2
$ qemu-img map new.qcow2
This will allow us to see the size and data layout differences.
Maybe a new command should be added to QEMU to do the optimization
in-place. This would avoid the disk space overhead associated with
drive-mirror, cp, qemu-img convert, etc.
Stefan
On Tue, Feb 14, 2017 at 02:17:16AM -0000, wayen wrote:
> ** Attachment added: "qemu-img map new.qcow2 output"
> https://bugs.launchpad.net/qemu/+bug/1662050/+attachment/4818564/+files/qemu_img_map_new_qcow2.txt
Thanks for posting the attachments.
I ran a script to find unallocated clusters in the delta.qcow2 host
file. Most are actually qcow2 metadata (L1/L2 tables, refcount blocks).
This output shows that any image file size reduction you are hoping to
achieve can only come from zero clusters.
There are no holes in the files that would result in significant image
file size reduction if a new image were written out.
Just wanted to share this info in case anyone else is thinking about how
to optimize qcow2 files. I still think rewriting images sequentially
can be useful - if internal snapshots were used and deleted then COW can
result in holes.
Hole at 0 size 5.0 clusters
Hole at 393216 size 1.0 clusters
Hole at 589824 size 1.0 clusters
Hole at 1114112 size 1.0 clusters
Hole at 1310720 size 1.0 clusters
Hole at 1507328 size 1.0 clusters
Hole at 1703936 size 1.0 clusters
Hole at 2293760 size 1.0 clusters
Hole at 2621440 size 1.0 clusters
Hole at 3080192 size 1.0 clusters
Hole at 5111808 size 1.0 clusters
Hole at 6291456 size 1.0 clusters
Hole at 30408704 size 1.0 clusters
Hole at 47906816 size 1.0 clusters
Hole at 142671872 size 1.0 clusters
Hole at 219545600 size 1.0 clusters
Hole at 667090944 size 1.0 clusters
Hole at 853868544 size 1.0 clusters
Hole at 1562640384 size 1.0 clusters
Hole at 2147483648 size 1.0 clusters
Hole at 2617180160 size 1.0 clusters
Hole at 3411148800 size 1.0 clusters
Hole at 4107075584 size 1.0 clusters
Hole at 4294967296 size 1.0 clusters
Hole at 4452646912 size 1.0 clusters
Hole at 4792057856 size 1.0 clusters
Hole at 5494865920 size 1.0 clusters
Hole at 5645271040 size 1.0 clusters
Hole at 5702483968 size 1.0 clusters
Hole at 6187188224 size 1.0 clusters
Hole at 6442450944 size 1.0 clusters
Hole at 6862995456 size 1.0 clusters
Hole at 6987317248 size 1.0 clusters
Hole at 7567245312 size 1.0 clusters
Hole at 8135245824 size 1.0 clusters
Hole at 8590589952 size 1.0 clusters
Hole at 8613462016 size 1.0 clusters
Hole at 9055436800 size 1.0 clusters
Hole at 9703522304 size 1.0 clusters
Hole at 10279321600 size 1.0 clusters
Hole at 10737418240 size 3.0 clusters
Hole at 10844372992 size 1.0 clusters
Hole at 11167858688 size 1.0 clusters
Hole at 11209605120 size 1.0 clusters
Hole at 11209801728 size 1.0 clusters
Hole at 11730944000 size 1.0 clusters
Hole at 12183207936 size 1.0 clusters
Hole at 12705464320 size 1.0 clusters
Hole at 12884901888 size 1.0 clusters
Hole at 13444120576 size 1.0 clusters
Hole at 13910016000 size 1.0 clusters
Hole at 14182711296 size 1.0 clusters
Hole at 15025635328 size 1.0 clusters
Hole at 15032385536 size 1.0 clusters
The following script draws the allocated clusters and holes in the image
file. I took your qemu-img map output, filtered out any lines with
base.qcow2, and sorted using sort -k3 -g to sort on the "Mapped to"
field. Then I ran ./qcow2-map-svg.py <filtered.txt >output.svg.
#!/usr/bin/python3
import sys
import io
COLOR_ALLOCATED = '#ffaaaa'
COLOR_HOLE = '#999999'
def svg_percentage(value, total):
return '{0}%'.format(100.0 * value / total)
def svg_rect(x, width, color):
print('<rect x="{0}" y="0" width="{1}" height="40" fill="{2}" stroke="none" />'.format(x, width, color), file=out)
def svg_text(x, y, text):
print('<text x="{0}" y="{1}">{2}</text>'.format(x, y, text), file=out)
out = io.StringIO()
print('''<?xml version="1.0" encoding="UTF-8" ?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">''', file=out)
file_map = []
header = True
for line in sys.stdin:
if header:
header = False
continue
offset, length, mapped, filename = line.split()
offset = int(offset, 16)
length = int(length, 16)
mapped = int(mapped, 16)
file_map.append((offset, length, mapped, filename))
file_size = file_map[-1][2] + file_map[-1][1]
last_mapped = 0
for _, length, mapped, _ in file_map:
if mapped > last_mapped:
# if mapped - last_mapped:
# print('Hole at {0} size {1} clusters'.format(last_mapped, (mapped - last_mapped) / 65536))
svg_rect(svg_percentage(last_mapped, file_size),
svg_percentage(mapped - last_mapped, file_size),
COLOR_HOLE)
svg_rect(svg_percentage(mapped, file_size),
svg_percentage(length, file_size),
COLOR_ALLOCATED)
last_mapped = mapped + length
if last_mapped < file_size:
svg_rect(svg_percentage(last_mapped, file_size),
svg_percentage(file_size - last_mapped, file_size),
COLOR_HOLE)
for i in range(10):
svg_text(svg_percentage(i, 10), 60, svg_percentage(i, 10))
print('</svg>', file=out)
print(out.getvalue())
Is there any way to remove holes from qcow2 overlay images? It's very important to me. I am looking forward to your reply.
Is there any way to remove holes from sparse qcow2 overlay? It's very important to me. I am looking forward to your reply.
Hi wayen:
Which version are you used?
I also find this problem on old version qemu, and i write a patch
for it. It works.
I'm not sure the mainline version have solve this problem.
what command are you used?
On Mon, Apr 10, 2017 at 10:14 AM, wayen <email address hidden> wrote:
> Is there any way to remove holes from qcow2 overlay images? It's very
> important to me. I am looking forward to your reply.
>
> --
> You received this bug notification because you are a member of qemu-
> devel-ml, which is subscribed to QEMU.
> https://bugs.launchpad.net/bugs/1662050
>
> Title:
> qemu-img convert a overlay qcow2 image into a entire image
>
> Status in QEMU:
> Incomplete
>
> Bug description:
> I have a base image file "base.qcow2" and a delta qcow2 image file
> "delta.qcow2" whose backing file is "base.qcow2".
>
> Now I use qemu-img to convert "delta.qcow2" and will get a new image
> file "new.qcow2" which is entire and equivalent to combination of
> "base.qcow2" and "delta.qcow2".
>
> In fact,I don't want to get a complete image.I just want to convert
> delta qcow2 image file "A" to a New delta overlay qcow2 image "B"
> which is equivalent to "A". So the "new.qcow2" is not what i want. I
> have to admit that this is not bug. Could you please take this as a
> new feature and enable qemu-img to convert qcow2 overlay itself?
>
> To manage notifications about this bug go to:
> https://bugs.launchpad.net/qemu/+bug/1662050/+subscriptions
>
Hi Lidong Chen:
I used QEMU 2.0.0 on Ubuntu 14.04.
Do you mean your patch can make qemu-img convert qcow2 overlay into a new overlay?
On Mon, Apr 10, 2017 at 1:07 PM, wayen <email address hidden> wrote:
> Hi Lidong Chen:
> I used QEMU 2.0.0 on Ubuntu 14.04.
> Do you mean your patch can make qemu-img convert qcow2 overlay into a new overlay?
yes. but i find it already fixed in 2.0.0.
do you add the -o backing_file= option in the command?
>
> --
> You received this bug notification because you are a member of qemu-
> devel-ml, which is subscribed to QEMU.
> https://bugs.launchpad.net/bugs/1662050
>
> Title:
> qemu-img convert a overlay qcow2 image into a entire image
>
> Status in QEMU:
> Incomplete
>
> Bug description:
> I have a base image file "base.qcow2" and a delta qcow2 image file
> "delta.qcow2" whose backing file is "base.qcow2".
>
> Now I use qemu-img to convert "delta.qcow2" and will get a new image
> file "new.qcow2" which is entire and equivalent to combination of
> "base.qcow2" and "delta.qcow2".
>
> In fact,I don't want to get a complete image.I just want to convert
> delta qcow2 image file "A" to a New delta overlay qcow2 image "B"
> which is equivalent to "A". So the "new.qcow2" is not what i want. I
> have to admit that this is not bug. Could you please take this as a
> new feature and enable qemu-img to convert qcow2 overlay itself?
>
> To manage notifications about this bug go to:
> https://bugs.launchpad.net/qemu/+bug/1662050/+subscriptions
>
Hi Lidong Chen:
I forgot to use this option.I think the way you said is effective.I will try it.Thank you very much for your help
[Expired for QEMU because there has been no activity for 60 days.]
|