From: "Brian C. Lane" <bcl(a)redhat.com>
AMI images are un-partitioned filesystem images with a grub.conf that
is read by the pv-grub bootloader used by EC2. Most of the actual work
making the AMI is done in the kickstart. This just creates the image
file.
---
src/sbin/livemedia-creator | 41 ++++++++++++++++++++++++++++++-----------
1 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/src/sbin/livemedia-creator b/src/sbin/livemedia-creator
index 23c9b3f..e91c050 100755
--- a/src/sbin/livemedia-creator
+++ b/src/sbin/livemedia-creator
@@ -46,7 +46,7 @@ from pykickstart.version import makeVersion
from pylorax.base import DataHolder
from pylorax.treebuilder import TreeBuilder, RuntimeBuilder, udev_escape
from pylorax.sysutils import joinpaths, remove, linktree
-from pylorax.imgutils import PartitionMount, mksparse
+from pylorax.imgutils import PartitionMount, mksparse, mkext4img
from pylorax.executils import execWithRedirect, execWithCapture
@@ -406,6 +406,23 @@ def get_kernels( boot_dir ):
return [f[8:] for f in files if f.startswith("vmlinuz-")]
+def make_ami( disk_img, ami_img="ami-root.img", ami_label="AMI" ):
+ """
+ Copy the / partition to an un-partitioned disk image
+
+ ami_img is the filename to write, defaults to ami-root.img
+ ami_label is the FS label to apply to the image
+
+ All other AMI setup is handled by the kickstart's %post
+ """
+ with PartitionMount( disk_img ) as img_mount:
+ work_dir = tempfile.mkdtemp()
+ log.info("working dir is {0}".format(work_dir))
+ log.info("creating {0}".format(ami_img))
+ mkext4img(img_mount.mount_dir, joinpaths(work_dir, ami_img), label=ami_label)
+ return work_dir
+
+
def make_livecd( disk_img, squashfs_args="", templatedir=None,
title="Linux", project="Linux", releasever=16 ):
"""
@@ -423,6 +440,9 @@ def make_livecd( disk_img, squashfs_args="", templatedir=None,
"""
with PartitionMount( disk_img ) as img_mount:
+ if not img_mount or not img_mount.mount_dir:
+ return None
+
kernel_list = get_kernels( joinpaths( img_mount.mount_dir, "boot" ) )
log.debug( "kernel_list = {0}".format(kernel_list) )
if kernel_list:
@@ -592,7 +612,7 @@ if __name__ == '__main__':
log.error("You need to run this as root")
sys.exit( 1 )
- if not os.path.exists( opts.lorax_templates ):
+ if opts.make_iso and not os.path.exists( opts.lorax_templates ):
log.error( "The lorax templates directory ({0}) doesn't"
" exist.".format( opts.lorax_templates ) )
sys.exit( 1 )
@@ -614,10 +634,6 @@ if __name__ == '__main__':
log.error( "--make-appliance is not yet implemented." )
sys.exit( 1 )
- if opts.make_ami:
- log.error( "--make-ami is not yet implemented." )
- sys.exit( 1 )
-
if not opts.no_virt and not opts.iso and not opts.disk_image:
log.error( "virt-install needs an install iso." )
sys.exit( 1 )
@@ -701,13 +717,16 @@ if __name__ == '__main__':
result_dir = make_livecd( opts.disk_image or disk_img, opts.squashfs_args,
opts.lorax_templates,
opts.title, opts.project, opts.releasever )
+ elif opts.make_ami and not opts.image_only:
+ result_dir = make_ami(opts.disk_image or disk_img)
- if not opts.keep_image and not opts.disk_image:
- os.unlink( disk_img )
+ # cleanup the mess
+ if disk_img and not opts.keep_image and not opts.disk_image:
+ os.unlink( disk_img )
- if opts.result_dir:
- shutil.copytree( result_dir, opts.result_dir )
- shutil.rmtree( result_dir )
+ if opts.result_dir and result_dir:
+ shutil.copytree( result_dir, opts.result_dir )
+ shutil.rmtree( result_dir )
log.info("SUMMARY")
log.info("-------")
--
1.7.7.6