X-Git-Url: https://code.grnet.gr/git/snf-image-creator/blobdiff_plain/63e1b902670d78f62cd75c1d154bcbd2fd6e15ae..aa816e8c2c55e13a551868b5afd9170cebefb6bd:/image_creator/bundle_volume.py diff --git a/image_creator/bundle_volume.py b/image_creator/bundle_volume.py index e86d613..c099daa 100644 --- a/image_creator/bundle_volume.py +++ b/image_creator/bundle_volume.py @@ -42,6 +42,7 @@ from image_creator.rsync import Rsync from image_creator.util import get_command from image_creator.util import FatalError from image_creator.util import try_fail_repeat +from image_creator.util import free_space findfs = get_command('findfs') dd = get_command('dd') @@ -67,10 +68,11 @@ MKFS_OPTS = {'ext2': ['-F'], class BundleVolume(object): """This class can be used to create an image out of the running system""" - def __init__(self, out, meta): + def __init__(self, out, meta, tmp=None): """Create an instance of the BundleVolume class.""" self.out = out self.meta = meta + self.tmp = tmp self.out.output('Searching for root device ...', False) root = self._get_root_partition() @@ -211,7 +213,7 @@ class BundleVolume(object): # Add 10% just to be on the safe side part_end = last.start + (new_size * 11) // 10 - # Alighn to 2048 + # Align to 2048 part_end = ((part_end + 2047) // 2048) * 2048 image_disk.setPartitionGeometry( @@ -279,6 +281,8 @@ class BundleVolume(object): def _to_exclude(self): excluded = ['/tmp', '/var/tmp'] + if self.tmp is not None: + excluded.append(self.tmp) local_filesystems = MKFS_OPTS.keys() + ['rootfs'] for entry in self._read_fstable('/proc/mounts'): if entry.fs in local_filesystems: @@ -385,7 +389,7 @@ class BundleVolume(object): rsync.exclude(excl) rsync.archive().hard_links().xattrs().sparse().acls() - rsync.run('/', target, 'host', 'tmp image') + rsync.run('/', target, 'host', 'temporary image') # We need to replace the old UUID referencies with the new # ones in grub configuration files and /etc/fstab for file @@ -418,28 +422,25 @@ class BundleVolume(object): end_sector = self._shrink_partitions(image) - # Check if the available space is enough to host the image - dirname = os.path.dirname(image) size = (end_sector + 1) * self.disk.device.sectorSize - self.out.output("Examining available space in %s ..." % dirname, False) - stat = os.statvfs(dirname) - available = stat.f_bavail * stat.f_frsize - if available <= size: - raise FatalError('Not enough space in %s to host the image' % - dirname) - self.out.success("sufficient") - 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. + # Truncate image to the new size. fd = os.open(image, os.O_RDWR) try: os.ftruncate(fd, size) finally: os.close(fd) + # Check if the available space is enough to host the image + dirname = os.path.dirname(image) + self.out.output("Examining available space ...", False) + if free_space(dirname) <= size: + raise FatalError('Not enough space under %s to host the image' % + dirname) + self.out.success("sufficient") + + self._create_filesystems(image) + return image # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :