+ def _mount(self, target, devs):
+
+ devs.sort(key=lambda d: d[1])
+ for dev, mpoint in devs:
+ absmpoint = os.path.abspath(target + mpoint)
+ if not os.path.exists(absmpoint):
+ os.makedirs(absmpoint)
+ mount(dev, absmpoint)
+
+ def _umount_all(self, target):
+ mpoints = []
+ for entry in self._read_fstable('/proc/mounts'):
+ if entry.mpoint.startswith(os.path.abspath(target)):
+ mpoints.append(entry.mpoint)
+
+ mpoints.sort()
+ for mpoint in reversed(mpoints):
+ umount(mpoint)
+
+ def _create_filesystems(self, image):
+
+ partitions = self._get_partitions(parted.Disk(parted.Device(image)))
+ filesystems = {}
+ for p in self.disk.partitions:
+ filesystems[p.number] = self._get_mount_options(p.path)
+
+ unmounted = filter(lambda p: filesystems[p.num] is None, partitions)
+ mounted = filter(lambda p: filesystems[p.num] is not None, partitions)
+
+ # For partitions that are not mounted right now, we can simply dd them
+ # into the image.
+ for p in unmounted:
+ dd('if=%s' % self.disk.device.path, 'of=%s' % image,
+ 'count=%d' % (p.end - p.start + 1), 'conv=notrunc',
+ 'seek=%d' % p.start, 'skip=%d' % p.start)
+
+ loop = str(losetup('-f', '--show', image)).strip()
+ mapped = {}
+ try:
+ for p in mounted:
+ i = p.num
+ mapped[i] = self._map_partition(loop, i, p.start, p.end)
+
+ # Create the file systems
+ for i, dev in mapped.iteritems():
+ fs = filesystems[i].fs
+ self.out.output('Creating %s filesystem on partition %d ... ' %
+ (fs, i), False)
+ get_command('mkfs.%s' % fs)(*(MKFS_OPTS[fs] + [dev]))
+ self.out.success('done')
+
+ target = tempfile.mkdtemp()
+ try:
+ absmpoints = self._mount(target,
+ [(mapped[i], filesystems[i].mpoint) for i in mapped.keys()]
+ )
+
+ finally:
+ self._umount_all(target)
+ os.rmdir(target)
+ finally:
+ for dev in mapped.values():
+ self._unmap_partition(dev)
+ losetup('-d', loop)
+
+ def create_image(self):