[PATCH 5/6] livemedia-creator: Allow disk sizes to be < 1GiB

Brian C. Lane bcl at redhat.com
Fri Apr 4 22:04:07 UTC 2014


Anaconda seems to insist on 3G minimum, but that is a different issue.
---
 src/sbin/livemedia-creator | 35 ++++++++++++++++++++++-------------
 1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/src/sbin/livemedia-creator b/src/sbin/livemedia-creator
index c02727e..7ccc58b 100755
--- a/src/sbin/livemedia-creator
+++ b/src/sbin/livemedia-creator
@@ -240,7 +240,7 @@ class VirtualInstall( object ):
     """
     Run virt-install using an iso and kickstart(s)
     """
-    def __init__( self, iso, ks_paths, disk_img, img_size=2, 
+    def __init__( self, iso, ks_paths, disk_img, img_size=2048,
                   kernel_args=None, memory=1024, vnc=None, arch=None,
                   log_check=None, virtio_host="127.0.0.1", virtio_port=6080,
                   qcow2=False):
@@ -250,7 +250,7 @@ class VirtualInstall( object ):
         ks_paths is a list of paths to a kickstart files. All are injected, the
                  first one is the one executed.
         disk_img is the path to a disk image (doesn't need to exist)
-        img_size is the size, in GiB, of the image if it doesn't exist
+        img_size is the size, in MiB, of the image if it doesn't exist
         kernel_args are extra arguments to pass on the kernel cmdline
         memory is the amount of ram to assign to the virt
         vnc is passed to the --graphics command verbatim
@@ -282,7 +282,7 @@ class VirtualInstall( object ):
         else:
             disk_opts += ",format=raw"
         if not os.path.isfile(disk_img):
-            disk_opts += ",size={0}".format(img_size)
+            mksparse(disk_img, img_size * 1024**2)
         args.append("--disk")
         args.append(disk_opts)
 
@@ -416,21 +416,26 @@ def make_appliance(disk_img, name, template, outfile, networks=None, ram=1024,
         f.write(result)
 
 
-def make_fsimage(diskimage, fsimage, label="Anaconda"):
+def make_fsimage(diskimage, fsimage, img_size=None, label="Anaconda"):
     """
     Copy the / partition of a partitioned disk image to an un-partitioned
     disk image.
 
     diskimage is the full path to partitioned disk image with a /
     fsimage is the full path of the output fs image file
+    img_size is the size of the fsimage in MiB or None to make it as small as possible
     label is the label to apply to the image. Defaults to "Anaconda"
     """
     with PartitionMount(diskimage) as img_mount:
         if not img_mount or not img_mount.mount_dir:
             return None
 
-        log.info("Creating fsimage %s", fsimage)
-        mkext4img(img_mount.mount_dir, fsimage, label=label)
+        log.info("Creating fsimage %s (%s)", (fsimage, img_size or "minimized"))
+        if img_size:
+            # convert to Bytes
+            img_size *= 1024*1024
+
+        mkext4img(img_mount.mount_dir, fsimage, size=img_size, label=label)
 
 
 def make_runtime(opts, mount_dir, work_dir):
@@ -522,6 +527,10 @@ def make_livecd(opts, mount_dir, work_dir):
 def novirt_install(opts, disk_img, disk_size, repo_url):
     """
     Use Anaconda to install to a disk image
+
+    disk_img is the full path to the disk image to be created
+    disk_size is the size in MiB
+    repo_url is the url of the repository to use for the installation
     """
     import selinux
 
@@ -549,7 +558,7 @@ def novirt_install(opts, disk_img, disk_size, repo_url):
         # Make a blank fs image
         args += ["--dirinstall"]
 
-        mkext4img(None, disk_img, label=opts.fs_label, size=disk_size * 1024**3)
+        mkext4img(None, disk_img, label=opts.fs_label, size=disk_size * 1024**2)
         if not os.path.isdir(ROOT_PATH):
             os.mkdir(ROOT_PATH)
         mount(disk_img, opts="loop", mnt=ROOT_PATH)
@@ -557,7 +566,7 @@ def novirt_install(opts, disk_img, disk_size, repo_url):
         args += ["--image", disk_img]
 
         # Create the sparse image
-        mksparse(disk_img, disk_size * 1024**3)
+        mksparse(disk_img, disk_size * 1024**2)
 
     # Make sure anaconda has the right product and release
     os.environ["ANACONDA_PRODUCTNAME"] = opts.project
@@ -612,7 +621,7 @@ def virt_install(opts, install_log, disk_img, disk_size):
 
     install_log is the path to write the log from virt-install
     disk_img is the full path to the final disk or filesystem image
-    disk_size is the size of the disk to create in GiB
+    disk_size is the size of the disk to create in MiB
     """
     iso_mount = IsoMountpoint(opts.iso, opts.location)
     log_monitor = LogMonitor(install_log)
@@ -629,7 +638,7 @@ def virt_install(opts, install_log, disk_img, disk_size):
         for arg in opts.qcow2_args:
             qcow2_args += arg.split(" ", 1)
 
-        mkqcow2(disk_img, disk_size*1024**3, qcow2_args)
+        mkqcow2(disk_img, disk_size*1024**2, qcow2_args)
 
     if opts.make_fsimage:
         diskimg_path = tempfile.mktemp(prefix="disk", suffix=".img", dir=opts.tmp)
@@ -651,7 +660,7 @@ def virt_install(opts, install_log, disk_img, disk_size):
         raise InstallError("virt_install failed")
 
     if opts.make_fsimage:
-        make_fsimage(diskimg_path, disk_img, label=opts.fs_label)
+        make_fsimage(diskimg_path, disk_img, disk_size, label=opts.fs_label)
         os.unlink(diskimg_path)
 
 
@@ -678,8 +687,8 @@ def make_image(opts, ks):
 
     Returns the full path of of the image created.
     """
-    disk_size = 1 + (sum([p.size for p in ks.handler.partition.partitions]) / 1024)
-    log.info("disk_size = %sGB", disk_size)
+    disk_size = 1 + sum([p.size for p in ks.handler.partition.partitions])
+    log.info("disk_size = %sMiB", disk_size)
 
     if opts.image_name:
         disk_img = joinpaths(opts.tmp, opts.image_name)
-- 
1.9.0



More information about the anaconda-patches mailing list