From 825fbb8d2b5be70611761ddf86afeb8f2956723a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Wed, 26 Aug 2026 17:25:00 -0300 Subject: [PATCH] refactor(netboot): expose install image policies --- xCAT-server/lib/xcat/plugins/anaconda.pm | 75 ++++++++++++------- xCAT-server/lib/xcat/plugins/geninitrd.pm | 10 ++- .../share/xcat/netboot/imgutils/imgutils.pm | 7 ++ xCAT-server/share/xcat/netboot/rh/genimage | 8 +- 4 files changed, 67 insertions(+), 33 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index 0af5d40ab..07c5945db 100644 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -157,6 +157,44 @@ sub _find_genesis_boot_files return ($kernel, $initrd); } +sub _install_media_pxeboot_paths +{ + my ($pkgdir, $arch) = @_; + + return unless defined($pkgdir) && defined($arch); + return unless $arch =~ /x86|aarch64|riscv64/; + + my $kernel = "$pkgdir/images/pxeboot/vmlinuz"; + my $initrd = "$pkgdir/images/pxeboot/initrd.img"; + return unless -r $kernel; + + return ($kernel, -r $initrd ? $initrd : undef); +} + +sub _driver_disk_kernel_version +{ + my $path = shift; + + return unless defined($path); + return $1 if $path =~ m{/vmlinuz-(.*(?:x86_64|ppc64|el\d+|ppc64le|aarch64|riscv64))$}; + return; +} + +sub _default_crashkernel_args +{ + my ($arch, $dump, $fadump_flag, $fadump, $kdump) = @_; + + return '' unless defined($arch); + if ($arch eq 'ppc64') { + return $fadump_flag + ? " fadump=on fadump_reserve_mem=512M fadump_target=$fadump fadump_default=noreboot dump=$kdump " + : " crashkernel=256M\@64M dump=$dump "; + } + return " crashkernel=128M dump=$dump " if $arch =~ /86/; + return " crashkernel=256M dump=$dump " if $arch eq 'riscv64'; + return ''; +} + sub preprocess_request { my $req = shift; @@ -907,22 +945,9 @@ sub mknetboot } } else { - if ($arch eq "ppc64") { - if ($fadumpFlag) { - $kcmdline .= " fadump=on fadump_reserve_mem=512M fadump_target=$fadump fadump_default=noreboot dump=$kdump "; - } - else { - $kcmdline .= " crashkernel=256M\@64M dump=$dump "; - } - } - if ($arch =~ /86/) { - $kcmdline .= " crashkernel=128M dump=$dump "; - } - if ($arch eq "riscv64") { - # EL has no default reservation for riscv64, so without an explicit - # linuximage.crashkernelsize the kernel would reserve nothing at all - $kcmdline .= " crashkernel=256M dump=$dump "; - } + $kcmdline .= _default_crashkernel_args( + $arch, $dump, $fadumpFlag, $fadump, $kdump + ); } } @@ -1345,15 +1370,14 @@ sub mkinstall $pkvm = 1; } + my ($pxe_kernpath, $pxe_initrdpath) = + _install_media_pxeboot_paths($pkgdir, $arch); + $kernpath = $pxe_kernpath if defined($pxe_kernpath); + $initrdpath = $pxe_initrdpath if defined($pxe_initrdpath); + if ( ( - ( $arch =~ /x86/ or $arch =~ /aarch64/ or $arch =~ /riscv64/ ) and - ( - -r "$pkgdir/images/pxeboot/vmlinuz" - and $kernpath = "$pkgdir/images/pxeboot/vmlinuz" - and -r "$pkgdir/images/pxeboot/initrd.img" - and $initrdpath = "$pkgdir/images/pxeboot/initrd.img" - ) or ( #Handle the case seen in VMWare 4.0 ESX media + ( defined($pxe_kernpath) and defined($pxe_initrdpath) ) or ( #Handle the case seen in VMWare 4.0 ESX media #In VMWare 4.0 they dropped the pxe-optimized initrd #leaving us no recourse but the rather large optical disk #initrd, but perhaps we can mitigate with gPXE @@ -2834,8 +2858,9 @@ sub insert_dd { # and copy it to the /tftpboot my @new_kernels = <$dd_dir/rpm/boot/vmlinuz*>; foreach my $new_kernel (@new_kernels) { - if (-r $new_kernel && $new_kernel =~ /\/vmlinuz-(.*(x86_64|ppc64|el\d+|ppc64le|aarch64|riscv64))$/) { - $new_kernel_ver = $1; + my $candidate_version = _driver_disk_kernel_version($new_kernel); + if (-r $new_kernel && defined($candidate_version)) { + $new_kernel_ver = $candidate_version; $cmd = "/bin/mv -f $new_kernel $kernelpath"; xCAT::Utils->runcmd($cmd, -1); if ($::RUNCMD_RC != 0) { diff --git a/xCAT-server/lib/xcat/plugins/geninitrd.pm b/xCAT-server/lib/xcat/plugins/geninitrd.pm index 47b07e883..6f9388cef 100644 --- a/xCAT-server/lib/xcat/plugins/geninitrd.pm +++ b/xCAT-server/lib/xcat/plugins/geninitrd.pm @@ -15,6 +15,14 @@ use xCAT::TableUtils; use xCAT::Table; use xCAT::Scope; +sub _uses_x86_install_media_layout +{ + my ($arch, $osvers) = @_; + + return unless defined($arch) && defined($osvers); + return $arch =~ /x86/ || ($arch =~ /riscv64/ && $osvers !~ /sles|suse/); +} + sub handled_commands { return { @@ -191,7 +199,7 @@ sub geninitrd { } # riscv64 installation media exist for the EL family only; leave any other # distribution to the "unknow arch" error below instead of reading it as x86 - if ($arch =~ /x86/ or ($arch =~ /riscv64/ and $osvers !~ /sles|suse/)) { + if (_uses_x86_install_media_layout($arch, $osvers)) { if ($osvers =~ /(^ol[0-9].*)|(centos.*)|(alma.*)|(rocky.*)|(rh.*)|(fedora.*)|(SL.*)/) { $kernelpath = "$tftppath/vmlinuz"; copy("$pkgdir/images/pxeboot/vmlinuz", $kernelpath); diff --git a/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm b/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm index a5881c984..644a6e671 100644 --- a/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm +++ b/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm @@ -79,6 +79,13 @@ sub _profile_lookup_osbase_list { return grep { $_ ne $osver } xCAT::SvrUtils::get_os_search_list($osver); } +sub resolver_library_paths { + my $arch = shift; + my $libdir = $arch =~ /x86_64|aarch64|riscv64/ ? 'lib64' : 'lib'; + + return ( "$libdir/libnss_dns.so.2", "$libdir/libresolv.so.2" ); +} + sub get_profile_def_filename { my $osver = shift; my $profile = shift; diff --git a/xCAT-server/share/xcat/netboot/rh/genimage b/xCAT-server/share/xcat/netboot/rh/genimage index 3dc1c392d..452a4e3a9 100755 --- a/xCAT-server/share/xcat/netboot/rh/genimage +++ b/xCAT-server/share/xcat/netboot/rh/genimage @@ -1924,13 +1924,7 @@ EOMS } } - if ($arch =~ /x86_64/ or $arch =~ /aarch64/ or $arch =~ /riscv64/) { - push @filestoadd, "lib64/libnss_dns.so.2"; - push @filestoadd, "lib64/libresolv.so.2"; - } else { - push @filestoadd, "lib/libnss_dns.so.2"; - push @filestoadd, "lib/libresolv.so.2"; - } + push @filestoadd, imgutils::resolver_library_paths($arch); push @filestoadd, keys %libhash; find(\&isnetdriver, <$rootimg_dir/lib/modules/$kernelver/*>);