imgcreate/creator.py | 2 - imgcreate/fs.py | 62 +++++++++++++++++++++++++++------------------------ 2 files changed, 35 insertions(+), 29 deletions(-)
New commits: commit 6a3849d072b142f6c5c5bba07dd6521a1ef0c03a Author: Jeremy Katz <ka...@redhat.com> Date: Mon Jul 6 14:29:30 2009 -0400 Store a copy of the filesystem image before resize Save a copy of an e2image before we do the resize so that if it fails, people can have something to provide via bugzilla diff --git a/imgcreate/fs.py b/imgcreate/fs.py index c19e8a0..c536de3 100644 --- a/imgcreate/fs.py +++ b/imgcreate/fs.py @@ -25,6 +25,7 @@ import subprocess import random import string import logging +import tempfile from imgcreate.errors import * @@ -56,6 +57,9 @@ def resize2fs(fs, size = None, minimal = False): raise RuntimeError("Must specify either a size or minimal for resize!") e2fsck(fs) + (fd, saved_image) = tempfile.mkstemp("", "resize-image-", "/tmp") + os.close(fd) + subprocess.call(["/sbin/e2image", "-r", fs, saved_image]) dev_null = os.open("/dev/null", os.O_WRONLY) args = ["/sbin/resize2fs", fs] @@ -72,7 +76,8 @@ def resize2fs(fs, size = None, minimal = False): return ret if e2fsck(fs) != 0: - raise CreatorError("fsck after resize returned an error!") + raise CreatorError("fsck after resize returned an error! image to debug at %s" %(saved_image,)) + os.unlink(saved_image) return 0 def e2fsck(fs): commit 44c17e8655e2787d3bb2fdc5ab32be18526ce284 Author: Jeremy Katz <ka...@redhat.com> Date: Mon Jul 6 14:26:43 2009 -0400 Consolidate calls to fsck We always want to fsck before/after resizing, so just do it in the resize method rather than having it scattered everywhere. diff --git a/imgcreate/fs.py b/imgcreate/fs.py index 567376a..c19e8a0 100644 --- a/imgcreate/fs.py +++ b/imgcreate/fs.py @@ -54,6 +54,9 @@ def resize2fs(fs, size = None, minimal = False): raise RuntimeError("Can't specify both minimal and a size for resize!") if not minimal and size is None: raise RuntimeError("Must specify either a size or minimal for resize!") + + e2fsck(fs) + dev_null = os.open("/dev/null", os.O_WRONLY) args = ["/sbin/resize2fs", fs] if minimal: @@ -61,9 +64,21 @@ def resize2fs(fs, size = None, minimal = False): else: args.append("%sK" %(size / 1024,)) try: - return subprocess.call(args, stdout = dev_null, stderr = dev_null) + ret = subprocess.call(args, stdout = dev_null, stderr = dev_null) finally: os.close(dev_null) + + if ret != 0: + return ret + + if e2fsck(fs) != 0: + raise CreatorError("fsck after resize returned an error!") + return 0 + +def e2fsck(fs): + logging.debug("Checking filesystem %s" % fs) + rc = subprocess.call(["/sbin/e2fsck", "-f", "-y", fs]) + return rc class BindChrootMount: """Represents a bind mount of a directory into a chroot.""" @@ -402,11 +417,7 @@ class ExtDiskMount(DiskMount): if size > current_size: self.disk.expand(size) - self.__fsck() - resize2fs(self.disk.lofile, size) - - self.__fsck() return size def __create(self): @@ -426,8 +437,7 @@ class ExtDiskMount(DiskMount): DiskMount.mount(self) def __fsck(self): - logging.debug("Checking filesystem %s" % self.disk.lofile) - rc = subprocess.call(["/sbin/e2fsck", "-f", "-y", self.disk.lofile]) + return e2fsck(self.disk.lofile) return rc def __get_size_from_filesystem(self): @@ -449,12 +459,8 @@ class ExtDiskMount(DiskMount): return int(parse_field(out, "Block count")) * self.blocksize def __resize_to_minimal(self): - self.__fsck() resize2fs(self.disk.lofile, minimal = True) - min = self.__get_size_from_filesystem() - if self.__fsck() != 0: - raise CreatorError("fsck returned an error!") - return min + return self.__get_size_from_filesystem() def resparse(self, size = None): self.cleanup() commit 1e5e6019a058c6acde0b4cb85a21cac4d7b66a60 Author: Jeremy Katz <ka...@redhat.com> Date: Mon Jul 6 13:49:14 2009 -0400 Use resize2fs -M instead of binary search esandeen got a "resize to minimal size" option added to resize2fs, so we should use it rather than our bisecting down to a minimal size. And maybe then we'll hit fewer resize2fs bugs. diff --git a/imgcreate/fs.py b/imgcreate/fs.py index 65f16e4..567376a 100644 --- a/imgcreate/fs.py +++ b/imgcreate/fs.py @@ -49,11 +49,19 @@ def mksquashfs(in_img, out_img): raise SquashfsError("'%s' exited with error (%d)" % (string.join(args, " "), ret)) -def resize2fs(fs, size): +def resize2fs(fs, size = None, minimal = False): + if minimal and size is not None: + raise RuntimeError("Can't specify both minimal and a size for resize!") + if not minimal and size is None: + raise RuntimeError("Must specify either a size or minimal for resize!") dev_null = os.open("/dev/null", os.O_WRONLY) + args = ["/sbin/resize2fs", fs] + if minimal: + args.append("-M") + else: + args.append("%sK" %(size / 1024,)) try: - return subprocess.call(["/sbin/resize2fs", fs, "%sK" % (size / 1024,)], - stdout = dev_null, stderr = dev_null) + return subprocess.call(args, stdout = dev_null, stderr = dev_null) finally: os.close(dev_null) @@ -442,24 +450,11 @@ class ExtDiskMount(DiskMount): def __resize_to_minimal(self): self.__fsck() - - # - # Use a binary search to find the minimal size - # we can resize the image to - # - bot = 0 - top = self.__get_size_from_filesystem() - while top != (bot + 1): - t = bot + ((top - bot) / 2) - - if not resize2fs(self.disk.lofile, t): - top = t - else: - bot = t - + resize2fs(self.disk.lofile, minimal = True) + min = self.__get_size_from_filesystem() if self.__fsck() != 0: raise CreatorError("fsck returned an error!") - return top + return min def resparse(self, size = None): self.cleanup() commit 0b0d40f7bdfc05c3220f44eec9bbb37bd8475587 Author: Jeremy Katz <ka...@redhat.com> Date: Mon Jun 29 10:58:42 2009 -0400 Don't error out with SELinux disabled on the host (#508402) diff --git a/imgcreate/creator.py b/imgcreate/creator.py index 1f8971f..910c778 100644 --- a/imgcreate/creator.py +++ b/imgcreate/creator.py @@ -433,7 +433,7 @@ class ImageCreator(object): def __getbooleans(self): booleans = [] - if not kickstart.selinux_enabled(self.ks): + if not kickstart.selinux_enabled(self.ks) or not os.path.exists("/selinux/enforce"): return booleans for i in selinux.security_get_boolean_names()[1]: on = selinux.security_get_boolean_active(i) -- Fedora-livecd-list mailing list Fedora-livecd-list@redhat.com https://www.redhat.com/mailman/listinfo/fedora-livecd-list