import os
import re
-import uuid
import tempfile
import time
from collections import namedtuple
from image_creator.util import FatalError
findfs = get_command('findfs')
-truncate = get_command('truncate')
dd = get_command('dd')
dmsetup = get_command('dmsetup')
losetup = get_command('losetup')
image_disk.setPartitionGeometry(
image_disk.getPartitionBySector(last.start),
parted.Constraint(device=image_disk.device),
- start=last.start, end=last.end)
+ start=last.start, end=part_end)
image_disk.commit()
# Parted may have changed this for better alignment
partitions[-1] = last
# Leave 2048 blocks at the end.
- new_end = new_size + 2048
+ new_end = part_end + 2048
if last.type == parted.PARTITION_LOGICAL:
# Fix the extended partition
ext.geometry.start, end=last.end)
image_disk.commit()
+ image_dev.destroy()
return new_end
def _map_partition(self, dev, num, start, end):
'/boot/grub/menu.lst',
'/boot/grub/grub.conf']
- orig = dict(map(lambda p: (p.number, blkid( '-s', 'UUID', '-o',
+ orig = dict(map(lambda p: (p.number, blkid('-s', 'UUID', '-o',
'value', p.path).stdout.strip()), self.disk.partitions))
for f in map(lambda f: target + f, files):
self._unmap_partition(dev)
losetup('-d', loop)
- def create_image(self):
+ def create_image(self, image):
- image = '/mnt/%s.diskdump' % uuid.uuid4().hex
-
- disk_size = self.disk.device.getLength() * self.disk.device.sectorSize
+ size = self.disk.device.getLength() * self.disk.device.sectorSize
# Create sparse file to host the image
- truncate("-s", "%d" % disk_size, image)
+ fd = os.open(image, os.O_WRONLY | os.O_CREAT)
+ try:
+ os.ftruncate(fd, size)
+ finally:
+ os.close(fd)
self._create_partition_table(image)
self._create_filesystems(image)
+ # Truncate image to the new size. I counldn't find a better way to do
+ # this. It seems that python's high level functions work in a different
+ # way.
+ fd = os.open(image, os.O_RDWR)
+ try:
+ os.ftruncate(fd, size)
+ finally:
+ os.close(fd)
+
return image
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :