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 <janderson@ciq.com>
This commit is contained in:
@@ -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 <node|profile> <add|set> [--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
|
||||
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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 <https://github.com/warewulf/warewulf/issues/222> 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}
|
||||
|
||||
@@ -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 }}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
`,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user