def mount_one_image(self, fsfile, mountpoint=None): if os.path.splitext(fsfile)[1] == '.cloop': blockdev_prefix = 'cloop' elif os.path.splitext(fsfile)[1] == '.squashfs': blockdev_prefix = 'loop' if blockdev_prefix == '': raise install_misc.InstallStepError( "No source device found for %s" % fsfile) dev = '' sysloops = sorted([ x for x in os.listdir('/sys/block') if x.startswith(blockdev_prefix) ]) for sysloop in sysloops: try: with open(os.path.join('/sys/block', sysloop, 'size')) as sysloopf: sysloopsize = sysloopf.readline().strip() if sysloopsize == '0': if osextras.find_on_path('udevadm'): udevinfo_cmd = ['udevadm', 'info'] else: udevinfo_cmd = ['udevinfo'] udevinfo_cmd.extend( ['-q', 'name', '-p', os.path.join('/block', sysloop)]) with open('/dev/null') as devnull: udevinfo = subprocess.Popen(udevinfo_cmd, stdout=subprocess.PIPE, stderr=devnull, universal_newlines=True) devbase = udevinfo.communicate()[0] if udevinfo.returncode != 0: devbase = sysloop dev = '/dev/%s' % devbase break except Exception: continue if dev == '': raise install_misc.InstallStepError( "No loop device available for %s" % fsfile) misc.execute('losetup', dev, fsfile) if mountpoint is None: mountpoint = '/var/lib/ubiquity/%s' % sysloop if not os.path.isdir(mountpoint): os.mkdir(mountpoint) if not misc.execute('mount', dev, mountpoint): misc.execute('losetup', '-d', dev) misc.execute('mount', '-o', 'loop', fsfile, mountpoint) dev = 'unused' return (dev, mountpoint)
def umount_source(self): """umounting loop system from cloop or squashfs system.""" devs = self.devs devs.reverse() mountpoints = self.mountpoints mountpoints.reverse() for mountpoint in mountpoints: if not misc.execute('umount', mountpoint): raise install_misc.InstallStepError("Failed to unmount %s" % mountpoint) for dev in devs: if (dev != '' and dev != 'unused' and not misc.execute('losetup', '-d', dev)): raise install_misc.InstallStepError( "Failed to detach loopback device %s" % dev)
def mount_source(self): """mounting loop system from cloop or squashfs system.""" self.devs = [] self.mountpoints = [] if not os.path.isdir(self.source): syslog.syslog('mkdir %s' % self.source) os.mkdir(self.source) fs_preseed = self.db.get('ubiquity/install/filesystem-images') if fs_preseed == '': # Simple autodetection on unionfs systems with open('/proc/mounts') as mounts: for line in mounts: (device, fstype) = line.split()[1:3] if fstype == 'squashfs' and os.path.exists(device): misc.execute('mount', '--bind', device, self.source) self.mountpoints.append(self.source) return # Manual detection on non-unionfs systems fsfiles = [ os.path.join(self.casper_path, 'filesystem.cloop'), os.path.join(self.casper_path, 'filesystem.squashfs'), '/cdrom/META/META.squashfs', '/live/image/live/filesystem.squashfs' ] for fsfile in fsfiles: if fsfile != '' and os.path.isfile(fsfile): dev, mountpoint = self.mount_one_image(fsfile, self.source) self.devs.append(dev) self.mountpoints.append(mountpoint) elif len(fs_preseed.split()) == 1: # Just one preseeded image. if not os.path.isfile(fs_preseed): raise install_misc.InstallStepError( "Preseeded filesystem image %s not found" % fs_preseed) dev, mountpoint = self.mount_one_image(fsfile, self.source) self.devs.append(dev) self.mountpoints.append(mountpoint) else: # OK, so we need to mount multiple images and unionfs them # together. for fsfile in fs_preseed.split(): if not os.path.isfile(fsfile): raise install_misc.InstallStepError( "Preseeded filesystem image %s not found" % fsfile) dev, mountpoint = self.mount_one_image(fsfile) self.devs.append(dev) self.mountpoints.append(mountpoint) assert self.devs assert self.mountpoints misc.execute( 'mount', '-t', 'unionfs', '-o', 'dirs=' + ':'.join(['%s=ro' % x for x in self.mountpoints]), 'unionfs', self.source) self.mountpoints.append(self.source)