From 65aaee1fca4b919138b050129012cd7bd4753604 Mon Sep 17 00:00:00 2001 From: david_yang Date: Wed, 4 Dec 2024 10:56:09 +0800 Subject: [PATCH] [installer] Use the Grub version comes from ONL OS The Grub in ONiE OS is always out of date. Reinstalling ONiE and ONL for upgrading Grub is quite complex and takes a lot of time. In ONL runtime, it can upgrade the Grub directly by performing grub-install command with appropriate arguments. This patch changes the ONL installer to include libraries come from ONL root filesystem for grub-install. A fresh installed ONL will have the Grub version from ONL OS immediately. Signed-off-by: david_yang --- builds/any/installer/grub/builds/Makefile | 7 +++++++ .../rootfs/buster/common/amd64-base-packages.yml | 1 + .../rootfs/jessie/common/amd64-base-packages.yml | 1 + .../stretch/common/amd64-base-packages.yml | 1 + .../src/python/onl/install/BaseInstall.py | 16 +++++++++++++++- .../src/python/onl/install/ConfUtils.py | 13 +++++++++++++ 6 files changed, 38 insertions(+), 1 deletion(-) diff --git a/builds/any/installer/grub/builds/Makefile b/builds/any/installer/grub/builds/Makefile index f714f8bd64..46d253c483 100644 --- a/builds/any/installer/grub/builds/Makefile +++ b/builds/any/installer/grub/builds/Makefile @@ -14,6 +14,12 @@ DEBIAN_VERSION_ID := $(shell echo $(VERSION_ID)) include $(ONL)/make/versions/version-onl.mk INSTALLER_NAME=$(FNAME_PRODUCT_VERSION)_ONL-OS$(DEBIAN_VERSION_ID)_$(FNAME_BUILD_ID)_$(UARCH)_$(BOOTMODE)_INSTALLER +ifeq ($(ARCH),amd64) +MKINSTALLER_OPTS_ARCH = \ + --add-dir $(ONL)/builds/$(ARCH)/rootfs/builds/$(ONL_DEBIAN_SUITE)/rootfs-$(ARCH).d/usr/lib/grub/i386-pc \ + --add-dir $(ONL)/builds/$(ARCH)/rootfs/builds/$(ONL_DEBIAN_SUITE)/rootfs-$(ARCH).d/usr/lib/grub/x86_64-efi +endif + MKINSTALLER_OPTS = \ --onl-version "$(VERSION_STRING)" \ --arch $(ARCH) \ @@ -25,6 +31,7 @@ MKINSTALLER_OPTS = \ --postinstall-script $(ONL)/builds/any/installer/sample-postinstall.sh \ --plugin $(ONL)/builds/any/installer/sample-preinstall.py \ --plugin $(ONL)/builds/any/installer/sample-postinstall.py \ + $(MKINSTALLER_OPTS_ARCH) \ # THIS LINE INTENTIONALLY LEFT BLANK WORK_DIR := $(ONL_DEBIAN_SUITE) diff --git a/builds/any/rootfs/buster/common/amd64-base-packages.yml b/builds/any/rootfs/buster/common/amd64-base-packages.yml index 19e080671c..1e7cfa1c8b 100644 --- a/builds/any/rootfs/buster/common/amd64-base-packages.yml +++ b/builds/any/rootfs/buster/common/amd64-base-packages.yml @@ -7,6 +7,7 @@ - parted - smartmontools - grub2 +- grub-efi-amd64-bin - onl-upgrade - onl-kernel-4.9-lts-x86-64-all-modules - onl-kernel-4.14-lts-x86-64-all-modules diff --git a/builds/any/rootfs/jessie/common/amd64-base-packages.yml b/builds/any/rootfs/jessie/common/amd64-base-packages.yml index 141e549b3e..222a57fb0f 100644 --- a/builds/any/rootfs/jessie/common/amd64-base-packages.yml +++ b/builds/any/rootfs/jessie/common/amd64-base-packages.yml @@ -7,6 +7,7 @@ - parted - smartmontools - grub2 +- grub-efi-amd64-bin - onl-upgrade - hw-management - sx-kernel diff --git a/builds/any/rootfs/stretch/common/amd64-base-packages.yml b/builds/any/rootfs/stretch/common/amd64-base-packages.yml index b679997994..24d0690a8f 100644 --- a/builds/any/rootfs/stretch/common/amd64-base-packages.yml +++ b/builds/any/rootfs/stretch/common/amd64-base-packages.yml @@ -7,6 +7,7 @@ - parted - smartmontools - grub2 +- grub-efi-amd64-bin - onl-upgrade - hw-management - onl-kernel-4.9-lts-x86-64-all-modules diff --git a/packages/base/all/vendor-config-onl/src/python/onl/install/BaseInstall.py b/packages/base/all/vendor-config-onl/src/python/onl/install/BaseInstall.py index 7416c20bd7..1462db716e 100755 --- a/packages/base/all/vendor-config-onl/src/python/onl/install/BaseInstall.py +++ b/packages/base/all/vendor-config-onl/src/python/onl/install/BaseInstall.py @@ -683,7 +683,7 @@ def installLoader(self): kernels = [] for f in set(os.listdir(self.im.installerConf.installer_dir) + self.zf.namelist()): - if 'kernel' in f: + if f.startswith('kernel'): kernels.append(f) initrd = None @@ -706,6 +706,20 @@ def _cp(b, dstname=None): [_cp(e) for e in kernels] _cp(initrd, "%s.cpio.gz" % self.im.installerConf.installer_platform) + d = None + if self.isUEFI: + d = 'x86_64-efi/' + else: + d = 'i386-pc/' + dirs = os.path.join(ctx.dir, 'onl-loader', 'grub', d) + if not os.path.isdir(dirs): + os.makedirs(dirs) + for f in self.zf.namelist(): + if f.startswith(d) and f != d: + dst = os.path.join(dirs, os.path.basename(f)) + if not os.path.exists(dst): + self.installerCopy(f, dst) + return 0 def installGrubCfg(self): diff --git a/packages/base/all/vendor-config-onl/src/python/onl/install/ConfUtils.py b/packages/base/all/vendor-config-onl/src/python/onl/install/ConfUtils.py index 5b3e1f518c..0bf75cbef9 100755 --- a/packages/base/all/vendor-config-onl/src/python/onl/install/ConfUtils.py +++ b/packages/base/all/vendor-config-onl/src/python/onl/install/ConfUtils.py @@ -205,6 +205,7 @@ def install(self, device): self.check_output((self.EFIBOOTMGR, '-b', uidx, '-B',)) grubOpts = [] + directory = None if self.isUEFI: grubOpts.append('--target=x86_64-efi') grubOpts.append('--no-nvram') @@ -213,14 +214,19 @@ def install(self, device): grubOpts.append('--bootloader-id=ONL') # All ONL-derived distros should be able to use # the same profile + directory = "--directory=%s/onl-loader/grub/x86_64-efi" + else: + directory = "--directory=%s/onl-loader/grub/i386-pc" def _install(): if self.bootDir is not None: + grubOpts.append(directory % self.bootDir) self.check_call([self.INSTALL, '--boot-directory=' + self.bootDir,] + grubOpts + [device,]) elif self.bootPart is not None: with self.mountCtx(self.bootPart) as ctx: + grubOpts.append(directory % ctx.dir) self.check_call([self.INSTALL, '--boot-directory=' + ctx.dir,] + grubOpts + [device,]) @@ -402,12 +408,16 @@ def install(self, device): cmds.append("%s -b %s -B || sts=$?" % (self.EFIBOOTMGR, bidx,)) grubOpts = [] + directory = None if self.isUEFI: grubOpts.append('--target=x86_64-efi') grubOpts.append('--no-nvram') grubOpts.append('--bootloader-id=ONL') grubOpts.append('--efi-directory=/boot/efi') grubOpts.append('--recheck') + directory = "--directory=%s/onl-loader/grub/x86_64-efi" + else: + directory = "--directory=%s/onl-loader/grub/i386-pc" cmds = [] @@ -424,17 +434,20 @@ def install(self, device): if self.bootDir and self.chroot: p = os.pat.join(self.installerConf.installer_chroot, self.bootDir.lstrip('/')) + grubOpts.append(directory % p) cmd = ([self.INSTALL, '--boot-directory=' + p,] + grubOpts + [device,]) cmds.append(" ".join(cmd) + " || sts=$?") elif self.bootDir: p = self.bootDir + grubOpts.append(directory % p) cmd = ([self.INSTALL, '--boot-directory=' + p,] + grubOpts + [device,]) cmds.append(" ".join(cmd) + " || sts=$?") elif self.bootPart: + grubOpts.append(directory % "$bootMpt") cmd = ([self.INSTALL, '--boot-directory=\"$bootMpt\"',] + grubOpts + [device,])