From fb9f269fc56296aa8375e90faea20403cc74f36c Mon Sep 17 00:00:00 2001 From: Jonathon Anderson Date: Wed, 12 Feb 2025 11:43:43 -0700 Subject: [PATCH] Update ipxe and grub configuration for clarity #1156 Also: - Defined a menu for iPXE - Support a IPXEMenuEntry tag to select the boot method - Merge iPXE dracut support into default.ipxe (use IPXEMenuEntry=dracut) Signed-off-by: Jonathon Anderson --- CHANGELOG.md | 6 + etc/grub/grub.cfg.ww | 210 +++++++++++++++++-------- etc/ipxe/default.ipxe | 213 +++++++++++++++----------- etc/ipxe/dracut.ipxe | 47 ------ internal/pkg/upgrade/node.go | 78 ++++++---- internal/pkg/upgrade/node_test.go | 23 +++ userdocs/contents/boot-management.rst | 21 +-- userdocs/contents/troubleshooting.rst | 4 +- 8 files changed, 358 insertions(+), 244 deletions(-) delete mode 100644 etc/ipxe/dracut.ipxe diff --git a/CHANGELOG.md b/CHANGELOG.md index 438cbe4f..b4efd2d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Added `WW_HISTFILE` to control shell history location during `wwctl image shell`. #1732 - Added target help in Makefile. #1740 - Added fstab mounts for `/home` and `/opt` to initial default profile. #1744 +- Add support for an `IPXEMenuEntry` tag to select the boot method during iPXE. ### Changed @@ -30,6 +31,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Update syncuser documentation. #1736 - Update PS1 during `wwctl image shell` to include working directory by default, and to include `PS1` from the environment if present. #1245 +- DHCP template generates as much of the subnet and range definition as possible. #1469 +- Updated overlay flags to `wwctl [--runtime-overlays|--system-overlays]`. #1495 +- Update ipxe and grub configuration for clarity and logging. #1156 +- Defined a menu for iPXE. #1156 ### Fixed @@ -48,6 +53,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Remove syncuser warning messages in `wwctl` that assume its use. #1321 - Remove syncuser from the list of default runtime overlays. #1322 - Removed check for "discoverable" profiles during `wwctl upgrade nodes`. +- Removed `dracut.ipxe` template. (Use `default.ipxe` and set tag `IPXEMenuEntry=dracut`.) ## v4.6.0rc2, 2025-02-07 diff --git a/etc/grub/grub.cfg.ww b/etc/grub/grub.cfg.ww index a0963266..c3ad0727 100644 --- a/etc/grub/grub.cfg.ww +++ b/etc/grub/grub.cfg.ww @@ -1,77 +1,170 @@ -{{ if .ImageName }} -echo "================================================================================" -echo "Warewulf v4 now http booting grub: {{.Fqdn}} ({{.Hwaddr}})" -echo "================================================================================" echo -echo "Warewulf Controller: {{.Ipaddr}}" +echo "Warewulf v4 (GRUB)" echo -sleep 1 +echo "Warewulf Server:" +echo "* Ipaddr: {{.Ipaddr}}" +echo "* Port: {{.Port}}" +echo +echo "This node:" +echo "* Fqdn: {{.Fqdn}}" +echo "* Hwaddr: {{.Hwaddr}}" +echo "* ImageName: {{.ImageName}}" +{{- if .KernelVersion }} +echo "* KernelVersion: {{.KernelVersion}}" +{{- else }} +echo "* KernelVersion: (image default)" +{{- end }} +echo "* KernelArgs: {{.KernelArgs}}" + +{{- if not .ImageName }} +echo "!!" +echo "!! No image defined for {{.Fqdn}}." +echo "!! Rebooting in 30s... +echo "!!" +sleep 30 +reboot +{{- end }} + +echo "Reading asset key..." smbios --type 3 --get-string 8 --set assetkey uri="(http,{{.Ipaddr}}:{{.Port}})/provision/${net_default_mac}?assetkey=${assetkey}" kernel="${uri}&stage=kernel" -image="${uri}&stage=image&compress=gz" -system="${uri}&stage=system&compress=gz" -runtime="${uri}&stage=runtime&compress=gz" -set default={{ or .Tags.GrubMenuEntry "ww4" }} -set timeout=5 +set default={{ or .Tags.GrubMenuEntry "single-stage" }} +set timeout=2 -menuentry "Network boot node: {{.Id}}" --id ww4 { - {{if .KernelVersion }} - echo "Kernel: {{.KernelVersion}}" - {{else}} - echo "Kernel: {{.ImageName}} (image default)" - {{end}} - echo "KernelArgs: {{.KernelArgs}}" +menuentry "Single-stage boot" --id single-stage { + echo "Warewulf Server:" + echo "* Ipaddr: {{.Ipaddr}}" + echo "* Port: {{.Port}}" + echo + echo "This node:" + echo "* Fqdn: {{.Fqdn}}" + echo "* Hwaddr: {{.Hwaddr}}" + echo "* ImageName: {{.ImageName}}" + {{- if .KernelVersion }} + echo "* KernelVersion: {{.KernelVersion}}" + {{- else }} + echo "* KernelVersion: (image default)" + {{- end }} + echo "* KernelArgs: {{.KernelArgs}}" + echo + echo "Downloading kernel image..." linux $kernel wwid=${net_default_mac} {{.KernelArgs}} - if [ x$? = x0 ] ; then - echo "Loading Image: {{.ImageName}}" - initrd $image $system $runtime - boot - else - echo "MESSAGE: This node seems to be unconfigured. Please have your system administrator add a" - echo " configuration for this node with HW address: ${net_default_mac}" - echo "" - echo "Rebooting in 1 minute..." - sleep 60 - reboot + if [ $? != 0 ] + then + echo "!!" + echo "!! Unable to load kernel." + echo "!! Rebooting in 15s..." + echo "!!" fi + + echo "Downloading images..." + image="${uri}&stage=image&compress=gz" + system="${uri}&stage=system&compress=gz" + runtime="${uri}&stage=runtime&compress=gz" + initrd $image $system $runtime + if [ $? != 0 ] + then + echo "!!" + echo "!! Unable to load images." + echo "!! Rebooting in 15s..." + echo "!!" + fi + + echo "Booting..." + boot } -menuentry "Network boot node with dracut: {{.Id}}" --id dracut { +menuentry "Single-stage boot (no compression)" --id single-stage-nocompress { + echo "Warewulf Server:" + echo "* Ipaddr: {{.Ipaddr}}" + echo "* Port: {{.Port}}" + echo + echo "This node:" + echo "* Fqdn: {{.Fqdn}}" + echo "* Hwaddr: {{.Hwaddr}}" + echo "* ImageName: {{.ImageName}}" + {{- if .KernelVersion }} + echo "* KernelVersion: {{.KernelVersion}}" + {{- else }} + echo "* KernelVersion: (image default)" + {{- end }} + echo "* KernelArgs: {{.KernelArgs}}" + echo + echo "Downloading kernel image..." + linux $kernel wwid=${net_default_mac} {{.KernelArgs}} + if [ $? != 0 ] + then + echo "!!" + echo "!! Unable to load kernel." + echo "!! Rebooting in 15s..." + echo "!!" + fi + + echo "Downloading images..." + image="${uri}&stage=image" + system="${uri}&stage=system" + runtime="${uri}&stage=runtime" + initrd $image $system $runtime + if [ $? != 0 ] + then + echo "!!" + echo "!! Unable to load images." + echo "!! Rebooting in 15s..." + echo "!!" + fi + + echo "Booting..." + boot +} + +menuentry "Two stage boot with dracut" --id dracut { + echo "Warewulf Server:" + echo "* Ipaddr: {{.Ipaddr}}" + echo "* Port: {{.Port}}" + echo + echo "This node:" + echo "* Fqdn: {{.Fqdn}}" + echo "* Hwaddr: {{.Hwaddr}}" + echo "* ImageName: {{.ImageName}}" + {{- if .KernelVersion }} + echo "* KernelVersion: {{.KernelVersion}}" + {{- else }} + echo "* KernelVersion: (image default)" + {{- end }} + echo "* KernelArgs: {{.KernelArgs}}" + initramfs="${uri}&stage=initramfs" wwinit_uri="http://{{.Ipaddr}}:{{.Port}}/provision/${net_default_mac}" - - {{if .KernelVersion }} - echo "Kernel: {{.KernelVersion}}" - {{else}} - echo "Kernel: {{.ImageName}} (image default)" - {{end}} - echo "KernelArgs: {{.KernelArgs}}" - net_args="rd.neednet=1 {{range $devname, $netdev := .NetDevs}}{{if and $netdev.Hwaddr $netdev.Device}} ifname={{$netdev.Device}}:{{$netdev.Hwaddr}} {{end}}{{end}}" wwinit_args="root=wwinit wwinit.uri=${wwinit_uri} init=/init" + + echo + echo "Downloading kernel image..." linux $kernel wwid=${net_default_mac} {{.KernelArgs}} $net_args $wwinit_args - - if [ x$? = x0 ] ; then - echo "Loading Image: {{.ImageName}}" - initrd $initramfs - boot - else - echo "MESSAGE: This node seems to be unconfigured. Please have your system administrator add a" - echo " configuration for this node with HW address: ${net_default_mac}" - echo "" - echo "Rebooting in 1 minute..." - sleep 60 - reboot + if [ $? != 0 ] + then + echo "!!" + echo "!! Unable to load kernel." + echo "!! Rebooting in 15s..." + echo "!!" fi -} -menuentry "Chainload specific configfile" { - conf="(http,{{.Ipaddr}}:{{.Port}})/efiboot/grub.cfg?assetkey=${assetkey}" - configfile $conf + echo "Downloading initramfs..." + initrd $initramfs + if [ $? != 0 ] + then + echo "!!" + echo "!! Unable to load initramfs." + echo "!! Rebooting in 15s..." + echo "!!" + fi + + echo "Booting..." + boot } menuentry "UEFI Firmware Settings" --id "uefi-firmware" { @@ -87,12 +180,3 @@ menuentry "System shutdown" { echo "System shutting down..." halt } -{{ else }} -echo "================================================================================" -echo " Warewulf v4:" -echo " No node image defined for this node ({{.Fqdn}})." -echo " Rebooting in 30s." -echo "================================================================================" -sleep 30 -reboot -{{ end }} diff --git a/etc/ipxe/default.ipxe b/etc/ipxe/default.ipxe index 9977e702..92909a4d 100644 --- a/etc/ipxe/default.ipxe +++ b/etc/ipxe/default.ipxe @@ -1,94 +1,129 @@ #!ipxe -{{ if .ImageName }} -echo -echo ================================================================================ -echo Warewulf v4 now booting: {{.Fqdn}} ({{.Hwaddr}}) -echo -echo Image: {{.ImageName}} -{{if .KernelVersion }} -echo Kernel: {{.KernelVersion}} -{{else}} -echo Kernel: {{.ImageName}} (image default) -{{end}} -echo KernelArgs: {{.KernelArgs}} +echo +echo Warewulf v4 (iPXE) echo +set next start +goto metadata -set uri_base http://{{.Ipaddr}}:{{.Port}}/provision/{{.Hwaddr}}?assetkey=${asset}&uuid=${uuid} -echo Warewulf Controller: {{.Ipaddr}} - -echo Downloading Kernel Image: -kernel --name kernel ${uri_base}&stage=kernel || goto reboot - -# imgextract causes RAM space problems on non-EFI systems (because of the 3GB barrier -# in 32-Bit mode). -# -> Use the old initrd method with a compressed image to save as much RAM as possible -# in this early boot stage. -# See for more details. -iseq ${platform} efi && goto efi || goto noefi - -:efi - -# try extracting compressed images first -# NOTE: system overlay tends to be the smallest, so failure here is the cheapest -echo Downloading Image: -imgextract --name image ${uri_base}&stage=image&compress=gz || goto nocompress - -echo Downloading System Overlay: -imgextract --name system ${uri_base}&stage=system&compress=gz || goto reboot - -echo Downloading Runtime Overlay: -imgextract --name runtime ${uri_base}&stage=runtime&compress=gz && set runtime_initrd initrd=runtime || echo Failed downloading runtime overlay. - -goto imoktogo - -:nocompress - -echo -echo Image extract not supported in this iPXE, using standard initrd mode - -echo Downloading Image: -initrd --name image ${uri_base}&stage=image || goto reboot - -echo Downloading System Overlay: -initrd --name system ${uri_base}&stage=system || goto reboot - -echo Downloading Runtime Overlay: -initrd --name runtime ${uri_base}&stage=runtime && set runtime_initrd initrd=runtime || echo Failed downloading runtime overlay. - -goto imoktogo - -:noefi - -echo -echo Use legacy initrd mode with compressed images - -echo Downloading Image: -initrd --name image ${uri_base}&stage=image&compress=gz || goto reboot - -echo Downloading System Overlay: -initrd --name system ${uri_base}&stage=system&compress=gz || goto reboot - -echo Downloading Runtime Overlay: -initrd --name runtime ${uri_base}&stage=runtime&compress=gz && set runtime_initrd initrd=runtime || echo Failed downloading runtime overlay. - - -:imoktogo - -echo boot kernel initrd=image initrd=system ${runtime_initrd} wwid={{.Hwaddr}} {{.KernelArgs}} -boot kernel initrd=image initrd=system ${runtime_initrd} wwid={{.Hwaddr}} {{.KernelArgs}} || goto reboot - -:reboot -echo -echo There was an error, rebooting in 15s... -echo -sleep 15 -reboot -{{ else }} -echo ================================================================================ -echo Warewulf v4: -echo No image defined for this node ({{.Fqdn}}). -echo Rebooting in 30s. -echo ================================================================================ +:start +{{- if not .ImageName }} +echo !! +echo !! No image defined for {{.Fqdn}}. +echo !! Rebooting in 30s... +echo !! sleep 30 reboot -{{ end }} +{{- end }} + +set baseuri http://{{.Ipaddr}}:{{.Port}}/provision/{{.Hwaddr}} +set uri ${baseuri}?assetkey=${asset}&uuid=${uuid} + +echo Downloading kernel image... +kernel --name kernel ${uri}&stage=kernel || goto reboot + +{{- if .Tags.IPXEMenuEntry }} +set method {{ .Tags.IPXEMenuEntry }} +{{- else }} +# https://github.com/warewulf/warewulf/issues/222 +iseq ${platform} efi && set method imgextract || set method initrd +{{- end }} + +:menu +menu Warewulf v4 image provisioning method +item imgextract Single-stage with imgextract +item initrd Single-stage with initrd +item initrd_nocompress Single stage with initrd (no compression) +item dracut Two stage with dracut +item shell iPXE shell +choose --default ${method} --timeout 2000 method && goto ${method} || goto menu + +:imgextract +set next imgextract_continue +goto metadata +:imgextract_continue +echo +echo Downloading compressed image with imgextract... +imgextract --name image ${uri}&stage=image&compress=gz || goto error_use_initrd +echo Downloading compressed system overlay image with imgextract... +imgextract --name system ${uri}&stage=system&compress=gz || goto error_reboot +echo Downloading compressed runtime overlay image with imgextract... +imgextract --name runtime ${uri}&stage=runtime&compress=gz && set runtime_initrd initrd=runtime || echo Unable to download runtime overlay. (ignored) +goto boot_single_stage + +:error_use_initrd +echo Encountered an error. Now using initrd. +goto initrd_continue + +:initrd +set next initrd_continue +goto metadata +:initrd_continue +echo +echo Downloading compressed image with initrd... +initrd --name image ${uri}&stage=image&compress=gz || goto error_reboot +echo Downloading compressed system overlay with initrd... +initrd --name system ${uri}&stage=system&compress=gz || goto error_reboot +echo Downloading compressed runtime overlay with initrd... +initrd --name runtime ${uri}&stage=runtime&compress=gz && set runtime_initrd initrd=runtime || echo Unable to download runtime overlay. (ignored) +goto boot_single_stage + +:initrd_nocompress +set next initrd_nocompress_continue +goto metadata +:initrd_nocompress_continue +echo +echo Downloading uncompressed image with initrd... +initrd --name image ${uri}&stage=image || goto error_reboot +echo Downloading uncompressed system overlay with initrd... +initrd --name system ${uri}&stage=system || goto error_reboot +echo Downloading uncompressed runtime overlay with initrd... +initrd --name runtime ${uri}&stage=runtime && set runtime_initrd initrd=runtime || echo Unable to download runtime overlay. (ignored) +goto boot_single_stage + +:dracut +set next dracut_continue +goto metadata +:dracut_continue +echo +echo Downloading dracut initramfs... +initrd --name initramfs ${uri}&stage=initramfs || goto error_reboot +set dracut_net rd.neednet=1 {{range $devname, $netdev := .NetDevs}}{{if and $netdev.Hwaddr $netdev.Device}} ifname={{$netdev.Device}}:{{$netdev.Hwaddr}} ip={{$netdev.Device}}:dhcp {{end}}{{end}} +set dracut_wwinit root=wwinit wwinit.uri=${baseuri} init=/init +goto boot_two_stage_dracut + +:boot_single_stage +echo Booting (single stage)... +boot kernel initrd=image initrd=system ${runtime_initrd} wwid={{.Hwaddr}} {{.KernelArgs}} || goto error_reboot + +:boot_two_stage_dracut +echo Booting dracut (first stage)... +boot kernel initrd=initramfs ${dracut_net} ${dracut_wwinit} wwid={{.Hwaddr}} {{.KernelArgs}} || error_reboot + +:error_reboot +echo !! +echo !! Encountered an error. +echo !! rebooting in 15s... +echo !! +sleep 15 +reboot + +:shell +shell +goto menu + +:metadata +echo Warewulf Server: +echo * Ipaddr: {{.Ipaddr}} +echo * Port: {{.Port}} +echo +echo This node: +echo * Fqdn: {{.Fqdn}} +echo * Hwaddr: {{.Hwaddr}} +echo * ImageName: {{.ImageName}} +{{- if .KernelVersion }} +echo * KernelVersion: {{.KernelVersion}} +{{- else }} +echo * KernelVersion: (image default) +{{- end }} +echo * KernelArgs: {{.KernelArgs}} +goto ${next} diff --git a/etc/ipxe/dracut.ipxe b/etc/ipxe/dracut.ipxe deleted file mode 100644 index e9814e0c..00000000 --- a/etc/ipxe/dracut.ipxe +++ /dev/null @@ -1,47 +0,0 @@ -#!ipxe -{{ if .ImageName }} -echo -echo ================================================================================ -echo Warewulf v4 now booting via dracut: {{.Fqdn}} ({{.Hwaddr}}) -echo -echo Image: {{.ImageName}} -{{if .KernelVersion }} -echo Kernel: {{.KernelVersion}} -{{else}} -echo Kernel: {{.ImageName}} (image default) -{{end}} -echo KernelArgs: {{.KernelArgs}} -echo - -set baseuri http://{{.Ipaddr}}:{{.Port}}/provision/{{.Hwaddr}} -set uri ${baseuri}?assetkey=${asset}&uuid=${uuid} -echo Warewulf Controller: {{.Ipaddr}} - -echo Downloading Kernel Image: -kernel --name kernel ${uri}&stage=kernel || goto reboot - -echo Downloading initramfs -initrd --name initramfs ${uri}&stage=initramfs || goto reboot - -set dracut_net rd.neednet=1 {{range $devname, $netdev := .NetDevs}}{{if and $netdev.Hwaddr $netdev.Device}} ifname={{$netdev.Device}}:{{$netdev.Hwaddr}} ip={{$netdev.Device}}:dhcp {{end}}{{end}} -set dracut_wwinit root=wwinit wwinit.uri=${baseuri} init=/init - -echo Booting initramfs -boot kernel initrd=initramfs ${dracut_net} ${dracut_wwinit} wwid={{.Hwaddr}} {{.KernelArgs}} - - -:reboot -echo -echo There was an error, rebooting in 15s... -echo -sleep 15 -reboot -{{ else }} -echo ================================================================================ -echo Warewulf v4: -echo No image defined for this node ({{.Fqdn}}). -echo Rebooting in 30s. -echo ================================================================================ -sleep 30 -reboot -{{ end }} diff --git a/internal/pkg/upgrade/node.go b/internal/pkg/upgrade/node.go index 0fb1522f..d6c44765 100644 --- a/internal/pkg/upgrade/node.go +++ b/internal/pkg/upgrade/node.go @@ -226,7 +226,31 @@ func (legacy *Node) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *n if upgraded.Ipmi.Write == "" && legacy.IpmiWrite != "" { warnError(upgraded.Ipmi.Write.Set(legacy.IpmiWrite)) } - upgraded.Ipxe = legacy.Ipxe + if legacy.Keys != nil { + for key, value := range legacy.Keys { + upgraded.Tags[key] = value + } + } + if legacy.Tags != nil { + for key, value := range legacy.Tags { + upgraded.Tags[key] = value + } + } + for _, tag := range legacy.TagsDel { + delete(upgraded.Tags, tag) + } + if legacy.Ipxe == "dracut" { + if _, ok := upgraded.Tags["IPXEMenuEntry"]; !ok { + wwlog.Info("Replacing ipxe template 'dracut' with 'default' and setting tag 'IPXEMenuEntry=dracut'") + upgraded.Ipxe = "default" + upgraded.Tags["IPXEMenuEntry"] = "dracut" + } else { + wwlog.Warn("Found ipxe template 'dracut' but tag 'IPXEMenuEntry' is already set; ignoring") + upgraded.Ipxe = legacy.Ipxe + } + } else { + upgraded.Ipxe = legacy.Ipxe + } if legacy.Kernel != nil { upgraded.Kernel = legacy.Kernel.Upgrade(upgraded.ImageName) } else { @@ -237,11 +261,6 @@ func (legacy *Node) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *n } upgraded.Kernel = inlineKernel.Upgrade(upgraded.ImageName) } - if legacy.Keys != nil { - for key, value := range legacy.Keys { - upgraded.Tags[key] = value - } - } if legacy.NetDevs != nil { for name, netDev := range legacy.NetDevs { upgraded.NetDevs[name] = netDev.Upgrade(false) @@ -313,14 +332,6 @@ func (legacy *Node) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *n genericSplitOverlays) } } - if legacy.Tags != nil { - for key, value := range legacy.Tags { - upgraded.Tags[key] = value - } - } - for _, tag := range legacy.TagsDel { - delete(upgraded.Tags, tag) - } return } @@ -427,7 +438,31 @@ func (legacy *Profile) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded if upgraded.Ipmi.Write == "" && legacy.IpmiWrite != "" { warnError(upgraded.Ipmi.Write.Set(legacy.IpmiWrite)) } - upgraded.Ipxe = legacy.Ipxe + if legacy.Keys != nil { + for key, value := range legacy.Keys { + upgraded.Tags[key] = value + } + } + if legacy.Tags != nil { + for key, value := range legacy.Tags { + upgraded.Tags[key] = value + } + } + for _, tag := range legacy.TagsDel { + delete(upgraded.Tags, tag) + } + if legacy.Ipxe == "dracut" { + if _, ok := upgraded.Tags["IPXEMenuEntry"]; !ok { + wwlog.Info("Replacing ipxe template 'dracut' with 'default' and setting tag 'IPXEMenuEntry=dracut'") + upgraded.Ipxe = "default" + upgraded.Tags["IPXEMenuEntry"] = "dracut" + } else { + wwlog.Warn("Found ipxe template 'dracut' but tag 'IPXEMenuEntry' is already set; ignoring") + upgraded.Ipxe = legacy.Ipxe + } + } else { + upgraded.Ipxe = legacy.Ipxe + } if legacy.Kernel != nil { upgraded.Kernel = legacy.Kernel.Upgrade(upgraded.ImageName) } else { @@ -438,11 +473,6 @@ func (legacy *Profile) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded } upgraded.Kernel = inlineKernel.Upgrade(upgraded.ImageName) } - if legacy.Keys != nil { - for key, value := range legacy.Keys { - upgraded.Tags[key] = value - } - } if legacy.NetDevs != nil { for name, netDev := range legacy.NetDevs { upgraded.NetDevs[name] = netDev.Upgrade(addDefaults) @@ -503,14 +533,6 @@ func (legacy *Profile) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded genericSplitOverlays) } } - if legacy.Tags != nil { - for key, value := range legacy.Tags { - upgraded.Tags[key] = value - } - } - for _, tag := range legacy.TagsDel { - delete(upgraded.Tags, tag) - } if legacy.Resources != nil { for key, value := range legacy.Resources { upgraded.Resources[key] = value diff --git a/internal/pkg/upgrade/node_test.go b/internal/pkg/upgrade/node_test.go index 7cb32a2a..083a277d 100644 --- a/internal/pkg/upgrade/node_test.go +++ b/internal/pkg/upgrade/node_test.go @@ -852,6 +852,29 @@ nfs: mount: true - path: /var mount: false +`, + }, + { + name: "Replace dracut template with IPXEMenuEntry", + legacyYaml: ` +nodeprofiles: + default: + ipxe template: dracut +nodes: + n1: + ipxe template: dracut +`, + upgradedYaml: ` +nodeprofiles: + default: + ipxe template: default + tags: + IPXEMenuEntry: dracut +nodes: + n1: + ipxe template: default + tags: + IPXEMenuEntry: dracut `, }, } diff --git a/userdocs/contents/boot-management.rst b/userdocs/contents/boot-management.rst index f246298c..263b6b46 100644 --- a/userdocs/contents/boot-management.rst +++ b/userdocs/contents/boot-management.rst @@ -332,24 +332,22 @@ initramfs inside the image. necessary to remove ``/etc/machine-id`` for dracut to properly generate the initramfs in the location that Warewulf is expecting. -Set the node's iPXE template to ``dracut`` to direct iPXE to fetch the -node's initramfs image and boot with dracut semantics, rather than -booting the node image directly. +To direct iPXE to fetch the node's initramfs image and boot with dracut +semantics, set an ``IPXEMenuEntry`` tag for the node. .. note:: - Warewulf iPXE templates are located at ``/etc/warewulf/ipxe/`` when - Warewulf is installed via official packages. You can learn more - about how dracut booting works by inspecting its iPXE template at - ``/etc/warewulf/ipxe/dracut.ipxe``. + Warewulf configures iPXE with a template located at + ``/etc/warewulf/ipxe/default.ipxe``. Inspect the template to learn more about + the dracut booting process. .. code-block:: shell - wwctl node set wwnode1 --ipxe dracut + wwctl node set wwnode1 --tagadd IPXEMenuEntry=dracut .. note:: - The iPXE template may be set at the node or profile level. + The IPXEMenuEntry variable may be set at the node or profile level. Alternatively, to direct GRUB to fetch the node's initramfs image and boot with dracut semantics, set a ``GrubMenuEntry`` tag for the node. @@ -379,8 +377,3 @@ to use up to 50% of physical memory. This size limit may be adjustd using the kernel argument `wwinit.tmpfs.size`. (This parameter is passed to the `size` option during tmpfs mount. See ``tmpfs(5)`` for more details.) - -.. warning:: - - Kernel overrides are not currently fully supported during dracut initramfs boot. - diff --git a/userdocs/contents/troubleshooting.rst b/userdocs/contents/troubleshooting.rst index a74b57cd..cc9e3345 100644 --- a/userdocs/contents/troubleshooting.rst +++ b/userdocs/contents/troubleshooting.rst @@ -23,12 +23,10 @@ iPXE If you're using iPXE to boot (the default), you can get a command prompt by pressing with C-b during boot. -From the iPXE command prompt, you can run the same commands from `default.ipxe`_ (or `dracut.ipxe`_) to troubleshoot potential boot problems. +From the iPXE command prompt, you can run the same commands from `default.ipxe`_ to troubleshoot potential boot problems. .. _default.ipxe: https://github.com/warewulf/warewulf/blob/main/etc/ipxe/default.ipxe -.. _dracut.ipxe: https://github.com/warewulf/warewulf/blob/main/etc/ipxe/dracut.ipxe - For example, the following commands perform a (relatively) normal Warewulf boot. (Substitute your Warewulf server's IP address in place of 10.0.0.1, update the port number if you have changed it from the default of 9873,