diff --git a/docs/overview.rst b/docs/overview.rst index e375086077989c2a33396083439f84304ffc13d8..14c218022ce71c21e83433e532f4b5684fc18a4d 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -2,10 +2,8 @@ Overview ^^^^^^^^ snf-image-creator is a simple command-line tool for creating OS images. The -original media from which the image is created, can be a block device or a -regular file that represents a hard disk. Given a media file, snf-image-creator -will create a snapshot for it and will run a number of system preparation -operations on the snapshot, before the image is created. +original media, the image is created from, can be a block device or a regular +file that represents a hard disk. Snapshotting ============ @@ -13,12 +11,13 @@ Snapshotting snf-image-creator works on snapshots of the original media. Any changes made by the program do not affect the original media. -Preparation -=========== +Image Preparation +================= -Some of the system preparation operations are OS specific. snf-image-creator -will use heuristics to detect the OS of the media and determine which -operations should perform on it. The main purpose of running them is to: +During the image creation, a number of system preparation operations are +applied on the media snapshot. Some of those are OS specific. snf-image-creator +will use heuristics to detect the OS and determine which operations to apply. +Those operations will: * Shrink the image * Clear out sensitive user data (passwords, ssh keys, history files, etc.) @@ -28,12 +27,14 @@ operations should perform on it. The main purpose of running them is to: Creation ======== -The program can either dump the image file locally or directly upload it to -pithos and register it with `okeanos <http://www.okeanos.grnet.gr>`_. +The program can either dump the image file locally or use +`./kamaki <https://code.grnet.gr/projects/kamaki>`_ to directly upload and +register it on a `Synnefo <https://code.grnet.gr/projects/synnefo>`_ +deployment. Image Format ============ -The images the program creates are in diskdump format. This is the recommended -format for `snf-image <https://code.grnet.gr/projects/snf-image>`_, the Ganeti -OS Definition used by `Synnefo <https://code.grnet.gr/projects/synnefo>`_. +The extracted images are in diskdump format. This is the recommended format for +`snf-image <https://code.grnet.gr/projects/snf-image>`_, the Ganeti OS +Definition used by `Synnefo <https://code.grnet.gr/projects/synnefo>`_. diff --git a/image_creator/disk.py b/image_creator/disk.py index d1650534ece2593323c5cdab257aba729c5d1136..dc7cbd8259ca3db2eecddbecb7aa818a7ea6d3c0 100644 --- a/image_creator/disk.py +++ b/image_creator/disk.py @@ -292,16 +292,17 @@ class DiskDevice(object): raise FatalError(msg) is_extended = lambda p: \ - self.g.part_get_mbr_id(self.guestfs_device, p['part_num']) == 5 + self.g.part_get_mbr_id(self.guestfs_device, p['part_num']) \ + in (0x5, 0xf) is_logical = lambda p: \ - self.meta['PARTITION_TABLE'] != 'msdos' and p['part_num'] > 4 + self.meta['PARTITION_TABLE'] == 'msdos' and p['part_num'] > 4 partitions = self.g.part_list(self.guestfs_device) last_partition = partitions[-1] if is_logical(last_partition): # The disk contains extended and logical partitions.... - extended = [p for p in partitions if is_extended(p)][0] + extended = filter(is_extended, partitions)[0] last_primary = [p for p in partitions if p['part_num'] <= 4][-1] # check if extended is the last primary partition @@ -325,7 +326,8 @@ class DiskDevice(object): self.meta['PARTITION_TABLE'] == 'msdos' and p['part_num'] > 4 is_extended = lambda p: \ self.meta['PARTITION_TABLE'] == 'msdos' and \ - self.g.part_get_mbr_id(self.guestfs_device, p['part_num']) == 5 + self.g.part_get_mbr_id(self.guestfs_device, p['part_num']) \ + in (0x5, 0xf) part_add = lambda ptype, start, stop: \ self.g.part_add(self.guestfs_device, ptype, start, stop) @@ -375,10 +377,8 @@ class DiskDevice(object): self.g.resize2fs_M(part_dev) out = self.g.tune2fs_l(part_dev) - block_size = int( - filter(lambda x: x[0] == 'Block size', out)[0][1]) - block_cnt = int( - filter(lambda x: x[0] == 'Block count', out)[0][1]) + block_size = int(filter(lambda x: x[0] == 'Block size', out)[0][1]) + block_cnt = int(filter(lambda x: x[0] == 'Block count', out)[0][1]) start = last_part['part_start'] / sector_size end = start + (block_size * block_cnt) / sector_size - 1 @@ -394,16 +394,16 @@ class DiskDevice(object): 'num': partition['part_num'], 'start': partition['part_start'] / sector_size, 'end': partition['part_end'] / sector_size, - 'id': part_get_(partition['part_num']), + 'id': part_get_id(partition['part_num']), 'bootable': part_get_bootable(partition['part_num']) }) logical[-1]['end'] = end # new end after resize # Recreate the extended partition - extended = [p for p in partitions if self._is_extended(p)][0] + extended = filter(is_extended, partitions)[0] part_del(extended['part_num']) - part_add('e', extended['part_start'], end) + part_add('e', extended['part_start'] / sector_size, end) # Create all the logical partitions back for l in logical: