From 9a2e657c59bd2a905aedb6e166dfbb2d2d63b13d Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Fri, 11 Feb 2022 12:14:34 +0800 Subject: [PATCH] feat(baremetal): grub http boot initrd and kernel (#13414) --- pkg/baremetal/manager.go | 20 ++++++++++++++++---- pkg/baremetal/options/options.go | 2 +- pkg/baremetal/utils/grub/grub.go | 7 +++++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/pkg/baremetal/manager.go b/pkg/baremetal/manager.go index 70b1eea5be..7242771f99 100644 --- a/pkg/baremetal/manager.go +++ b/pkg/baremetal/manager.go @@ -1044,13 +1044,21 @@ func (b *SBaremetalInstance) GetNotifyUrl() string { return fmt.Sprintf("%s/baremetals/%s/notify", b.manager.Agent.GetListenUri(), b.GetId()) } -func (b *SBaremetalInstance) getTftpFileUrl(filename string) string { +func (b *SBaremetalInstance) getTftpEndpoint() (string, error) { serverIP, err := b.manager.Agent.GetDHCPServerIP() if err != nil { - log.Errorf("Get http file server: %v", err) + return "", errors.Wrap(err, "GetDHCPServerIP") + } + return fmt.Sprintf("%s:%d", serverIP, o.Options.Port+1000), nil +} + +func (b *SBaremetalInstance) getTftpFileUrl(filename string) string { + endpoint, err := b.getTftpEndpoint() + if err != nil { + log.Errorf("Get http file server endpoint: %v", err) return filename } - return fmt.Sprintf("http://%s:%d/tftp/%s", serverIP, o.Options.Port+1000, filename) + return fmt.Sprintf("http://%s/tftp/%s", endpoint, filename) } func (b *SBaremetalInstance) GetImageCacheUrl() string { @@ -1167,8 +1175,12 @@ func (b *SBaremetalInstance) getGrubPXEConf(isTftp bool) string { // TODO: support not tftp situation kernelArgs := b.getKernelArgs(isTftp, initrd) var resp string + endpoint, err := b.getTftpEndpoint() + if err != nil { + log.Fatalf("getTftpEndpoint %s", err) + } if b.NeedPXEBoot() { - resp = grub.GetYunionOSConfig(3, kernel, kernelArgs, initrd) + resp = grub.GetYunionOSConfig(3, endpoint, kernel, kernelArgs, initrd) } else { resp = grub.GetAutoFindConfig() b.ClearSSHConfig() diff --git a/pkg/baremetal/options/options.go b/pkg/baremetal/options/options.go index 93580dc67c..c5f2afec58 100644 --- a/pkg/baremetal/options/options.go +++ b/pkg/baremetal/options/options.go @@ -53,7 +53,7 @@ type BaremetalOptions struct { SendMetricsIntervalSeconds int `help:"interval to send baremetal metrics, default is 300 seconds" default:"300"` TftpFileMap map[string]string `help:"map of filename to real file path for tftp"` - BootLoader string `help:"PXE boot loader" default:"syslinux"` + BootLoader string `help:"PXE boot loader" default:"grub"` } const ( diff --git a/pkg/baremetal/utils/grub/grub.go b/pkg/baremetal/utils/grub/grub.go index 6001c46a3e..6c39b72856 100644 --- a/pkg/baremetal/utils/grub/grub.go +++ b/pkg/baremetal/utils/grub/grub.go @@ -16,9 +16,12 @@ package grub import "fmt" -func GetYunionOSConfig(sleepTime int, kernel string, kernelArgs string, initrd string) string { +func GetYunionOSConfig(sleepTime int, httpSite, kernel string, kernelArgs string, initrd string) string { + kernel = fmt.Sprintf("(http,${http_site})/tftp/%s", kernel) + initrd = fmt.Sprintf("(http,${http_site})/tftp/%s", initrd) return fmt.Sprintf(` set timeout=%d +set http_site=%s menuentry 'YunionOS for PXE' --class os { echo "Loading linux %s ..." linux %s %s @@ -26,7 +29,7 @@ menuentry 'YunionOS for PXE' --class os { echo "Loading initrd %s ..." initrd %s } -`, sleepTime, kernel, kernel, kernelArgs, initrd, initrd) +`, sleepTime, httpSite, kernel, kernel, kernelArgs, initrd, initrd) } // REF: https://github.com/bluebanquise/infrastructure/blob/master/packages/ipxe-bluebanquise/grub2-efi-autofind.cfg