Fabian Deutsch has uploaded a new change for review. Change subject: update: Make sure to use the right kernel modules ......................................................................
update: Make sure to use the right kernel modules The initramfs rebuild suffered from the fact that in the Engine upgrade flow, the running kernel and the modules available in /lib/modules did not match the updated kernel version, this is because the new rootfs would only become effective on the next boot. This is a problem because dracut has assumptions. This patch does some tricks - mainly mounting /lib/modules and /boot into the right places - to enable dracut to work nicely. Change-Id: Ie893e722e24b1dd2e8e41970e16091d83c65dad8 Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1270228 Signed-off-by: Fabian Deutsch <[email protected]> --- M scripts/ovirt-node-update-initramfs M src/ovirt/node/utils/system.py M src/ovirtnode/install.py 3 files changed, 82 insertions(+), 19 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-node refs/changes/14/47614/1 diff --git a/scripts/ovirt-node-update-initramfs b/scripts/ovirt-node-update-initramfs index 6af825f..a7a9871 100755 --- a/scripts/ovirt-node-update-initramfs +++ b/scripts/ovirt-node-update-initramfs @@ -31,7 +31,8 @@ initramfs = system.Initramfs() try: - initramfs.rebuild() + kver = check_output(["uname", "-r"]) + initramfs.rebuild(kver) except: log.exception("Initramfs regeneration failed") sys.exit(1) diff --git a/src/ovirt/node/utils/system.py b/src/ovirt/node/utils/system.py index 472d0bb..d2e7870 100755 --- a/src/ovirt/node/utils/system.py +++ b/src/ovirt/node/utils/system.py @@ -356,16 +356,23 @@ @contextmanager -def mounted_boot(): - LOGGER.info("Mounting /liveos and /boot") - import ovirtnode.ovirtfunctions as ofunc +def mounted_boot(source="/liveos"): + """Used to mount /boot + Normally /boot is from the /liveos mountpoint, but sometimes it's + elsewhere, thus we have source + """ - ofunc.mount_liveos() - if not os.path.ismount("/liveos"): - raise RuntimeError("Failed to mount /liveos") + LOGGER.info("Mounting %r to /boot" % source) - liveos = Mount("/liveos") - boot = Mount(device="/liveos", path="/boot") + if source == "/liveos": + import ovirtnode.ovirtfunctions as ofunc + ofunc.mount_liveos() + + if not os.path.ismount("/liveos"): + raise RuntimeError("Failed to mount /liveos") + + liveos = Mount(source) + boot = Mount(device=source, path="/boot") liveos.remount(rw=True) boot.mount("bind") @@ -1321,20 +1328,29 @@ The main obstacle is mounting the correct paths. Furthermore we are taking care that now orphans are left over. + + Args: + boot_source: Source for the /boot mount point """ + boot_source = None + + def __init__(self, boot_source=None): + self.boot_source = boot_source + def try_unlink(self, path): try: os.unlink(path) except OSError as e: LOGGER.warn("Failed to remove %r: %s", path, e) - def _generate_new_initramfs(self, new_initrd): + def _generate_new_initramfs(self, new_initrd, kver): LOGGER.info("Generating new initramfs " - "%r (this can take a while)" % new_initrd) - + "%r for kver %s (this can take a while)" % + (new_initrd, kver) rd_stdout = "" try: - rd_stdout = check_output(["dracut", new_initrd], + rd_stdout = check_output(["dracut", "--kver", + kver, new_initrd], stderr=process.STDOUT) except: LOGGER.warn("dracut failed to generate the initramfs") @@ -1368,16 +1384,17 @@ self.try_unlink(new_initrd) raise - def rebuild(self): + def rebuild(self, kver): pri_initrd = "/boot/initrd0.img" new_initrd = "/var/tmp/initrd0.img.new" LOGGER.info("Preparing to regenerate the initramfs") LOGGER.info("The regenreation will overwrite the " "existing") + LOGGER.info("Rebuilding for kver: %s" % kver) - with mounted_boot(): - self._generate_new_initramfs(new_initrd) + with mounted_boot(source=self.boot_source): + self._generate_new_initramfs(new_initrd, kver) self._install_new_initramfs(new_initrd, pri_initrd) LOGGER.info("Initramfs regenration completed successfully") diff --git a/src/ovirtnode/install.py b/src/ovirtnode/install.py index d59b3a8..537820c 100755 --- a/src/ovirtnode/install.py +++ b/src/ovirtnode/install.py @@ -675,9 +675,6 @@ else: logger.info("Grub Installation Completed") - # Update initramfs to pickup multipath wwids - _system.Initramfs().rebuild() - if _functions.is_iscsi_install() or _functions.findfs("BootNew"): # copy default for when Root/HostVG is inaccessible(iscsi upgrade) shutil.copy(_functions.OVIRT_DEFAULTS, "/boot") @@ -695,6 +692,52 @@ # mark new Root ready to go, reboot() in ovirt-function switches it # to active e2label_cmd = "e2label \"%s\" RootUpdate" % candidate_dev + + mnts = [] + try: + # Let's mount the update fs, and use that kernel version and modules + # We need this work to help dracut + + isomnt = tempfile.mkdtemp("RootUpdate") + squashmnt = tempfile.mkdtemp("RootUpdate-LiveOS") + updfs = tempfile.mkdtemp("RootUpdate-LiveOS-Img") + mnts += [isomnt, squashmnt, updfs] + + # Unpack the iso + subprocess.check_call(["mount", + "LABEL=RootUpdate", isomnt]) + subprocess.check_call(["mount", + "%s/LiveOS/squashfs.img" % isomnt, squashmnt]) + subprocess.check_call(["mount", + "%s/LiveOS/ext3fs.img" % squashmnt, updfs]) + + # Now mount the update modules into place, and find the + # correct kver + subprocess.check_call(["mount", "--bind", + "%s/lib/modules" % updfs, + "/lib/modules"]) + mnts += ["/lib/modules"] + + upd_kver = str(_functions.passthrough("ls /lib/modules" % updfs)).strip() + + if len(upd_kver.splitlines()) != 1: + # It would be very unusual to see more than one kver directory + # in /usr/lib, because our images just contain one kernel + raise RuntimeError("Found more than one kernel version") + + # Update initramfs to pickup multipath wwids + builder = _system.Initramfs(boot_source=isomnt) + builder.rebuild(kver=upd_kver) + + except Exception as e: + raise e + + finally: + # Clean up all eventual mounts + for mnt in reversed(mnts): + d = _functions.passthrough("umount %s" % mnt, logger.debug) + logger.debug("Returned: %s" % d) + if not _functions.system(e2label_cmd): logger.error("Unable to relabel " + candidate_dev + " to RootUpdate ") @@ -710,3 +753,5 @@ return True else: return False + +# vim: et sts=4 sw=4: -- To view, visit https://gerrit.ovirt.org/47614 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie893e722e24b1dd2e8e41970e16091d83c65dad8 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-node Gerrit-Branch: master Gerrit-Owner: Fabian Deutsch <[email protected]> _______________________________________________ node-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/node-patches
