def progress(self): """Monitor the amount of disk space used on the target and source and update the hub's progress bar. """ mountpoints = payload_utils.get_mount_points() last_pct = -1 while self.pct < 100: dest_size = 0 for mnt in mountpoints: mnt_stat = os.statvfs(conf.target.system_root + mnt) dest_size += mnt_stat.f_frsize * (mnt_stat.f_blocks - mnt_stat.f_bfree) if dest_size >= self._adj_size: dest_size -= self._adj_size pct = int(100 * dest_size / self.source_size) if pct != last_pct: with self.pct_lock: self.pct = pct last_pct = pct progressQ.send_message( _("Installing software") + (" %d%%") % (min(100, self.pct), )) sleep(0.777)
def progress(self): """Monitor the amount of disk space used on the target and source and update the hub's progress bar. """ mount_points = payload_utils.get_mount_points() last_pct = -1 while self.pct < 100: dest_size = self._get_destination_size(mount_points) if dest_size >= self._adj_size: dest_size -= self._adj_size pct = int(100 * dest_size / self.source_size) if pct != last_pct: with self.pct_lock: self.pct = pct last_pct = pct progressQ.send_message(_("Installing software") + (" %d%%") % (min(100, self.pct),)) sleep(0.777)
def _prepare_mount_targets(self, data): """ Prepare the ostree root """ mount_points = payload_utils.get_mount_points() # Currently, blivet sets up mounts in the physical root. # We used to unmount them and remount them in the sysroot, but # since 664ef7b43f9102aa9332d0db5b7d13f8ece436f0 we now just set up # bind mounts. # Make /usr readonly like ostree does at runtime normally self._setup_internal_bindmount('/usr', bind_ro=True, src_physical=False) # Explicitly do API mounts; some of these may be tracked by blivet, but # we'll skip them below. api_mounts = ["/dev", "/proc", "/run", "/sys"] for path in api_mounts: self._setup_internal_bindmount(path) # Handle /var; if the admin didn't specify a mount for /var, we need # to do the default ostree one. # https://github.com/ostreedev/ostree/issues/855 var_root = '/ostree/deploy/' + data.osname + '/var' if mount_points.get("/var") is None: self._setup_internal_bindmount(var_root, dest='/var', recurse=False) else: # Otherwise, bind it self._setup_internal_bindmount('/var', recurse=False) # Now that we have /var, start filling in any directories that may be # required later there. We explicitly make /var/lib, since # systemd-tmpfiles doesn't have a --prefix-only=/var/lib. We rely on # 80-setfilecons.ks to set the label correctly. util.mkdirChain(conf.target.system_root + '/var/lib') # Next, run tmpfiles to make subdirectories of /var. We need this for # both mounts like /home (really /var/home) and %post scripts might # want to write to e.g. `/srv`, `/root`, `/usr/local`, etc. The # /var/lib/rpm symlink is also critical for having e.g. `rpm -qa` work # in %post. We don't iterate *all* tmpfiles because we don't have the # matching NSS configuration inside Anaconda, and we can't "chroot" to # get it because that would require mounting the API filesystems in the # target. for varsubdir in ('home', 'roothome', 'lib/rpm', 'opt', 'srv', 'usrlocal', 'mnt', 'media', 'spool', 'spool/mail'): self._safe_exec_with_redirect("systemd-tmpfiles", [ "--create", "--boot", "--root=" + conf.target.system_root, "--prefix=/var/" + varsubdir ]) # Handle mounts like /boot (except avoid /boot/efi; we just need the # toplevel), and any admin-specified points like /home (really # /var/home). Note we already handled /var above. Avoid recursion since # sub-mounts will be in the list too. We sort by length as a crude # hack to try to simulate the tree relationship; it looks like this # is handled in blivet in a different way. for mount in sorted(mount_points, key=len): if mount in ('/', '/var') or mount in api_mounts: continue self._setup_internal_bindmount(mount, recurse=False) # And finally, do a nonrecursive bind for the sysroot self._setup_internal_bindmount("/", dest="/sysroot", recurse=False)