From 4570e9adbefcde195c5aab5f831ea632977cac24 Mon Sep 17 00:00:00 2001 From: Mikhail Klementev Date: Fri, 7 Apr 2023 10:27:59 +0000 Subject: [PATCH] Handling discrepancies between /lib/modules and /boot --- kernel.go | 39 +++++++++++++++++++++++++++------------ kernel_linux.go | 29 ++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/kernel.go b/kernel.go index 93c1f56..26c6a22 100644 --- a/kernel.go +++ b/kernel.go @@ -513,32 +513,34 @@ func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (e return } -func genKernelPath(files []os.FileInfo, kname string) string { +func findKernelFile(files []os.FileInfo, kname string) (name string, err error) { for _, file := range files { if strings.HasPrefix(file.Name(), "vmlinuz") { if strings.Contains(file.Name(), kname) { - return file.Name() + name = file.Name() + return } } } - log.Fatal().Msgf("cannot find kernel %s", kname) - return "" + err = errors.New("cannot find kernel") + return } -func genInitrdPath(files []os.FileInfo, kname string) string { +func findInitrdFile(files []os.FileInfo, kname string) (name string, err error) { for _, file := range files { if strings.HasPrefix(file.Name(), "initrd") || strings.HasPrefix(file.Name(), "initramfs") { if strings.Contains(file.Name(), kname) { - return file.Name() + name = file.Name() + return } } } - log.Fatal().Msgf("cannot find initrd %s", kname) - return "" + err = errors.New("cannot find kernel") + return } func genRootfsImage(d containerImageInfo, download bool) (rootfs string, err error) { @@ -640,16 +642,29 @@ func listContainersKernels(dii containerImageInfo, newkcfg *config.KernelConfig, } for _, krel := range moddirs { + log.Debug().Msgf("generate config entry for %s", krel.Name()) + + var kernelFile, initrdFile string + kernelFile, err = findKernelFile(bootfiles, krel.Name()) + if err != nil { + log.Warn().Msgf("cannot find kernel %s", krel.Name()) + continue + } + + initrdFile, err = findInitrdFile(bootfiles, krel.Name()) + if err != nil { + log.Warn().Msgf("cannot find initrd %s", krel.Name()) + continue + } + ki := config.KernelInfo{ DistroType: dii.DistroType, DistroRelease: dii.DistroRelease, KernelRelease: krel.Name(), ContainerName: dii.Name, - KernelPath: c.Volumes.Boot + "/" + - genKernelPath(bootfiles, krel.Name()), - InitrdPath: c.Volumes.Boot + "/" + - genInitrdPath(bootfiles, krel.Name()), + KernelPath: c.Volumes.Boot + "/" + kernelFile, + InitrdPath: c.Volumes.Boot + "/" + initrdFile, ModulesPath: c.Volumes.LibModules + "/" + krel.Name(), RootFS: rootfs, diff --git a/kernel_linux.go b/kernel_linux.go index 5c72363..4309c86 100644 --- a/kernel_linux.go +++ b/kernel_linux.go @@ -37,7 +37,7 @@ func genHostKernels(download bool) (kcfg config.KernelConfig, err error) { } kernelsBase := "/boot/" - files, err := ioutil.ReadDir(kernelsBase) + bootfiles, err := ioutil.ReadDir(kernelsBase) if err != nil { return } @@ -55,20 +55,35 @@ func genHostKernels(download bool) (kcfg config.KernelConfig, err error) { return } - for _, k := range strings.Fields(string(rawOutput)) { + for _, krel := range strings.Fields(string(rawOutput)) { + log.Debug().Msgf("generate config entry for %s", krel) + + var kernelFile, initrdFile string + kernelFile, err = findKernelFile(bootfiles, krel) + if err != nil { + log.Warn().Msgf("cannot find kernel %s", krel) + continue + } + + initrdFile, err = findInitrdFile(bootfiles, krel) + if err != nil { + log.Warn().Msgf("cannot find initrd %s", krel) + continue + } + ki := config.KernelInfo{ DistroType: distroType, DistroRelease: si.OS.Version, - KernelRelease: k, + KernelRelease: krel, - KernelSource: "/lib/modules/" + k + "/build", + KernelSource: "/lib/modules/" + krel + "/build", - KernelPath: kernelsBase + genKernelPath(files, k), - InitrdPath: kernelsBase + genInitrdPath(files, k), + KernelPath: kernelsBase + kernelFile, + InitrdPath: kernelsBase + initrdFile, RootFS: rootfs, } - vmlinux := "/usr/lib/debug/boot/vmlinux-" + k + vmlinux := "/usr/lib/debug/boot/vmlinux-" + krel log.Print("vmlinux", vmlinux) if exists(vmlinux) { ki.VmlinuxPath = vmlinux