Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions live/config-cdroot/fix_bootconfig.aarch64
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ fi
if [ -n "\${iso_path}" ]; then
isoboot="iso-scan/filename=\${iso_path}"
fi
set timeout=10
set timeout=60
set timeout_style=menu
if [ "\${grub_platform}" = "efi" ]; then
echo "Please press 't' to show the boot menu on this console"
Expand Down Expand Up @@ -76,9 +76,6 @@ if [ -f (\$root)/boot/grub2/themes/$theme/theme.txt ];then
fi
terminal_input console
terminal_output gfxterm
menuentry "Boot from Hard Disk" --class opensuse --class gnu-linux --class gnu --class os {
exit
}
menuentry "Install $label" --class os --unrestricted {
set gfxpayload=keep
echo Loading kernel...
Expand Down
31 changes: 11 additions & 20 deletions live/config-cdroot/fix_bootconfig.ppc64le
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@
# │   │   └── powerpc-ieee1275
# │   │   └── *.mod
# │   └── ppc64le
# │   ├── initrd
# │   └── linux
# │ └── loader
# │ ├── initrd
# │ └── linux
# └── ppc
# └── bootinfo.txt
#
Expand Down Expand Up @@ -63,17 +64,11 @@ test -f $dst/.profile && . $dst/.profile
# files. It also moves kernel and initrd to the usual location (in boot/s390x).
#

boot_dir=$dst/boot/ppc64le
boot_dir=$dst/boot/ppc64le/loader
grub_dir=$dst/boot/grub2

mkdir -p $boot_dir $grub_dir $dst/ppc

# if files are in a 'loader' subdir, move them out
if [ -d $boot_dir/loader ] ; then
mv $boot_dir/loader/{initrd,linux} $boot_dir
rm -r $boot_dir/loader
fi

chmod 644 $boot_dir/{initrd,linux}

arch=`uname -m`
Expand All @@ -87,37 +82,33 @@ cat >$dst/boot/grub2/grub.cfg <<XXX

gfxmode=auto

set default="Boot from Hard Disk"
set default=0

insmod gettext

if sleep --interruptible 0 ; then
timeout=60
fi

menuentry "Boot from Hard Disk" --class opensuse --class gnu-linux --class gnu --class os {
exit
}

menuentry "Install $label" --class os --unrestricted {
echo 'Loading kernel...'
linux /boot/ppc64le/linux splash=silent
linux /boot/ppc64le/loader/linux splash=silent
echo 'Loading initrd...'
initrd /boot/ppc64le/initrd
initrd /boot/ppc64le/loader/initrd
}

menuentry "Check Installation Medium" --class os --unrestricted {
echo 'Loading kernel...'
linux /boot/ppc64le/linux mediacheck=1 plymouth.enable=0
linux /boot/ppc64le/loader/linux mediacheck=1 plymouth.enable=0
echo 'Loading initrd...'
initrd /boot/ppc64le/initrd
initrd /boot/ppc64le/loader/initrd
}

menuentry "Rescue System" --class os --unrestricted {
echo 'Loading kernel...'
linux /boot/ppc64le/linux $RESCUE_SYSTEM_BOOT_SETTINGS
linux /boot/ppc64le/loader/linux $RESCUE_SYSTEM_BOOT_SETTINGS
echo 'Loading initrd...'
initrd /boot/ppc64le/initrd
initrd /boot/ppc64le/loader/initrd
}
XXX

Expand Down
47 changes: 21 additions & 26 deletions live/config-cdroot/fix_bootconfig.s390x
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,16 @@
# │   └── squashfs.img
# ├── boot
# │   └── s390x
# │   ├── cd.ikr
# │   ├── initrd
# │   ├── initrd.off
# │   ├── initrd.siz
# │   ├── linux
# │   ├── parmfile
# │   ├── parmfile.hmc
# │   ├── sles.exec
# │   └── suse.ins
# │ └── loader
# │   ├── cd.ikr
# │   ├── initrd
# │   ├── initrd.off
# │   ├── initrd.siz
# │   ├── linux
# │   ├── parmfile
# │   ├── parmfile.hmc
# │   ├── sles.exec
# │   └── suse.ins
# ├── suse.ins
# └── susehmc.ins
#
Expand All @@ -61,15 +62,9 @@ fi
# files. It also moves kernel and initrd to the usual location (in boot/s390x).
#

boot_dir=$dst/boot/s390x
boot_dir=$dst/boot/s390x/loader
grub_dir=$dst/boot/grub2

# if files are in a 'loader' subdir, move them out
if [ -d $boot_dir/loader ] ; then
mv $boot_dir/loader/{initrd,linux} $boot_dir
rm -r $boot_dir/loader
fi

# Create parmfile.
#
# These parameters are taken from a sampel isolinux.cfg; the required parameters will
Expand Down Expand Up @@ -118,21 +113,21 @@ XXX
# A suse.ins copy at media root dir - note the different paths.
cat >$dst/suse.ins <<XXX
* SUSE Linux for IBM z Systems Installation System
boot/s390x/linux 0x00000000
boot/s390x/initrd.off $initrd_ofs_ofs
boot/s390x/initrd.siz $initrd_siz_ofs
boot/s390x/initrd $initrd_ofs
boot/s390x/parmfile $parmfile_ofs
boot/s390x/loader/linux 0x00000000
boot/s390x/loader/initrd.off $initrd_ofs_ofs
boot/s390x/loader/initrd.siz $initrd_siz_ofs
boot/s390x/loader/initrd $initrd_ofs
boot/s390x/loader/parmfile $parmfile_ofs
XXX

# Another suse.ins copy at media root dir - note the different paths and the hmc stuff.
cat >$dst/susehmc.ins <<XXX
* SUSE Linux for IBM z Systems Installation System via HMC
boot/s390x/linux 0x00000000
boot/s390x/initrd.off $initrd_ofs_ofs
boot/s390x/initrd.siz $initrd_siz_ofs
boot/s390x/initrd $initrd_ofs
boot/s390x/parmfile.hmc $parmfile_ofs
boot/s390x/loader/linux 0x00000000
boot/s390x/loader/initrd.off $initrd_ofs_ofs
boot/s390x/loader/initrd.siz $initrd_siz_ofs
boot/s390x/loader/initrd $initrd_ofs
boot/s390x/loader/parmfile.hmc $parmfile_ofs
XXX
echo "$parmfile_content console=ttyS1" >$boot_dir/parmfile.hmc

Expand Down
18 changes: 6 additions & 12 deletions live/config-cdroot/fix_bootconfig.x86_64
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ fi
if [ -n "\${iso_path}" ]; then
isoboot="iso-scan/filename=\${iso_path}"
fi
set timeout=10
set timeout=60
set timeout_style=menu
if [ "\${grub_platform}" = "efi" ]; then
echo "Please press 't' to show the boot menu on this console"
Expand Down Expand Up @@ -76,17 +76,11 @@ if [ -f (\$root)/boot/grub2/themes/$theme/theme.txt ];then
fi
terminal_input console
terminal_output gfxterm
menuentry "Boot from Hard Disk" --class opensuse --class gnu-linux --class gnu --class os {
if search --no-floppy --file /efi/boot/fallback.efi --set ; then
for os in opensuse sles leap suse; do
if [ -f /efi/\$os/grub.efi ] ; then
chainloader /efi/\$os/grub.efi
boot
fi
done
fi
exit
}
if [ "\${grub_platform}" != "efi" ]; then
menuentry "Boot from Hard Disk" --class opensuse --class gnu-linux --class gnu --class os {
exit
}
fi
menuentry "Install $label" --class os --unrestricted {
set gfxpayload=keep
echo Loading kernel...
Expand Down
8 changes: 8 additions & 0 deletions live/src/agama-installer.changes
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
-------------------------------------------------------------------
Wed Feb 18 20:32:37 UTC 2026 - Josef Reidinger <jreidinger@suse.com>

- Increase medium timeout to 60 seconds (jsc#PED-14986)
- Unify kernel and initramfs location (jsc#PED-14303)
- Drop “Boot from Disk” on all archs except legacy x86_64
(jsc#PED-13766)

-------------------------------------------------------------------
Thu Feb 12 14:57:21 UTC 2026 - Ladislav Slezák <lslezak@suse.com>

Expand Down
4 changes: 4 additions & 0 deletions rust/agama-lib/share/profile.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@
"extraKernelParams": {
"title": "Specify additional kernel parameters that are added beside ones added by the installer.",
"type": "string"
},
"updateNvram": {
"title": "Specify if bootloader should update persistent RAM (NVRAM).",
"type": "boolean"
}
},
"oneOf": [
Expand Down
9 changes: 8 additions & 1 deletion rust/agama-utils/src/api/bootloader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,31 @@
use merge::Merge;
use serde::{Deserialize, Serialize};

/// Represents a Bootloader
/// Bootloader configuration.
#[derive(Clone, Debug, Serialize, Deserialize, Default, Merge, utoipa::ToSchema)]
#[serde(rename_all = "camelCase")]
#[merge(strategy = merge::option::overwrite_none)]
pub struct Config {
/// Whether bootloader should stop on boot menu.
#[serde(skip_serializing_if = "Option::is_none")]
pub stop_on_boot_menu: Option<bool>,
/// Bootloader timeout.
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<u32>,
/// Bootloader extra kernel parameters.
#[serde(skip_serializing_if = "Option::is_none")]
pub extra_kernel_params: Option<String>,
/// Whether bootloader should update persistent RAM.
#[serde(skip_serializing_if = "Option::is_none")]
pub update_nvram: Option<bool>,
}

impl Config {
pub fn to_option(self) -> Option<Self> {
if self.stop_on_boot_menu.is_none()
&& self.timeout.is_none()
&& self.extra_kernel_params.is_none()
&& self.update_nvram.is_none()
{
None
} else {
Expand Down
5 changes: 5 additions & 0 deletions rust/package/agama.changes
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
-------------------------------------------------------------------
Wed Feb 18 20:32:00 UTC 2026 - Josef Reidinger <jreidinger@suse.com>

- Add support for bootloader config updateNvram (jsc#PED-14224)

-------------------------------------------------------------------
Wed Feb 18 12:09:15 UTC 2026 - Stefan Hundhammer <shundhammer@suse.com>

Expand Down
1 change: 1 addition & 0 deletions service/lib/agama/autoyast/bootloader_reader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ def read
end

bootloader["extraKernelParams"] = global["append"] unless global["append"].to_s.empty?
bootloader["updateNvram"] = global["update_nvram"] unless global["update_nvram"].to_s.empty?

{ "bootloader" => bootloader }
end
Expand Down
52 changes: 33 additions & 19 deletions service/lib/agama/storage/bootloader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ module Storage
class Bootloader
# Represents bootloader settings
class Config
# Whether bootloader should update persistent RAM.
# If kept as nil then default will be used.
#
# @return [Boolean]
attr_accessor :update_nvram

# Whether bootloader should stop on boot menu.
#
# @return [Boolean]
Expand Down Expand Up @@ -68,6 +74,7 @@ def initialize
@keys_to_export = []
@stop_on_boot_menu = false # false means use proposal, which has timeout
@timeout = 10 # just some reasonable timeout, we do not send it anywhere
@update_nvram = nil
@extra_kernel_params = ""
end

Expand All @@ -80,6 +87,7 @@ def to_json(*_args)
# our json use camel case
result[:stopOnBootMenu] = stop_on_boot_menu if keys_to_export.include?(:stop_on_boot_menu)
result[:timeout] = timeout if keys_to_export.include?(:timeout)
result[:updateNvram] = update_nvram if keys_to_export.include?(:update_nvram)
if keys_to_export.include?(:extra_kernel_params)
result[:extraKernelParams] =
@extra_kernel_params
Expand All @@ -94,30 +102,25 @@ def to_json(*_args)
# @return [Config] self
def load_json(serialized_config)
hsh = JSON.parse(serialized_config, symbolize_names: true)
if hsh.include?(:timeout)
self.timeout = hsh[:timeout]
keys_to_export.delete(:stop_on_boot_menu)
keys_to_export.push(:timeout) unless keys_to_export.include?(:timeout)

end
if hsh.include?(:stopOnBootMenu)
self.stop_on_boot_menu = hsh[:stopOnBootMenu]
keys_to_export.delete(:timeout)
unless keys_to_export.include?(:stop_on_boot_menu)
keys_to_export.push(:stop_on_boot_menu)
end
end
if hsh.include?(:extraKernelParams)
self.extra_kernel_params = hsh[:extraKernelParams]
unless keys_to_export.include?(:extra_kernel_params)
keys_to_export.push(:extra_kernel_params)
end
end
update_attribute(hsh, :timeout, :timeout, conflicts: :stop_on_boot_menu)
update_attribute(hsh, :stopOnBootMenu, :stop_on_boot_menu, conflicts: :timeout)
update_attribute(hsh, :extraKernelParams, :extra_kernel_params)
update_attribute(hsh, :updateNvram, :update_nvram)

self.scoped_kernel_params = hsh[:kernelArgs]

self
end

private

def update_attribute(hsh, json_key, attr_key, conflicts: nil)
return unless hsh.key?(json_key)

public_send("#{attr_key}=", hsh[json_key])
keys_to_export.delete(conflicts) if conflicts
keys_to_export.push(attr_key) unless keys_to_export.include?(attr_key)
end
end

# @return [Config]
Expand Down Expand Up @@ -178,6 +181,7 @@ def write_config
bootloader = ::Bootloader::BootloaderFactory.current
write_stop_on_boot(bootloader) if @config.keys_to_export.include?(:stop_on_boot_menu)
write_timeout(bootloader) if @config.keys_to_export.include?(:timeout)
write_nvram(bootloader) if @config.keys_to_export.include?(:update_nvram)
kernel_params = @config.scoped_kernel_params.values.join(" ")
@logger.info "scoped kernel params: #{kernel_params}"

Expand All @@ -190,6 +194,16 @@ def write_config
bootloader
end

def write_nvram(bootloader)
return if @config.update_nvram.nil?

if bootloader.respond_to?(:update_nvram=)
bootloader.update_nvram = @config.update_nvram
else
@logger.info "bootloader #{bootloader.name} does not support NVRAM update"
end
end

def write_extra_kernel_params(bootloader, kernel_params)
# no systemd boot support for now
return unless bootloader.respond_to?(:grub_default)
Expand Down
6 changes: 6 additions & 0 deletions service/package/rubygem-agama-yast.changes
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
-------------------------------------------------------------------
Wed Feb 18 20:28:02 UTC 2026 - Josef Reidinger <jreidinger@suse.com>

- Add support for updateNvram bootloader key (jsc#PED-14224)
- Add support for AutoYaST key bootloader->update_nvram conversion

-------------------------------------------------------------------
Mon Feb 16 16:31:50 UTC 2026 - José Iván López González <jlopez@suse.com>

Expand Down
Loading
Loading