Revision 9666a511 image_creator/disk.py
b/image_creator/disk.py | ||
---|---|---|
320 | 320 |
|
321 | 321 |
self.out.output("Shrinking image (this may take a while)...", False) |
322 | 322 |
|
323 |
sector_size = self.g.blockdev_getss(self.guestfs_device) |
|
324 |
|
|
323 | 325 |
last_part = None |
324 | 326 |
fstype = None |
325 | 327 |
while True: |
... | ... | |
336 | 338 |
part_del(last_part['part_num']) |
337 | 339 |
continue |
338 | 340 |
|
339 |
self.meta['SIZE'] = last_part['part_end'] + 1 |
|
341 |
# Most disk manipulation programs leave 2048 sectors after the last |
|
342 |
# partition |
|
343 |
new_size = last_part['part_end'] + 1 + 2048 * sector_size |
|
344 |
self.meta['SIZE'] = min(self.meta['SIZE'], new_size) |
|
340 | 345 |
break |
341 | 346 |
|
342 | 347 |
if not re.match("ext[234]", fstype): |
... | ... | |
353 | 358 |
block_cnt = int( |
354 | 359 |
filter(lambda x: x[0] == 'Block count', out)[0][1]) |
355 | 360 |
|
356 |
sector_size = self.g.blockdev_getss(self.guestfs_device) |
|
357 | 361 |
start = last_part['part_start'] / sector_size |
358 | 362 |
end = start + (block_size * block_cnt) / sector_size - 1 |
359 | 363 |
|
... | ... | |
398 | 402 |
part_set_id(last_part['part_num'], last_part['id']) |
399 | 403 |
|
400 | 404 |
new_size = (end + 1) * sector_size |
401 |
self.out.success("new size is %dMB" % ((new_size + MB - 1) // MB)) |
|
405 |
|
|
406 |
assert (new_size <= self.meta['SIZE']) |
|
402 | 407 |
|
403 | 408 |
if self.meta['PARTITION_TABLE'] == 'gpt': |
404 | 409 |
ptable = GPTPartitionTable(self.real_device) |
405 |
self.meta['SIZE'] = ptable.shrink(new_size) |
|
410 |
self.meta['SIZE'] = ptable.shrink(new_size, self.meta['SIZE'])
|
|
406 | 411 |
else: |
407 |
self.meta['SIZE'] = new_size |
|
412 |
self.meta['SIZE'] = min(new_size + 2048 * sector_size, |
|
413 |
self.meta['SIZE']) |
|
414 |
|
|
415 |
self.out.success("new size is %dMB" % |
|
416 |
((self.meta['SIZE'] + MB - 1) // MB)) |
|
408 | 417 |
|
409 | 418 |
return self.meta['SIZE'] |
410 | 419 |
|
Also available in: Unified diff