Skip to content
Snippets Groups Projects
Commit 033007ec authored by Nikos Skalkotos's avatar Nikos Skalkotos
Browse files

Merge branch 'stable-0.1'

parents 3664c5f5 7f9ecc51
No related branches found
No related tags found
No related merge requests found
...@@ -2,10 +2,8 @@ Overview ...@@ -2,10 +2,8 @@ Overview
^^^^^^^^ ^^^^^^^^
snf-image-creator is a simple command-line tool for creating OS images. The 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 original media, the image is created from, can be a block device or a regular
regular file that represents a hard disk. Given a media file, snf-image-creator file that represents a hard disk.
will create a snapshot for it and will run a number of system preparation
operations on the snapshot, before the image is created.
Snapshotting Snapshotting
============ ============
...@@ -13,12 +11,13 @@ Snapshotting ...@@ -13,12 +11,13 @@ Snapshotting
snf-image-creator works on snapshots of the original media. Any changes made by snf-image-creator works on snapshots of the original media. Any changes made by
the program do not affect the original media. the program do not affect the original media.
Preparation Image Preparation
=========== =================
Some of the system preparation operations are OS specific. snf-image-creator During the image creation, a number of system preparation operations are
will use heuristics to detect the OS of the media and determine which applied on the media snapshot. Some of those are OS specific. snf-image-creator
operations should perform on it. The main purpose of running them is to: will use heuristics to detect the OS and determine which operations to apply.
Those operations will:
* Shrink the image * Shrink the image
* Clear out sensitive user data (passwords, ssh keys, history files, etc.) * 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: ...@@ -28,12 +27,14 @@ operations should perform on it. The main purpose of running them is to:
Creation Creation
======== ========
The program can either dump the image file locally or directly upload it to The program can either dump the image file locally or use
pithos and register it with `okeanos <http://www.okeanos.grnet.gr>`_. `./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 Image Format
============ ============
The images the program creates are in diskdump format. This is the recommended The extracted images are in diskdump format. This is the recommended format for
format for `snf-image <https://code.grnet.gr/projects/snf-image>`_, the Ganeti `snf-image <https://code.grnet.gr/projects/snf-image>`_, the Ganeti OS
OS Definition used by `Synnefo <https://code.grnet.gr/projects/synnefo>`_. Definition used by `Synnefo <https://code.grnet.gr/projects/synnefo>`_.
...@@ -292,16 +292,17 @@ class DiskDevice(object): ...@@ -292,16 +292,17 @@ class DiskDevice(object):
raise FatalError(msg) raise FatalError(msg)
is_extended = lambda p: \ 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: \ 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) partitions = self.g.part_list(self.guestfs_device)
last_partition = partitions[-1] last_partition = partitions[-1]
if is_logical(last_partition): if is_logical(last_partition):
# The disk contains extended and logical partitions.... # 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] last_primary = [p for p in partitions if p['part_num'] <= 4][-1]
# check if extended is the last primary partition # check if extended is the last primary partition
...@@ -325,7 +326,8 @@ class DiskDevice(object): ...@@ -325,7 +326,8 @@ class DiskDevice(object):
self.meta['PARTITION_TABLE'] == 'msdos' and p['part_num'] > 4 self.meta['PARTITION_TABLE'] == 'msdos' and p['part_num'] > 4
is_extended = lambda p: \ is_extended = lambda p: \
self.meta['PARTITION_TABLE'] == 'msdos' and \ 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: \ part_add = lambda ptype, start, stop: \
self.g.part_add(self.guestfs_device, ptype, start, stop) self.g.part_add(self.guestfs_device, ptype, start, stop)
...@@ -375,10 +377,8 @@ class DiskDevice(object): ...@@ -375,10 +377,8 @@ class DiskDevice(object):
self.g.resize2fs_M(part_dev) self.g.resize2fs_M(part_dev)
out = self.g.tune2fs_l(part_dev) out = self.g.tune2fs_l(part_dev)
block_size = int( block_size = int(filter(lambda x: x[0] == 'Block size', out)[0][1])
filter(lambda x: x[0] == 'Block size', out)[0][1]) block_cnt = int(filter(lambda x: x[0] == 'Block count', out)[0][1])
block_cnt = int(
filter(lambda x: x[0] == 'Block count', out)[0][1])
start = last_part['part_start'] / sector_size start = last_part['part_start'] / sector_size
end = start + (block_size * block_cnt) / sector_size - 1 end = start + (block_size * block_cnt) / sector_size - 1
...@@ -394,16 +394,16 @@ class DiskDevice(object): ...@@ -394,16 +394,16 @@ class DiskDevice(object):
'num': partition['part_num'], 'num': partition['part_num'],
'start': partition['part_start'] / sector_size, 'start': partition['part_start'] / sector_size,
'end': partition['part_end'] / 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']) 'bootable': part_get_bootable(partition['part_num'])
}) })
logical[-1]['end'] = end # new end after resize logical[-1]['end'] = end # new end after resize
# Recreate the extended partition # 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_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 # Create all the logical partitions back
for l in logical: for l in logical:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment