[PATCH] Handle the case of rpmostreepayload + GRUB2

Radek Vykydal rvykydal at redhat.com
Thu Oct 16 12:55:09 UTC 2014


Looks OK to me, I don't see anything that would break
things. I would rename the physboot though.

On 10/16/2014 04:23 AM, Colin Walters wrote:
> Note: I didn't actually test this on rawhide, I wrote it on master and
> backported
> it to rhel7-branch and tested there due to not having a rawhide dev env
> handy.
> If someone does, testing it will be a pain as you'll also need the newer
> rpm-ostree patch, and to compose a new tree with it and the ostree
> patch, etc.
>
>  From cc8aaa04f9e78916efd4b0cc2dae5507e176f591 Mon Sep 17 00:00:00 2001
> From: Colin Walters <walters at verbum.org>
> Date: Mon, 13 Oct 2014 21:01:23 -0400
> Subject: [PATCH] Handle the case of rpmostreepayload + GRUB2
>
> NOTE: Incompatible change for trees constructed prior to
> NOTE: https://github.com/projectatomic/rpm-ostree/pull/35
>
> For rpmostreepayload (in contrast to yum mainline) is that Anaconda
> lays down the bootloader data and computes the kernel arguments, but
> ostree takes care of writing the configuration file (as it does on
> upgrades as well).
>
> However, the handling of /boot in OSTree was a bit broken, and trying
> to support GRUB2 forced this change, because we need to ultimately
> execute grub2-mkconfig in the chroot and we need both the *real* /boot
> as well as the new /usr/lib/ostree-boot.
>
> We switch to keeping /boot in the target root, and call ostree from
> there.  This should still work for extlinux because we're just
> rewriting a config file.
>
> For moving the GRUB2 config file, see a similar change for
> rpmostreepayload+extlinux in commit:
> 627486c22cdaf6c07009026791f5bd6fc1aaadaa
>
> Note: This commit is only useful on BIOS systems as of yet.
> ---
>   pyanaconda/bootloader.py                 |  9 +++++----
>   pyanaconda/install.py                    | 17 -----------------
>   pyanaconda/packaging/rpmostreepayload.py | 22 ++++++++++++++++++----
>   3 files changed, 23 insertions(+), 25 deletions(-)
>
> diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
> index b021067..8cdbd2f 100644
> --- a/pyanaconda/bootloader.py
> +++ b/pyanaconda/bootloader.py
> @@ -1547,10 +1547,11 @@ class GRUB2(GRUB):
>               log.error("boot loader password setup failed: %s", e)
>   
>           # make sure the default entry is the OS we are installing
> -        entry_title = "0"
> -        rc = iutil.execInSysroot("grub2-set-default", [entry_title])
> -        if rc:
> -            log.error("failed to set default menu entry to %s",
> productName)
> +        if self.default is not None:
> +            entry_title = "0"
> +            rc = iutil.execInSysroot("grub2-set-default",
> [entry_title])
> +            if rc:
> +                log.error("failed to set default menu entry to %s",
> productName)
>   
>           # now tell grub2 to generate the main configuration file
>           rc = iutil.execInSysroot("grub2-mkconfig",
> diff --git a/pyanaconda/install.py b/pyanaconda/install.py
> index 40ead97..94f4663 100644
> --- a/pyanaconda/install.py
> +++ b/pyanaconda/install.py
> @@ -118,20 +118,6 @@ def doConfiguration(storage, payload, ksdata,
> instClass):
>   
>       progress_complete()
>   
> -def moveBootMntToPhysical(storage):
> -    """Move the /boot mount to /mnt/sysimage/boot."""
> -    if iutil.getSysroot() == iutil.getTargetPhysicalRoot():
> -        return
> -
> -    mounts = [storage.mountpoints.get("/boot/efi"),
> storage.mountpoints.get("/boot")]
> -    for mnt in mounts:
> -        if mnt is None:
> -            return
> -
> -        mnt.format.teardown()
> -        mnt.teardown()
> -        mnt.format.setup(options=mnt.format.options,
> chroot=iutil.getTargetPhysicalRoot())
> -
>   def doInstall(storage, payload, ksdata, instClass):
>       """Perform an installation.  This method takes the ksdata as
>       prepared by
>          the UI (the first hub, in graphical mode) and applies it to the
>          disk.
> @@ -266,9 +252,6 @@ def doInstall(storage, payload, ksdata, instClass):
>               writeBootLoader(storage, payload, instClass, ksdata)
>   
>       with progress_report(_("Performing post-installation setup
>       tasks")):
> -        # Now, let's reset the state here so that the payload has
> -        # /boot in the system root.
> -        moveBootMntToPhysical(storage)
>           payload.postInstall()
>   
>       progress_complete()
> diff --git a/pyanaconda/packaging/rpmostreepayload.py
> b/pyanaconda/packaging/rpmostreepayload.py
> index 70a4903..8d3ff42 100644
> --- a/pyanaconda/packaging/rpmostreepayload.py
> +++ b/pyanaconda/packaging/rpmostreepayload.py
> @@ -219,7 +219,8 @@ class RPMOSTreePayload(ArchivePayload):
>       def postInstall(self):
>           super(RPMOSTreePayload, self).postInstall()
>   
> -        physboot = iutil.getTargetPhysicalRoot() + '/boot'
> +        # not actually "phys" anymore, not changed to avoid diff spam
> +        physboot = iutil.getSysroot() + '/boot'
>   
>           # If we're using extlinux, rename extlinux.conf to
>           # syslinux.cfg, since that's what OSTree knows about.
> @@ -240,11 +241,24 @@ class RPMOSTreePayload(ArchivePayload):
>               # And *also* tell syslinux that the config is really in
>               /boot/loader
>               os.symlink('loader/syslinux.cfg', physboot +
>               '/syslinux.cfg')
>   
> +        # And if we're using GRUB2, move its config file, also with a
> +        # compatibility symlink.
> +        physboot_grub2 = physboot + '/grub2'
> +        if os.path.isdir(physboot_grub2):
> +            physboot_loader = physboot + '/loader'
> +            assert os.path.isdir(physboot_loader)
> +            orig_grub_cfg = physboot_grub2 + '/grub.cfg'
> +            target_grub_cfg = physboot_loader + '/grub.cfg'
> +            log.info("Moving %s -> %s", orig_grub_cfg, target_grub_cfg)
> +            os.rename(orig_grub_cfg, target_grub_cfg)
> +            os.symlink('../loader/grub.cfg', orig_grub_cfg)
> +
>           # OSTree owns the bootloader configuration, so here we give it
>           # the argument list we computed from storage, architecture and
>           # such.
> -        set_kargs_args = ["admin", "--sysroot=" +
> iutil.getTargetPhysicalRoot(),
> -                          "instutil", "set-kargs"]
> +        set_kargs_args = ["admin", "instutil", "set-kargs"]
>           set_kargs_args.extend(self.storage.bootloader.boot_args)
>           set_kargs_args.append("root=" +
>           self.storage.rootDevice.fstabSpec)
> -        self._safeExecWithRedirect("ostree", set_kargs_args)
> +        # Here we run ostree from the target system, because the
> bootloader
> +        # code for GRUB2 needs to run grub2-mkconfig.
> +        self._safeExecWithRedirect("ostree", set_kargs_args,
> root=iutil.getSysroot())



More information about the anaconda-patches mailing list