Package: piuparts Severity: wishlist Tags: patch Hi,
I'd like to use piuparts but neither with creating a new chroot on every run, nor by unpacking a tarball on every run, but with LVM snapshots. There is a bug report about adding schroot support, but I didn't see any benefit of using schroot in contrast to just using LVM snapshots, so I implemented the latter. My patch is attached. Feel free to apply it or if you have any questions/comments get back to me. Best Regards, Patrick
Index: piuparts.py =================================================================== --- piuparts.py (Revision 535) +++ piuparts.py (Arbeitskopie) @@ -49,6 +49,7 @@ import subprocess import unittest import urllib +import uuid from debian_bundle import deb822 @@ -137,6 +138,7 @@ self.debian_distros = [] self.bindmounts = [] self.basetgz = None + self.lvm_volume = None self.savetgz = None self.endmeta = None self.saveendmeta = None @@ -554,6 +556,8 @@ if settings.basetgz: self.unpack_from_tgz(settings.basetgz) + elif settings.lvm_volume: + self.setup_from_lvm(settings.lvm_volume) else: self.setup_minimal_chroot() @@ -585,6 +589,10 @@ if not settings.keep_tmpdir and os.path.exists(self.name): self.unmount_proc() self.unmount_selinux() + if settings.lvm_volume: + logging.debug('Unmounting and removing LVM snapshot %s' % self.lvm_snapshot_name) + run(['umount', self.name]) + run(['lvremove', '-f', self.lvm_snapshot]) shutil.rmtree(self.name) logging.debug("Removed directory tree at %s" % self.name) elif settings.keep_tmpdir: @@ -608,6 +616,18 @@ logging.debug("Unpacking %s into %s" % (tarball, self.name)) run(["tar", "-C", self.name, "-zxf", tarball]) + def setup_from_lvm(self, lvm_volume): + """Create a chroot by creating an LVM snapshot.""" + self.lvm_base = os.path.dirname(lvm_volume) + self.lvm_vol_name = os.path.basename(lvm_volume) + self.lvm_snapshot_name = self.lvm_vol_name + "-" + str(uuid.uuid1()); + self.lvm_snapshot = os.path.join(self.lvm_base, self.lvm_snapshot_name) + + logging.debug("Creating LVM snapshot %s from %s" % (self.lvm_snapshot, lvm_volume)) + run(['lvcreate', '-n', self.lvm_snapshot, '-s', lvm_volume, '-L', settings.lvm_snapshot_size]) + logging.info("Mounting LVM snapshot to %s" % self.name); + run(['mount', self.lvm_snapshot, self.name]) + def run(self, command, ignore_errors=False): return run(["chroot", self.name] + command, ignore_errors=ignore_errors) @@ -1712,7 +1732,6 @@ def set_basetgz_to_pbuilder(option, opt, value, parser, *args, **kwargs): parser.values.basetgz = "/var/cache/pbuilder/base.tgz" - def parse_command_line(): """Parse the command line, change global settings, return non-options.""" @@ -1731,7 +1750,16 @@ help="Use TARBALL as the contents of the initial " + "chroot, instead of building a new one with " + "debootstrap.") - + + parser.add_option("--lvm-volume", metavar="LVM-VOL", action="store", + help="Use LVM-VOL as source for the chroot, instead of building " + + "a new one with debootstrap. This creates a snapshot of the " + + "given LVM volume and mounts it to the chroot path") + + parser.add_option("--lvm-snapshot-size", metavar="SNAPSHOT-SIZE", action="store", + default="1G", help="Use SNAPSHOT-SIZE as snapshot size when creating " + + "a new LVM snapshot (default: 1G)") + parser.add_option("-B", "--end-meta", metavar="FILE", help="XXX") @@ -1845,7 +1873,7 @@ help="No meaning anymore.") parser.add_option("--debfoster-options", - default="-o MaxPriority=required -o UseRecommends=no -f -n apt debfoster", + default="-o MaxPriority=required -o UseRecommends=no -o UseEssential=yes -f -n apt debfoster", help="Run debfoster with different parameters (default: -o MaxPriority=required -o UseRecommends=no -f -n apt debfoster).") @@ -1854,6 +1882,8 @@ settings.defaults = opts.defaults settings.args_are_package_files = not opts.apt settings.basetgz = opts.basetgz + settings.lvm_volume = opts.lvm_volume + settings.lvm_snapshot_size = opts.lvm_snapshot_size settings.bindmounts += opts.bindmount settings.debian_distros = opts.distribution settings.ignored_files += opts.ignore