From c0e66721d7cdff4e46fe3ccf6648b2042484d604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Tue, 15 Sep 2026 01:12:21 -0300 Subject: [PATCH] feat(openeuler): provision installed and diskless images Add native compute and service profiles, installer dispatch and partition defaults. Use strict DNF image creation. Check stateless boot-file and archive publication. Preserve native image customizations on reimport. Restore missing image records during reimport. --- xCAT-server/lib/perl/xCAT/Postage.pm | 1 + xCAT-server/lib/perl/xCAT/SvrUtils.pm | 19 ++- xCAT-server/lib/perl/xCAT/Template.pm | 4 +- xCAT-server/lib/xcat/plugins/anaconda.pm | 26 +-- xCAT-server/lib/xcat/plugins/genimage.pm | 12 ++ xCAT-server/lib/xcat/plugins/packimage.pm | 155 ++++++++++++----- .../openeuler/compute.openeuler.pkglist | 15 ++ .../install/openeuler/compute.openeuler.tmpl | 38 +++++ .../openeuler/service.openeuler.pkglist | 4 + .../install/openeuler/service.openeuler.tmpl | 1 + ...openeuler20.03sp4.x86_64.otherpkgs.pkglist | 2 + ...openeuler22.03sp4.x86_64.otherpkgs.pkglist | 2 + ...e.openeuler24.03.ppc64le.otherpkgs.pkglist | 2 + ...openeuler24.03sp1.x86_64.otherpkgs.pkglist | 2 + ...openeuler24.03sp3.x86_64.otherpkgs.pkglist | 2 + ...openeuler24.03sp4.x86_64.otherpkgs.pkglist | 2 + .../share/xcat/install/scripts/post.rhels8 | 2 +- .../share/xcat/install/scripts/post.xcat.ng | 4 +- .../share/xcat/install/scripts/pre.openeuler | 7 + .../share/xcat/install/scripts/pre.rhels8 | 14 +- .../share/xcat/netboot/imgutils/imgutils.pm | 42 +++++ .../openeuler/compute.openeuler.exlist | 4 + .../openeuler/compute.openeuler.pkglist | 33 ++++ .../openeuler/compute.openeuler.postinstall | 1 + .../share/xcat/netboot/openeuler/dracut | 1 + .../share/xcat/netboot/openeuler/dracut_033 | 1 + .../share/xcat/netboot/openeuler/dracut_047 | 1 + .../share/xcat/netboot/openeuler/dracut_105 | 1 + .../share/xcat/netboot/openeuler/genimage | 1 + .../openeuler/service.openeuler.exlist | 1 + .../openeuler/service.openeuler.pkglist | 3 + .../openeuler/service.openeuler.postinstall | 1 + ...openeuler20.03sp4.x86_64.otherpkgs.pkglist | 1 + ...openeuler22.03sp4.x86_64.otherpkgs.pkglist | 1 + ...e.openeuler24.03.ppc64le.otherpkgs.pkglist | 1 + ...openeuler24.03sp1.x86_64.otherpkgs.pkglist | 1 + ...openeuler24.03sp3.x86_64.otherpkgs.pkglist | 1 + ...openeuler24.03sp4.x86_64.otherpkgs.pkglist | 1 + .../share/xcat/netboot/rh/dracut_047/xcatroot | 8 +- xCAT-server/share/xcat/netboot/rh/genimage | 161 +++++++++++++----- 40 files changed, 465 insertions(+), 114 deletions(-) create mode 100644 xCAT-server/share/xcat/install/openeuler/compute.openeuler.pkglist create mode 100644 xCAT-server/share/xcat/install/openeuler/compute.openeuler.tmpl create mode 100644 xCAT-server/share/xcat/install/openeuler/service.openeuler.pkglist create mode 120000 xCAT-server/share/xcat/install/openeuler/service.openeuler.tmpl create mode 100644 xCAT-server/share/xcat/install/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist create mode 100644 xCAT-server/share/xcat/install/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist create mode 100644 xCAT-server/share/xcat/install/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist create mode 100644 xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist create mode 100644 xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist create mode 100644 xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist create mode 100644 xCAT-server/share/xcat/install/scripts/pre.openeuler create mode 100644 xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.exlist create mode 100644 xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.pkglist create mode 120000 xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.postinstall create mode 120000 xCAT-server/share/xcat/netboot/openeuler/dracut create mode 120000 xCAT-server/share/xcat/netboot/openeuler/dracut_033 create mode 120000 xCAT-server/share/xcat/netboot/openeuler/dracut_047 create mode 120000 xCAT-server/share/xcat/netboot/openeuler/dracut_105 create mode 120000 xCAT-server/share/xcat/netboot/openeuler/genimage create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler.exlist create mode 100644 xCAT-server/share/xcat/netboot/openeuler/service.openeuler.pkglist create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler.postinstall create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist create mode 120000 xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist diff --git a/xCAT-server/lib/perl/xCAT/Postage.pm b/xCAT-server/lib/perl/xCAT/Postage.pm index e9d40ba8c..291620266 100644 --- a/xCAT-server/lib/perl/xCAT/Postage.pm +++ b/xCAT-server/lib/perl/xCAT/Postage.pm @@ -1295,6 +1295,7 @@ sub getImageitems_for_node elsif ($os =~ /sles.*/) { $platform = "sles"; } elsif ($os =~ /ubuntu.*/) { $platform = "ubuntu"; } elsif ($os =~ /debian.*/) { $platform = "debian"; } + elsif ($os =~ /^openeuler/) { $platform = "openeuler"; } elsif ($os =~ /aix.*/) { $platform = "aix"; } elsif ($os =~ /AIX.*/) { $platform = "AIX"; } } diff --git a/xCAT-server/lib/perl/xCAT/SvrUtils.pm b/xCAT-server/lib/perl/xCAT/SvrUtils.pm index 46d226df0..2b286c95e 100644 --- a/xCAT-server/lib/perl/xCAT/SvrUtils.pm +++ b/xCAT-server/lib/perl/xCAT/SvrUtils.pm @@ -916,8 +916,6 @@ sub update_tables_with_templates } } - # if ($found) { next; } - my $imagename = $osver . "-" . $arch . "-install-" . $profile; #TODO: check if there happen to be a row that has the same imagename but with different contents @@ -941,7 +939,9 @@ sub update_tables_with_templates if ($args{description}) { $tb_cols{description} = $args{description}; } - $osimagetab->setAttribs(\%key_col, \%tb_cols); + $osimagetab->setAttribs(\%key_col, \%tb_cols) + unless $osver =~ /^openeuler/ + && $osimagetab->getAttribs(\%key_col, 'imagename'); if ($osname =~ /^win/) { if (!$winimagetab) { $winimagetab = xCAT::Table->new('winimage', -create => 1); } @@ -964,7 +964,9 @@ sub update_tables_with_templates _apply_new_linuximage_defaults( $linuximagetab, $imagename, \%tb_cols); - $linuximagetab->setAttribs(\%key_col, \%tb_cols); + $linuximagetab->setAttribs(\%key_col, \%tb_cols) + unless $osver =~ /^openeuler/ + && $linuximagetab->getAttribs(\%key_col, 'imagename'); } else { return (1, "Cannot open the linuximage table."); @@ -1352,7 +1354,6 @@ sub update_tables_with_diskless_image } if ($found) { print "The image is already in the db.\n"; - # next; } @@ -1369,7 +1370,9 @@ sub update_tables_with_diskless_image osarch => $arch, synclists => $synclistfile, osdistroname => $osdistroname); - $osimagetab->setAttribs(\%key_col, \%tb_cols); + $osimagetab->setAttribs(\%key_col, \%tb_cols) + unless $osver =~ /^openeuler/ + && $osimagetab->getAttribs(\%key_col, 'imagename'); if ($osname !~ /^win/) { if (!$linuximagetab) { $linuximagetab = xCAT::Table->new('linuximage', -create => 1); } @@ -1384,7 +1387,9 @@ sub update_tables_with_diskless_image rootimgdir => "$installroot/netboot/$osver/$arch/$profile"); _apply_new_linuximage_defaults( $linuximagetab, $imagename, \%tb_cols); - $linuximagetab->setAttribs(\%key_col, \%tb_cols); + $linuximagetab->setAttribs(\%key_col, \%tb_cols) + unless $osver =~ /^openeuler/ + && $linuximagetab->getAttribs(\%key_col, 'imagename'); } else { return (1, "Cannot open the linuximage table."); diff --git a/xCAT-server/lib/perl/xCAT/Template.pm b/xCAT-server/lib/perl/xCAT/Template.pm index 586c2e56c..153b2dcbb 100644 --- a/xCAT-server/lib/perl/xCAT/Template.pm +++ b/xCAT-server/lib/perl/xCAT/Template.pm @@ -384,7 +384,7 @@ sub subvars { $inc =~ s/#CRYPT:([^:]+):([^:]+):([^#]+)#/crydb($1,$2,$3)/eg; $inc =~ s/#CRYPTORLOCKED:([^:]+):([^:]+):([^#]+)#/crydb_or_locked($1,$2,$3)/eg; $inc =~ s/#COMMAND:([^#]+)#/command($1)/eg; - $inc =~ s/#KICKSTARTNET#/kickstartnetwork()/eg; + $inc =~ s/#KICKSTARTNET#/kickstartnetwork($platform)/eg; $inc =~ s/#MIRRORSPEC#/mirrorspec()/eg; $inc =~ s/#YAST2NET#/yast2network()/eg; $inc =~ s/#KICKSTARTBOOTLOADER#/kickstartbootloader()/eg; @@ -1046,6 +1046,7 @@ sub esxipv6setup { sub kickstartnetwork { + my $platform = shift; my $line = "network --onboot=yes --bootproto="; my $hoststab; my $mactab = xCAT::Table->new('mac', -create => 0); @@ -1108,6 +1109,7 @@ sub kickstartnetwork { #return "#KSNET static unsupported"; } else { $line .= "dhcp --device=$suffix"; + $line .= " --hostname=$node" if (defined($platform) && $platform eq 'openeuler'); } return $line; } diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index 582ff28f4..2167e30db 100644 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -144,11 +144,11 @@ sub _set_driver_disk_marker sub _driver_disk_kernel_arg { - my ($kversion, $initrd) = @_; + my ($kversion, $initrd, $modern_installer) = @_; my $marker = _driver_disk_marker_path($initrd); return '' unless defined($marker) && -f $initrd && -f $marker; - return '' if xCAT::Utils->version_cmp($kversion, "7.0") < 0; + return '' unless $modern_installer || xCAT::Utils->version_cmp($kversion, "7.0") >= 0; return " inst.dd=/dd.img"; } @@ -157,8 +157,8 @@ sub handled_commands { return { copycd => "anaconda", - mknetboot => "nodetype:os=(^ol[0-9].*)|(centos.*)|(alma.*)|(rocky.*)|(rh.*)|(fedora.*)|(SL.*)", - mkinstall => "nodetype:os=(pkvm.*)|(esxi4.1)|(esx[34].*)|(^ol[0-9].*)|(centos.*)|(alma.*)|(rocky.*)|(rh(?!evh).*)|(fedora.*)|(SL.*)", + mknetboot => "nodetype:os=(^ol[0-9].*)|(centos.*)|(alma.*)|(rocky.*)|(rh.*)|(fedora.*)|(SL.*)|(openeuler.*)", + mkinstall => "nodetype:os=(pkvm.*)|(esxi4.1)|(esx[34].*)|(^ol[0-9].*)|(centos.*)|(alma.*)|(rocky.*)|(rh(?!evh).*)|(fedora.*)|(SL.*)|(openeuler.*)", mksysclone => "nodetype:os=(esxi4.1)|(esx[34].*)|(^ol[0-9].*)|(centos.*)|(alma.*)|(rocky.*)|(rh(?!evh).*)|(fedora.*)|(SL.*)", mkstatelite => "nodetype:os=(esx[34].*)|(^ol[0-9].*)|(centos.*)|(alma.*)|(rocky.*)|(rh.*)|(fedora.*)|(SL.*)", @@ -1508,10 +1508,12 @@ sub mkinstall my $kversion = $os; $kversion =~ s/^\D*([\.0-9]+)/$1/; $kversion =~ s/\.$//; + my $modern_installer = $os =~ /^openeuler/ + || xCAT::Utils->version_cmp($kversion, "7.0") >= 0; if ($pkvm) { $kcmdline = "ksdevice=bootif kssendmac text selinux=0 rd.dm=0 rd.md=0 repo=$httpmethod://$instserver:$httpport$httpprefix/packages/ kvmp.inst.auto=$httpmethod://$instserver:$httpport/install/autoinst/$node root=live:$httpmethod://$instserver:$httpport$httpprefix/LiveOS/squashfs.img"; } else { - if (xCAT::Utils->version_cmp($kversion, "7.0") < 0) { + if (!$modern_installer) { $kcmdline = "repo=$httpmethod://$instserver:$httpport$httpprefix ks=$httpmethod://" . $instserver . ":" . $httpport . "/install/autoinst/" @@ -1542,7 +1544,7 @@ sub mkinstall my $nicname = $net_params->{nicname}; - if (xCAT::Utils->version_cmp($kversion, "7.0") < 0) { + if (!$modern_installer) { $kcmdline .= " $net_params->{ksdevice} "; } elsif ($arch =~ /ppc/) { $kcmdline .= " $net_params->{BOOTIF} "; @@ -1562,7 +1564,7 @@ sub mkinstall unless ($gatewayd[0]) { $gateway = $gatewayd[1]; } } - if (xCAT::Utils->version_cmp($kversion, "7.0") < 0) { + if (!$modern_installer) { $kcmdline .= " ip=$ipaddr netmask=$netmask gateway=$gateway hostname=$hostname "; } else { $kcmdline .= " ip=$ipaddr" . "::" . "$gateway" . ":" . "$netmask" . ":" . "$hostname" . ":"; @@ -1593,7 +1595,7 @@ sub mkinstall } if (scalar @nameserversIP) { - if (xCAT::Utils->version_cmp($kversion, "7.0") < 0) { + if (!$modern_installer) { $kcmdline .= " dns=" . join(",", @nameserversIP); } else { foreach (@nameserversIP) { @@ -1602,7 +1604,7 @@ sub mkinstall } } } else { - if (xCAT::Utils->version_cmp($kversion, "7.0") >= 0) { + if ($modern_installer) { $kcmdline .= " $net_params->{ip} "; } } @@ -1613,7 +1615,7 @@ sub mkinstall $instserver = $ip; } - if (xCAT::Utils->version_cmp($kversion, "7.0") >= 0) { + if ($modern_installer) { if ($::XCATSITEVALS{xcatdebugmode} eq "2") { #enable ssh access during installation @@ -1637,7 +1639,7 @@ sub mkinstall $kcmdline .= _driver_disk_kernel_arg( - $kversion, "$tftppath/initrd.img" + $kversion, "$tftppath/initrd.img", $modern_installer ); if (defined($sent->{serialport})) { unless ($sent->{serialspeed}) { @@ -1646,7 +1648,7 @@ sub mkinstall } #go cmdline if serial console is requested, the shiny ansi is just impractical - if (xCAT::Utils->version_cmp($kversion, "7.0") < 0) { + if (!$modern_installer) { $kcmdline .= " cmdline "; } else { $kcmdline .= " inst.cmdline "; diff --git a/xCAT-server/lib/xcat/plugins/genimage.pm b/xCAT-server/lib/xcat/plugins/genimage.pm index 95b7e8d89..47a9d1d3f 100644 --- a/xCAT-server/lib/xcat/plugins/genimage.pm +++ b/xCAT-server/lib/xcat/plugins/genimage.pm @@ -166,6 +166,10 @@ sub process_request { $callback->({ error => ["\'$imagename\' cannot be used to build diskless image. Make sure osimage.provmethod is 'netboot'."], errorcode => [1] }); return 1; } + if ($osver =~ /^openeuler/ && $provmethod eq 'statelite') { + $callback->({ error => ['openEuler StateLite images are not supported.'], errorcode => [1] }); + return 1; + } unless ($ref_linuximage_tab->{'pkglist'}) { $callback->({ error => ["A .pkglist file must be specified for image \'$imagename\' in the linuximage table."], errorcode => [1] }); @@ -289,6 +293,14 @@ sub process_request { if ($osver =~ /^leap15/) { $osfamily = "sles"; } + if ($osver =~ /^openeuler/) { + unless (defined(xCAT::Utils::normalize_openeuler_version(substr($osver, 9))) + && $arch =~ /^(?:x86_64|ppc64le)$/) { + $callback->({ error => ["Unsupported openEuler release or architecture: $osver $arch"], errorcode => [1] }); + return 1; + } + $osfamily = 'openeuler'; + } $osfamily =~ s/ //g; diff --git a/xCAT-server/lib/xcat/plugins/packimage.pm b/xCAT-server/lib/xcat/plugins/packimage.pm index 00b36c866..c3281e158 100644 --- a/xCAT-server/lib/xcat/plugins/packimage.pm +++ b/xCAT-server/lib/xcat/plugins/packimage.pm @@ -191,6 +191,22 @@ sub process_request { } $rootimg_dir = "$destdir/rootimg"; + my $is_openeuler = $osver =~ /^openeuler/; + if ($is_openeuler) { + unless (defined(xCAT::Utils::normalize_openeuler_version(substr($osver, 9))) + && $arch =~ /^(?:x86_64|ppc64le)$/) { + $callback->({ error => ["Unsupported openEuler image release or architecture: $osver $arch"], errorcode => [1] }); + return 1; + } + if (-f "$rootimg_dir/.statelite/litefile.save") { + $callback->({ error => ["openEuler StateLite images are not supported"], errorcode => [1] }); + return 1; + } + unless (-d $rootimg_dir) { + $callback->({ error => ["$rootimg_dir does not exist; run genimage first"], errorcode => [1] }); + return 1; + } + } my $retcode; ($retcode,$lock)=xCAT::Utils->acquire_lock_imageop($rootimg_dir); @@ -241,15 +257,13 @@ sub process_request { my $rootimg_status = 0; # 0 means stateless mode, while 1 means statelite mode $rootimg_status = 1 if (-f "$rootimg_dir/.statelite/litefile.save"); - my $ref_liteList; # get the litefile entries - - my @ret = xCAT::Utils->runcmd("ilitefile $osver-$arch-statelite-$profile", 0, 1); - $ref_liteList = $ret[0]; - my %liteHash; # create hash table for the entries in @listList - if (parseLiteFiles($ref_liteList, \%liteHash)) { - $callback->({ error => ["Failed for parsing litefile table!"], errorcode => [1] }); - return 1; + unless ($is_openeuler) { + my @ret = xCAT::Utils->runcmd("ilitefile $osver-$arch-statelite-$profile", 0, 1); + if (parseLiteFiles($ret[0], \%liteHash)) { + $callback->({ error => ["Failed for parsing litefile table!"], errorcode => [1] }); + return 1; + } } $verbose && $callback->({ data => [ "rootimg_status = $rootimg_status at line " . __LINE__ ] }); @@ -287,26 +301,28 @@ sub process_request { } } - # TODO: following the old genimage code, to update the stateles-only files/directories - # # another file should be /opt/xcat/xcatdsklspost, but it seems not necessary - xCAT::Utils->runcmd("mv $rootimg_dir/etc/init.d/statelite $rootimg_dir/.statebackup/statelite ", 0, 1) if (-e "$rootimg_dir/etc/init.d/statelite"); - if (-e "$rootimg_dir/usr/share/dracut") { + unless ($is_openeuler) { + # TODO: following the old genimage code, to update the stateles-only files/directories + # # another file should be /opt/xcat/xcatdsklspost, but it seems not necessary + xCAT::Utils->runcmd("mv $rootimg_dir/etc/init.d/statelite $rootimg_dir/.statebackup/statelite ", 0, 1) if (-e "$rootimg_dir/etc/init.d/statelite"); + if (-e "$rootimg_dir/usr/share/dracut") { - # currently only used for redhat families, not available for SuSE families - if (-e "$rootimg_dir/etc/rc.sysinit.backup") { - xCAT::Utils->runcmd("mv $rootimg_dir/etc/rc.sysinit.backup $rootimg_dir/etc/rc.sysinit", 0, 1); + # currently only used for redhat families, not available for SuSE families + if (-e "$rootimg_dir/etc/rc.sysinit.backup") { + xCAT::Utils->runcmd("mv $rootimg_dir/etc/rc.sysinit.backup $rootimg_dir/etc/rc.sysinit", 0, 1); + } } - } - #restore the install.netboot of xcat dracut module - if (-e "$rootimg_dir/usr/lib/dracut/modules.d/97xcat/install") { - xCAT::Utils->runcmd("mv $rootimg_dir/usr/lib/dracut/modules.d/97xcat/install $rootimg_dir/.statebackup/install", 0, 1); + #restore the install.netboot of xcat dracut module + if (-e "$rootimg_dir/usr/lib/dracut/modules.d/97xcat/install") { + xCAT::Utils->runcmd("mv $rootimg_dir/usr/lib/dracut/modules.d/97xcat/install $rootimg_dir/.statebackup/install", 0, 1); + } + my $dracut_install = "$::XCATROOT/share/xcat/netboot/$distname/dracut_033/install.netboot"; + if (!-r $dracut_install) { + $dracut_install = "$::XCATROOT/share/xcat/netboot/rh/dracut_033/install.netboot"; + } + xCAT::Utils->runcmd("cp $dracut_install $rootimg_dir/usr/lib/dracut/modules.d/97xcat/install", 0, 1); } - my $dracut_install = "$::XCATROOT/share/xcat/netboot/$distname/dracut_033/install.netboot"; - if (!-r $dracut_install) { - $dracut_install = "$::XCATROOT/share/xcat/netboot/rh/dracut_033/install.netboot"; - } - xCAT::Utils->runcmd("cp $dracut_install $rootimg_dir/usr/lib/dracut/modules.d/97xcat/install", 0, 1); # timedatectl requires /etc/localtime link to the zoneinfo in /usr/share/zoneinfo @@ -321,7 +337,8 @@ sub process_request { $callback->({ info => ["No timezone defined in site table, skipping timezone /etc/localtime configuration"] }); } - my $xcat_packimg_tmpfile = "/tmp/xcat_packimg.$$"; + my $native_filelist = $is_openeuler ? File::Temp->new(TMPDIR => 1, UNLINK => 1) : undef; + my $xcat_packimg_tmpfile = $is_openeuler ? "$native_filelist" : "/tmp/xcat_packimg.$$"; my $excludestr = "find . -xdev "; my $includestr; if ($exlistloc) { @@ -383,6 +400,8 @@ sub process_request { # the files specified for statelite should be excluded my @excludeStatelite = ("./etc/init.d/statelite", "./etc/rc.sysinit.backup", "./.statelite*", "./.default*", "./.statebackup*"); + push @excludeStatelite, './etc/rc.d/init.d/statelite', './etc/rc.d/init.d/localdisk', + './etc/init.d/localdisk', './.sllocal*' if $is_openeuler; foreach my $entry (@excludeStatelite) { $excludestr .= "'!' -path '" . $entry . "' -a "; } @@ -453,6 +472,14 @@ sub process_request { my $temppath; my $oldmask; + my $native_failure = sub { + my $message = shift; + $callback->({ error => [$message], errorcode => [1] }); + chdir($oldpath); + umask($oldmask) if defined($oldmask); + rmtree($temppath) if defined($temppath) && -d $temppath; + return 1; + }; unless (-d $rootimg_dir) { $callback->({ error => ["$rootimg_dir does not exist, run genimage -o $osver -p $profile on a server with matching architecture"], errorcode => [1] }); return 1; @@ -512,18 +539,42 @@ sub process_request { } $suffix = $method.".".$suffix; - unlink glob("$destdir/rootimg.*"); + unlink glob("$destdir/rootimg.*") unless $is_openeuler; + my $native_archive = $is_openeuler + ? File::Temp->new(DIR => $destdir, TEMPLATE => '.packimage-XXXXXXXX', UNLINK => 1) : undef; + my $archive_output = "../rootimg.$suffix"; + if ($is_openeuler) { + $archive_output = "$native_archive"; + $archive_output =~ s/'/'\\''/g; + $archive_output = "'$archive_output'"; + chdir($rootimg_dir) or return $native_failure->("Cannot enter $rootimg_dir: $!"); + my ($rc, $output) = native_pack_command("$excludestr > $xcat_packimg_tmpfile"); + return $native_failure->("Cannot enumerate $rootimg_dir: $output") if $rc; + if ($includestr) { + ($rc, $output) = native_pack_command("$includestr >> $xcat_packimg_tmpfile"); + return $native_failure->("Cannot enumerate included files: $output") if $rc; + } + } + my $publish_native_archive = sub { + my $target = $method eq 'squashfs' ? "$destdir/rootimg.sfs" : "$destdir/rootimg.$suffix"; + unless (-s "$native_archive" && chmod(0644, "$native_archive") + && rename("$native_archive", $target)) { + return $native_failure->("Cannot publish $target: $!"); + } + unlink grep { $_ ne $target } glob("$destdir/rootimg.*"); + return 0; + }; if ($method =~ /cpio/) { if (!$excludestr) { - $excludestr = "find . -xdev -print0 | cpio -H newc -o -0 | $compress -c - > ../rootimg.$suffix"; + $excludestr = "find . -xdev -print0 | cpio -H newc -o -0 | $compress -c - > $archive_output"; } else { chdir("$rootimg_dir"); - system("$excludestr >> $xcat_packimg_tmpfile"); - if ($includestr) { + system("$excludestr >> $xcat_packimg_tmpfile") unless $is_openeuler; + if ($includestr && !$is_openeuler) { system("$includestr >> $xcat_packimg_tmpfile"); } - $excludestr = "cat $xcat_packimg_tmpfile|cpio -H newc -o | $compress -c - > ../rootimg.$suffix"; + $excludestr = "cat $xcat_packimg_tmpfile|cpio -H newc -o | $compress -c - > $archive_output"; } $oldmask = umask 0077; } elsif ($method =~ /tar/) { @@ -537,36 +588,44 @@ sub process_request { $option .= "--selinux "; } if (!$excludestr) { - $excludestr = "find . -xdev -print0 | tar $option --no-recursion --use-compress-program=$compress --null -T - -cf ../rootimg.$suffix"; + $excludestr = "find . -xdev -print0 | tar $option --no-recursion --use-compress-program=$compress --null -T - -cf $archive_output"; } else { chdir("$rootimg_dir"); - system("$excludestr >> $xcat_packimg_tmpfile"); - if ($includestr) { + system("$excludestr >> $xcat_packimg_tmpfile") unless $is_openeuler; + if ($includestr && !$is_openeuler) { system("$includestr >> $xcat_packimg_tmpfile"); } - $excludestr = "cat $xcat_packimg_tmpfile| tar $option --no-recursion --use-compress-program=$compress -T - -cf ../rootimg.$suffix"; + $excludestr = "cat $xcat_packimg_tmpfile| tar $option --no-recursion --use-compress-program=$compress -T - -cf $archive_output"; } $oldmask = umask 0077; } elsif ($method =~ /squashfs/) { $temppath = mkdtemp("/tmp/packimage.$$.XXXXXXXX"); chmod 0755, $temppath; chdir("$rootimg_dir"); - system("$excludestr >> $xcat_packimg_tmpfile"); - if ($includestr) { + system("$excludestr >> $xcat_packimg_tmpfile") unless $is_openeuler; + if ($includestr && !$is_openeuler) { system("$includestr >> $xcat_packimg_tmpfile"); } $excludestr = "cat $xcat_packimg_tmpfile|cpio -dump $temppath"; } chdir("$rootimg_dir"); - my $outputmsg = `$excludestr 2>&1`; - unless($?){ + my ($archive_rc, $outputmsg); + if ($is_openeuler) { + ($archive_rc, $outputmsg) = native_pack_command($excludestr); + } else { + $outputmsg = `$excludestr 2>&1`; + $archive_rc = $?; + } + unless($archive_rc){ $callback->({ info => ["$outputmsg"] }); }else{ $callback->({ info => ["$outputmsg"] }); + return $native_failure->("packimage failed while running: \n $excludestr") if $is_openeuler; $callback->({ error => ["packimage failed while running: \n $excludestr"], errorcode => [1] }); system("rm -rf $xcat_packimg_tmpfile"); return 1; } + return 1 if $is_openeuler && $method ne 'squashfs' && $publish_native_archive->(); if ($method =~ /cpio/) { chmod 0644, "$destdir/rootimg.$suffix"; @@ -593,6 +652,7 @@ sub process_request { } if (!-x "/sbin/mksquashfs" && !-x "/usr/bin/mksquashfs") { + return $native_failure->("mksquashfs not found; install squashfs-tools") if $is_openeuler; if ($osver =~ /sle/) { $callback->({ error => ["mksquashfs not found, squashfs rpm should be installed on the management node"], errorcode => [1] }); } else { @@ -600,18 +660,23 @@ sub process_request { } return 1; } - my $mksquashfs_command = "mksquashfs $temppath ../rootimg.sfs $flags"; + my $squashfs_output = $is_openeuler ? $archive_output : '../rootimg.sfs'; + $flags .= ' -noappend' if $is_openeuler; + my $mksquashfs_command = "mksquashfs $temppath $squashfs_output $flags"; xCAT::Utils->runcmd($mksquashfs_command, 0, 1); my $rc = $::RUNCMD_RC; if ($rc) { + return $native_failure->("Command \"$mksquashfs_command\" failed") if $is_openeuler; $callback->({ error => ["Command \"$mksquashfs_command\" failed"], errorcode => [1] }); return 1; } $rc = system("rm -rf $temppath"); if ($rc) { + return $native_failure->("Failed to clean up temp space") if $is_openeuler; $callback->({ error => ["Failed to clean up temp space"], errorcode => [1] }); return 1; } + return 1 if $is_openeuler && $publish_native_archive->(); chmod(0644, "../rootimg.sfs"); } system("rm -f $xcat_packimg_tmpfile"); @@ -635,7 +700,17 @@ sub process_request { } - chdir($oldpath); + my $restored = chdir($oldpath); + return $is_openeuler ? 0 : $restored; +} + +sub native_pack_command { + my ($command) = @_; + open(my $pipe, '-|', '/bin/bash', '-o', 'pipefail', '-c', "{ $command; } 2>&1") + or return (1, "Cannot execute archive command: $!"); + my $output = do { local $/; <$pipe> }; + close($pipe); + return ($?, $output // ''); } #------------------------------------------------------- diff --git a/xCAT-server/share/xcat/install/openeuler/compute.openeuler.pkglist b/xCAT-server/share/xcat/install/openeuler/compute.openeuler.pkglist new file mode 100644 index 000000000..b0521e602 --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/compute.openeuler.pkglist @@ -0,0 +1,15 @@ +@core +kernel +chrony +NetworkManager +net-tools +nfs-utils +openssh-server +openssh-clients +rsync +util-linux +wget +python3 +tar +bzip2 +perl diff --git a/xCAT-server/share/xcat/install/openeuler/compute.openeuler.tmpl b/xCAT-server/share/xcat/install/openeuler/compute.openeuler.tmpl new file mode 100644 index 000000000..7ff6f5fdc --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/compute.openeuler.tmpl @@ -0,0 +1,38 @@ +text +%include /tmp/repos +keyboard --vckeymap=us --xlayouts='us' +lang en_US.UTF-8 +#KICKSTARTNET# +rootpw --iscrypted #CRYPT:passwd:key=system,username=root:password# +firstboot --disable +skipx +timezone #TABLE:site:key=timezone:value# --utc +zerombr +clearpart --all --initlabel +#XCAT_PARTITION_START# +%include /tmp/partitionfile +#XCAT_PARTITION_END# +firewall --disable +selinux --disable +reboot + +%packages +#INCLUDE_DEFAULT_PKGLIST# +%end + +%pre --interpreter=/bin/bash --erroronfail +{ +echo "Running Kickstart Pre-installation script..." +#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/pre.openeuler# +} &>>/tmp/pre-install.log +%end + +%post --interpreter=/bin/bash --erroronfail +mkdir -p /var/log/xcat/ +cat /tmp/pre-install.log >>/var/log/xcat/xcat.log +{ +echo "Running Kickstart Post-installation script..." +#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/post.xcat.ng# +#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/post.rhels8# +} &>>/var/log/xcat/xcat.log +%end diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler.pkglist b/xCAT-server/share/xcat/install/openeuler/service.openeuler.pkglist new file mode 100644 index 000000000..55bf1a9a2 --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler.pkglist @@ -0,0 +1,4 @@ +#INCLUDE:${XCATROOT}/share/xcat/install/openeuler/compute.openeuler.pkglist# +openssl +perl-DBD-MySQL +perl-DBD-Pg diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler.tmpl b/xCAT-server/share/xcat/install/openeuler/service.openeuler.tmpl new file mode 120000 index 000000000..c93e169a1 --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler.tmpl @@ -0,0 +1 @@ +compute.openeuler.tmpl \ No newline at end of file diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/install/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist new file mode 100644 index 000000000..429da526b --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist @@ -0,0 +1,2 @@ +xcat/xcat-core/openeuler20.03sp4/x86_64/xCATsn +xcat/xcat-dep/openeuler20.03sp4/x86_64/goconserver diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/install/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist new file mode 100644 index 000000000..e7768baa1 --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist @@ -0,0 +1,2 @@ +xcat/xcat-core/openeuler22.03sp4/x86_64/xCATsn +xcat/xcat-dep/openeuler22.03sp4/x86_64/goconserver diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist new file mode 100644 index 000000000..494cc92cb --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist @@ -0,0 +1,2 @@ +xcat/xcat-core/openeuler24.03/ppc64le/xCATsn +xcat/xcat-dep/openeuler24.03/ppc64le/goconserver diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist new file mode 100644 index 000000000..bff3b4d3c --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist @@ -0,0 +1,2 @@ +xcat/xcat-core/openeuler24.03sp1/x86_64/xCATsn +xcat/xcat-dep/openeuler24.03sp1/x86_64/goconserver diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist new file mode 100644 index 000000000..fa97c3f2b --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist @@ -0,0 +1,2 @@ +xcat/xcat-core/openeuler24.03sp3/x86_64/xCATsn +xcat/xcat-dep/openeuler24.03sp3/x86_64/goconserver diff --git a/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist new file mode 100644 index 000000000..a520cd830 --- /dev/null +++ b/xCAT-server/share/xcat/install/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist @@ -0,0 +1,2 @@ +xcat/xcat-core/openeuler24.03sp4/x86_64/xCATsn +xcat/xcat-dep/openeuler24.03sp4/x86_64/goconserver diff --git a/xCAT-server/share/xcat/install/scripts/post.rhels8 b/xCAT-server/share/xcat/install/scripts/post.rhels8 index 825d42af2..e396315c4 100644 --- a/xCAT-server/share/xcat/install/scripts/post.rhels8 +++ b/xCAT-server/share/xcat/install/scripts/post.rhels8 @@ -33,7 +33,7 @@ fi # List of internal repos to be disabled -internet_repo_file_list="oracle-linux-ol8.repo oracle-linux-ol9.repo uek-ol8.repo uek-ol9.repo Rocky-AppStream.repo Rocky-BaseOS.repo Rocky-Extras.repo rocky.repo rocky-extras.repo CentOS-Base.repo centos.repo centos-addons.repo almalinux-ha.repo almalinux-nfv.repo almalinux-powertools.repo almalinux.repo almalinux-resilientstorage.repo almalinux-rt.repo" +internet_repo_file_list="oracle-linux-ol8.repo oracle-linux-ol9.repo uek-ol8.repo uek-ol9.repo Rocky-AppStream.repo Rocky-BaseOS.repo Rocky-Extras.repo rocky.repo rocky-extras.repo CentOS-Base.repo centos.repo centos-addons.repo almalinux-ha.repo almalinux-nfv.repo almalinux-powertools.repo almalinux.repo almalinux-resilientstorage.repo almalinux-rt.repo openEuler.repo" for repo_file in $internet_repo_file_list do diff --git a/xCAT-server/share/xcat/install/scripts/post.xcat.ng b/xCAT-server/share/xcat/install/scripts/post.xcat.ng index 78f0e09a9..7b9e7a8eb 100644 --- a/xCAT-server/share/xcat/install/scripts/post.xcat.ng +++ b/xCAT-server/share/xcat/install/scripts/post.xcat.ng @@ -330,7 +330,7 @@ fi export OSVER="#TABLE:nodetype:THISNODE:os#" # Create the post init service as a hook to run PS and PBS, as well as status updating cat >/etc/systemd/system/xcatpostinit1.service <<'EOF' -#INCLUDE:/install/postscripts/xcatpostinit1.service# +#INCLUDE:#TABLE:site:key=installdir:value#/postscripts/xcatpostinit1.service# EOF case "$XCATDEBUGMODE" in @@ -348,7 +348,7 @@ case "$XCATDEBUGMODE" in esac cat >/opt/xcat/xcatpostinit1 <<'EOF' -#INCLUDE:/install/postscripts/xcatpostinit1.install# +#INCLUDE:#TABLE:site:key=installdir:value#/postscripts/xcatpostinit1.install# EOF chmod 0755 /opt/xcat/xcatpostinit1 diff --git a/xCAT-server/share/xcat/install/scripts/pre.openeuler b/xCAT-server/share/xcat/install/scripts/pre.openeuler new file mode 100644 index 000000000..1278e034e --- /dev/null +++ b/xCAT-server/share/xcat/install/scripts/pre.openeuler @@ -0,0 +1,7 @@ +XCAT_INSTALL_PYTHON=/usr/bin/python3 +XCAT_BIOSBOOT=1 +if [ "$(uname -m)" = ppc64le ]; then + XCAT_BOOT_FSTYPE=ext4 + XCAT_ROOT_FSTYPE=ext4 +fi +#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/pre.rhels8# diff --git a/xCAT-server/share/xcat/install/scripts/pre.rhels8 b/xCAT-server/share/xcat/install/scripts/pre.rhels8 index 5be2a2646..b9900825b 100644 --- a/xCAT-server/share/xcat/install/scripts/pre.rhels8 +++ b/xCAT-server/share/xcat/install/scripts/pre.rhels8 @@ -142,11 +142,11 @@ case "$NODESTATUS" in "0"|"N"|"n") ;; *) - /tmp/baz.py "installstatus installing" & + "${XCAT_INSTALL_PYTHON:-/usr/libexec/platform-python}" /tmp/baz.py "installstatus installing" & ;; esac -/tmp/foo.py >/foo.log 2>&1 & +"${XCAT_INSTALL_PYTHON:-/usr/libexec/platform-python}" /tmp/foo.py >/foo.log 2>&1 & base64decode() { @@ -248,8 +248,8 @@ then instdisk="$(cat /tmp/xcat.install_disk)" fi -BOOTFSTYPE=xfs -FSTYPE=xfs +BOOTFSTYPE=${XCAT_BOOT_FSTYPE:-xfs} +FSTYPE=${XCAT_ROOT_FSTYPE:-xfs} EFIFSTYPE=efi #remove any exiting "xcatvg" VG to avoid fatal error @@ -264,7 +264,11 @@ case "$(uname -m)" in echo "part prepboot --fstype=prepboot --asprimary --ondisk=$instdisk --size=8" >>/tmp/partitionfile ;; esac -if [ `blockdev --getsz $instdisk` -gt 4294967295 ]; then +if [ "${XCAT_BIOSBOOT:-0}" = "1" ]; then + if [ "$(uname -m)" = x86_64 ] && [ ! -d /sys/firmware/efi ]; then + echo "part biosboot --ondisk=$instdisk --size=1" >> /tmp/partitionfile + fi +elif [ `blockdev --getsz $instdisk` -gt 4294967295 ]; then echo "part biosboot --ondisk=$instdisk --size=1" >> /tmp/partitionfile fi if [ -d /sys/firmware/efi ] diff --git a/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm b/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm index 644a6e671..0d490a982 100644 --- a/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm +++ b/xCAT-server/share/xcat/netboot/imgutils/imgutils.pm @@ -31,6 +31,9 @@ sub rpm_installroot_command { $non_interactive ||= ""; $dnf_available = -x "/usr/bin/dnf" unless defined($dnf_available); my $majorrel = el_major_version($osver); + my $openeuler_release = openeuler_release_version($osver); + die "Unsupported openEuler image release: $osver\n" + if defined($osver) && $osver =~ /^openeuler/ && !defined($openeuler_release); my $pkgmgr = "yum"; # EL8 and newer are dnf-native. Keep yum as the fallback for legacy @@ -38,16 +41,55 @@ sub rpm_installroot_command { if (defined($majorrel) && $majorrel > 7 && $dnf_available) { $pkgmgr = "dnf"; } + if (defined($openeuler_release)) { + die "openEuler image creation requires dnf\n" unless $dnf_available; + $pkgmgr = "dnf"; + } my $cmd = "$pkgmgr $non_interactive -c /tmp/genimage.$$.yum.conf --installroot=$rootimg_dir/ --disablerepo=* "; if (defined($majorrel) && $majorrel > 7) { $cmd .= "--releasever=" . $majorrel . " "; $cmd .= "--setopt=module_platform_id=platform:el" . $majorrel . " "; } + if (defined($openeuler_release)) { + $cmd .= "--releasever=$openeuler_release --setopt=strict=1 '--setopt=*.skip_if_unavailable=False' '--setopt=*.gpgcheck=1' "; + } return $cmd; } +sub openeuler_release_version { + my $osver = shift; + return undef unless defined($osver) && $osver =~ /^openeuler(.+)$/; + my $release = xCAT::Utils::normalize_openeuler_version($1); + return undef unless defined($release); + $release =~ s/sp([0-9]+)$/LTS_SP$1/ or $release .= 'LTS'; + return $release; +} + +sub rpm_trusted_keys { + open(my $rpm, '-|', 'rpm', '-qa', '--qf', "%{DESCRIPTION}\n", 'gpg-pubkey*') + or die "Cannot read trusted RPM keys: $!\n"; + local $/; + my $keys = <$rpm>; + close($rpm) or die "Cannot read trusted RPM keys\n"; + die "No trusted RPM signing keys are installed\n" unless defined($keys) && length($keys); + return $keys; +} + +sub rpm_repository_config { + my ($osver, $id, $url, $gpgkey) = @_; + my $config = "[$id]\nname=$id\nbaseurl=$url\n"; + if (defined(openeuler_release_version($osver))) { + die "openEuler repositories require trusted RPM signing keys\n" + unless defined($gpgkey) && length($gpgkey); + $config .= "gpgcheck=1\ngpgkey=$gpgkey\nskip_if_unavailable=False\n\n"; + } else { + $config .= "gpgcheck=0\nskip_if_unavailable=True\n\n"; + } + return $config; +} + sub varsubinline{ my $line=shift; my $refvardict=shift; diff --git a/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.exlist b/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.exlist new file mode 100644 index 000000000..4a92e4e70 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.exlist @@ -0,0 +1,4 @@ +./boot* +./tmp* +./var/cache/dnf* +./var/cache/yum* diff --git a/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.pkglist b/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.pkglist new file mode 100644 index 000000000..869d65786 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.pkglist @@ -0,0 +1,33 @@ +@core +kernel +chrony +NetworkManager +net-tools +nfs-utils +openssh-server +openssh-clients +rsync +tar +util-linux +wget +python3 +bzip2 +bc +dracut +dracut-network +rsyslog +hostname +e2fsprogs +ethtool +parted +openssl +dhcp +bash +vim-minimal +rpm +iputils +perl +curl +kmod +findutils +which diff --git a/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.postinstall b/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.postinstall new file mode 120000 index 000000000..b8c4b83f9 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/compute.openeuler.postinstall @@ -0,0 +1 @@ +../rh/compute.rhels9.x86_64.postinstall \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/dracut b/xCAT-server/share/xcat/netboot/openeuler/dracut new file mode 120000 index 000000000..11bde8445 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/dracut @@ -0,0 +1 @@ +../rh/dracut \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/dracut_033 b/xCAT-server/share/xcat/netboot/openeuler/dracut_033 new file mode 120000 index 000000000..0e9de994a --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/dracut_033 @@ -0,0 +1 @@ +../rh/dracut_033 \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/dracut_047 b/xCAT-server/share/xcat/netboot/openeuler/dracut_047 new file mode 120000 index 000000000..fe26fce05 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/dracut_047 @@ -0,0 +1 @@ +../rh/dracut_047 \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/dracut_105 b/xCAT-server/share/xcat/netboot/openeuler/dracut_105 new file mode 120000 index 000000000..0d9ddab02 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/dracut_105 @@ -0,0 +1 @@ +../rh/dracut_105 \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/genimage b/xCAT-server/share/xcat/netboot/openeuler/genimage new file mode 120000 index 000000000..1c50b1848 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/genimage @@ -0,0 +1 @@ +../rh/genimage \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.exlist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.exlist new file mode 120000 index 000000000..a19fdbc36 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.exlist @@ -0,0 +1 @@ +compute.openeuler.exlist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.pkglist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.pkglist new file mode 100644 index 000000000..f030b3446 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.pkglist @@ -0,0 +1,3 @@ +#INCLUDE:${XCATROOT}/share/xcat/netboot/openeuler/compute.openeuler.pkglist# +perl-DBD-MySQL +perl-DBD-Pg diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.postinstall b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.postinstall new file mode 120000 index 000000000..beee5c7d5 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler.postinstall @@ -0,0 +1 @@ +compute.openeuler.postinstall \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist new file mode 120000 index 000000000..65826d98d --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist @@ -0,0 +1 @@ +../../install/openeuler/service.openeuler20.03sp4.x86_64.otherpkgs.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist new file mode 120000 index 000000000..1f30793cd --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist @@ -0,0 +1 @@ +../../install/openeuler/service.openeuler22.03sp4.x86_64.otherpkgs.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist new file mode 120000 index 000000000..2c37e9c76 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist @@ -0,0 +1 @@ +../../install/openeuler/service.openeuler24.03.ppc64le.otherpkgs.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist new file mode 120000 index 000000000..dc584609c --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist @@ -0,0 +1 @@ +../../install/openeuler/service.openeuler24.03sp1.x86_64.otherpkgs.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist new file mode 120000 index 000000000..9fffdcf55 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist @@ -0,0 +1 @@ +../../install/openeuler/service.openeuler24.03sp3.x86_64.otherpkgs.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist new file mode 120000 index 000000000..6b771d83f --- /dev/null +++ b/xCAT-server/share/xcat/netboot/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist @@ -0,0 +1 @@ +../../install/openeuler/service.openeuler24.03sp4.x86_64.otherpkgs.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/rh/dracut_047/xcatroot b/xCAT-server/share/xcat/netboot/rh/dracut_047/xcatroot index 6f9f11b28..f14ad2b34 100755 --- a/xCAT-server/share/xcat/netboot/rh/dracut_047/xcatroot +++ b/xCAT-server/share/xcat/netboot/rh/dracut_047/xcatroot @@ -112,7 +112,9 @@ elif [ -r /rootimg.cpio.gz ] || [ -r /rootimg.cpio.xz ]; then xz -cd /rootimg.cpio.xz |cpio -idum fi fi - $NEWROOT/etc/init.d/localdisk + if [ -x "$NEWROOT/etc/init.d/localdisk" ]; then + "$NEWROOT/etc/init.d/localdisk" + fi [ "$xcatdebugmode" > "0" ] && logger -t $log_label -p local4.debug "Done extracting the root filesystem..." echo "Done extracting the root filesystem..." elif [ -r /rootimg.tar.gz ] || [ -r /rootimg.tar.xz ]; then @@ -138,7 +140,9 @@ elif [ -r /rootimg.tar.gz ] || [ -r /rootimg.tar.xz ]; then tar --selinux -Jxf /rootimg.tar.xz fi fi - $NEWROOT/etc/init.d/localdisk + if [ -x "$NEWROOT/etc/init.d/localdisk" ]; then + "$NEWROOT/etc/init.d/localdisk" + fi msg="Done extracting the root filesystem." [ "$xcatdebugmode" > "0" ] && logger -t $log_label -p local4.debug "$msg" echo "$msg" diff --git a/xCAT-server/share/xcat/netboot/rh/genimage b/xCAT-server/share/xcat/netboot/rh/genimage index 452a4e3a9..1e34519fa 100755 --- a/xCAT-server/share/xcat/netboot/rh/genimage +++ b/xCAT-server/share/xcat/netboot/rh/genimage @@ -15,7 +15,7 @@ use File::Copy qw/copy cp mv move/; use File::Find; use Getopt::Long; use Cwd qw(realpath); -use File::Temp qw/mkdtemp/; +use File::Temp qw/mkdtemp tempfile/; use FindBin; use lib "$FindBin::Bin/../imgutils"; use imgutils; @@ -70,14 +70,24 @@ my $ignorekernelchk; my $noupdate; my $lock; my $envar; +my $native_bootdir; sub xdie { + unlink("$rootimg_dir/tmp/initrd.$$.gz") + if $rootimg_dir && defined(imgutils::openeuler_release_version($osver)); system("rm -rf /tmp/xcatinitrd.$$"); umount_chroot($rootimg_dir); die @_; } +sub check_package_result { + my ($rc) = @_; + return unless $rc && defined(imgutils::openeuler_release_version($osver)); + unuse_hackuname(); + xdie("RPM package manager invocation failed\n"); +} + #helper subroutine to get the major release number #of a osver @@ -99,7 +109,7 @@ sub mount_chroot { #For Redhat7 or above, mount /proc,/sys from host to avoid error messages #For Redhat7 or above, create /dev according to /dev on the host to avoid error messages #For Redhat6 or below, mount these directories might introduce error messages - if (majversion($osver) > 6) { + if (defined(imgutils::openeuler_release_version($osver)) || majversion($osver) > 6) { system("mkdir -p $rootimage_dir/proc"); system("mount proc $rootimage_dir/proc -t proc"); system("mkdir -p $rootimage_dir/sys"); @@ -143,7 +153,7 @@ sub umount_chroot { system("umount -l $mntpt >/dev/null 2>&1"); } - if (majversion($osver) > 6) { + if (defined(imgutils::openeuler_release_version($osver)) || majversion($osver) > 6) { #only remove the /dev in rootimg directory if it is not a mount point system("findmnt $rootimage_dir/dev/ >/dev/null 2>&1 || rm -rf $rootimage_dir/dev/*"); } @@ -290,6 +300,14 @@ if($onlyinitrd){ print("the root image directory \"$rootimg_dir\"does not exist, please run \"genimage $imagename\" to generate the root image directory first!\n"); exit 1; } + if (defined(imgutils::openeuler_release_version($osver))) { + my $retcode; + ($retcode, $lock) = xCAT::Utils->acquire_lock_imageop($rootimg_dir); + if ($retcode) { + print "Could not acquire image operation lock for $rootimg_dir\n"; + exit 1; + } + } }else { @yumdirs = (); @@ -343,12 +361,19 @@ if($onlyinitrd){ } my $repnum = 0; + my $gpgkey; + if (defined(imgutils::openeuler_release_version($osver))) { + my ($keyfh, $keyfile) = tempfile('genimage-rpm-keys.XXXXXX', DIR => '/tmp', UNLINK => 1); + print $keyfh imgutils::rpm_trusted_keys() or die "Cannot write RPM signing keys: $!\n"; + close($keyfh) or die "Cannot close RPM signing keys: $!\n"; + $gpgkey = "file://$keyfile"; + } foreach $srcdir (@yumdirs) { - print $yumconfig "[$osver-$arch-$repnum]\nname=$osver-$arch-$repnum\nbaseurl=file://$srcdir\ngpgcheck=0\nskip_if_unavailable=True\n\n"; + print $yumconfig imgutils::rpm_repository_config($osver, "$osver-$arch-$repnum", "file://$srcdir", $gpgkey); $repnum += 1; } foreach $srcdir (@pkgdir_internet) { - print $yumconfig "[$osver-$arch-$repnum]\nname=$osver-$arch-$repnum\nbaseurl=$srcdir\ngpgcheck=0\nskip_if_unavailable=True\n\n"; + print $yumconfig imgutils::rpm_repository_config($osver, "$osver-$arch-$repnum", $srcdir, $gpgkey); $repnum += 1; } $repnum -= 1; @@ -518,14 +543,16 @@ if($onlyinitrd){ if (($_ eq "PRE_REMOVE") || ($_ eq "POST_REMOVE") || ($_ eq "ENVLIST")) { next; } foreach(@otherpkgdir_url){ - print $yumconfig "[otherpkgs$index]\nname=otherpkgs$index\nbaseurl=$_\ngpgcheck=0\nskip_if_unavailable=True\n\n"; + print $yumconfig imgutils::rpm_repository_config($osver, "otherpkgs$index", $_, $gpgkey); $repohash{$pass}{$index} = 1; $index++; } - print $yumconfig "[otherpkgs$index]\nname=otherpkgs$index\nbaseurl=file://$srcdir_otherpkgs_local/$_\ngpgcheck=0\nskip_if_unavailable=True\n\n"; - $repohash{$pass}{$index} = 1; - $index++; + if (defined($srcdir_otherpkgs_local) || !defined(imgutils::openeuler_release_version($osver))) { + print $yumconfig imgutils::rpm_repository_config($osver, "otherpkgs$index", "file://$srcdir_otherpkgs_local/$_", $gpgkey); + $repohash{$pass}{$index} = 1; + $index++; + } my $pa = $extra_hash{$pass}{$_}; $extrapkgnames{$pass} .= " " . join(' ', @$pa); } @@ -571,6 +598,7 @@ if($onlyinitrd){ if ($rm_packges) { print "$envlist $yumcmd_remove $rm_packges\n"; $rc = system("$envlist $yumcmd_remove $rm_packges"); + check_package_result($rc); } } @@ -617,6 +645,7 @@ if($onlyinitrd){ if ($rm_packges) { print "$envlist $yumcmd_remove $rm_packges\n"; $rc = system("$envlist $yumcmd_remove $rm_packges"); + check_package_result($rc); } } $yumcmd = $yumcmd_base; @@ -629,6 +658,7 @@ if($onlyinitrd){ my $excludecmd = $kernelver ? " --exclude=kernel\*" : ""; my $yumcmd_update = $yumcmd_base . $excludecmd . " update "; $rc = system("$yumcmd_update"); + check_package_result($rc); } } @@ -693,17 +723,25 @@ chomp($kernelver); #$updates{'kernelver'} = $kernelver if ($tempfile); # copy the kernel to $destdir +my $kernel_output = "$destdir/kernel"; +if (defined(imgutils::openeuler_release_version($osver))) { + $native_bootdir = File::Temp->newdir('.genimage-boot.XXXXXX', DIR => $destdir, CLEANUP => 1); + $kernel_output = "$native_bootdir/kernel"; +} +my $kernel_copy; if (-e "$rootimg_dir/boot/vmlinux-$kernelver") { - cp("$rootimg_dir/boot/vmlinux-$kernelver", "$destdir/kernel"); + $kernel_copy = cp("$rootimg_dir/boot/vmlinux-$kernelver", $kernel_output); } elsif (-e "$rootimg_dir/boot/vmlinuz-$kernelver") { - cp("$rootimg_dir/boot/vmlinuz-$kernelver", "$destdir/kernel"); + $kernel_copy = cp("$rootimg_dir/boot/vmlinuz-$kernelver", $kernel_output); } elsif (-e "$rootimg_dir/boot/image-$kernelver") { - cp("$rootimg_dir/boot/image-$kernelver", "$destdir/kernel"); + $kernel_copy = cp("$rootimg_dir/boot/image-$kernelver", $kernel_output); } elsif (-e "$rootimg_dir/lib/modules/$kernelver/vmlinuz") { - cp("$rootimg_dir/lib/modules/$kernelver/vmlinuz", "$destdir/kernel"); + $kernel_copy = cp("$rootimg_dir/lib/modules/$kernelver/vmlinuz", $kernel_output); } else { xdie("couldn't find the kernel file matched $kernelver in $rootimg_dir/boot"); } +xdie("Error: failed to copy the kernel to $kernel_output: $!\n") + if $native_bootdir && !$kernel_copy; # Load driver update disk, and copy them to the root image my @dd_drivers = &load_dd(); @@ -782,10 +820,12 @@ if ((-d "$rootimg_dir/usr/share/dracut") or (-d "$rootimg_dir/usr/lib/dracut")) } print "Enter the dracut mode. Dracut version: $dracutver. Dracut directory: $dracutdir.\n"; } +xdie("Error: failed to generate the initial ramdisk: native image has no dracut installation\n") + if $native_bootdir && !$dracutmode; # List of internet repos to be disabled -my @internet_repo_file_list = ("oracle-linux-ol8.repo", "oracle-linux-ol9.repo", "oracle-linux-ol10.repo", "uek-ol8.repo", "uek-ol9.repo", "uek-ol10.repo", "Rocky-AppStream.repo", "Rocky-BaseOS.repo", "Rocky-Extras.repo", "rocky.repo", "rocky-extras.repo", "CentOS-Base.repo", "centos.repo", "centos-addons.repo", "almalinux-ha.repo", "almalinux-nfv.repo", "almalinux-plus.repo", "almalinux-powertools.repo", "almalinux.repo", "almalinux-resilientstorage.repo", "almalinux-rt.repo"); +my @internet_repo_file_list = ("oracle-linux-ol8.repo", "oracle-linux-ol9.repo", "oracle-linux-ol10.repo", "uek-ol8.repo", "uek-ol9.repo", "uek-ol10.repo", "Rocky-AppStream.repo", "Rocky-BaseOS.repo", "Rocky-Extras.repo", "rocky.repo", "rocky-extras.repo", "CentOS-Base.repo", "centos.repo", "centos-addons.repo", "almalinux-ha.repo", "almalinux-nfv.repo", "almalinux-plus.repo", "almalinux-powertools.repo", "almalinux.repo", "almalinux-resilientstorage.repo", "almalinux-rt.repo", "openEuler.repo"); foreach ( @internet_repo_file_list ) { if (-e "$rootimg_dir/etc/yum.repos.d/$_") { @@ -880,21 +920,23 @@ if ($tempfile) { print FILE join('::', @a) . "\n"; print FILE "The output for table updates ends here\n"; - # update the imagename for statelite - $updates_os{'provmethod'} = 'statelite'; - print FILE "The output for table updates starts here\n"; - print FILE "table::osimage\n"; - print FILE "imagename::$osver-$arch-statelite-$profile\n"; - my @a = %updates_os; - print FILE join('::', @a) . "\n"; - print FILE "The output for table updates ends here\n"; + unless (defined(imgutils::openeuler_release_version($osver))) { + # update the imagename for statelite + $updates_os{'provmethod'} = 'statelite'; + print FILE "The output for table updates starts here\n"; + print FILE "table::osimage\n"; + print FILE "imagename::$osver-$arch-statelite-$profile\n"; + my @a = %updates_os; + print FILE join('::', @a) . "\n"; + print FILE "The output for table updates ends here\n"; - print FILE "The output for table updates starts here\n"; - print FILE "table::linuximage\n"; - print FILE "imagename::$osver-$arch-statelite-$profile\n"; - my @a = %updates; - print FILE join('::', @a) . "\n"; - print FILE "The output for table updates ends here\n"; + print FILE "The output for table updates starts here\n"; + print FILE "table::linuximage\n"; + print FILE "imagename::$osver-$arch-statelite-$profile\n"; + my @a = %updates; + print FILE join('::', @a) . "\n"; + print FILE "The output for table updates ends here\n"; + } } close FILE; } @@ -905,22 +947,24 @@ if ($tempfile) { # statelite .statelite directory added here. # this is where tmpfs will be created. -mkpath "$rootimg_dir/.statelite"; # create place for NFS mounts. -mkpath "$rootimg_dir/.sllocal/localmnt"; # create place for localdisk mount -mkpath "$rootimg_dir/.sllocal/log"; # create place for localdisk log +unless (defined(imgutils::openeuler_release_version($osver))) { + mkpath "$rootimg_dir/.statelite"; # create place for NFS mounts. + mkpath "$rootimg_dir/.sllocal/localmnt"; # create place for localdisk mount + mkpath "$rootimg_dir/.sllocal/log"; # create place for localdisk log -# this script will get the directories. -# TODO: the file is re-copied in liteimg.pm -my $cwd = $FindBin::Bin; -unless (-f "$cwd/../add-on/statelite/rc.statelite") { - print "Can't find $cwd/../add-on/statelite/rc.statelite!\n"; - exit 1; + # this script will get the directories. + # TODO: the file is re-copied in liteimg.pm + my $cwd = $FindBin::Bin; + unless (-f "$cwd/../add-on/statelite/rc.statelite") { + print "Can't find $cwd/../add-on/statelite/rc.statelite!\n"; + exit 1; + } + + mkpath "$rootimg_dir/etc/init.d"; + system("cp $cwd/../add-on/statelite/rc.statelite $rootimg_dir/etc/init.d/statelite"); + system("cp $cwd/../add-on/statelite/rc.localdisk $rootimg_dir/etc/init.d/localdisk"); } -mkpath "$rootimg_dir/etc/init.d"; -system("cp $cwd/../add-on/statelite/rc.statelite $rootimg_dir/etc/init.d/statelite"); -system("cp $cwd/../add-on/statelite/rc.localdisk $rootimg_dir/etc/init.d/localdisk"); - # also need to add this file: # may have already been made into a symbolic link, if so ignore it @@ -975,7 +1019,7 @@ system("chroot $rootimg_dir depmod $kernelver"); if ($dracutmode) { mkinitrd_dracut("stateless"); - mkinitrd_dracut("statelite"); + mkinitrd_dracut("statelite") unless defined(imgutils::openeuler_release_version($osver)); } else { mkinitrd("statelite"); mkinitrd("stateless"); @@ -1166,7 +1210,9 @@ sub mkinitrd_dracut { #update etc/dracut.conf open($DRACUTCONF, '>', "$rootimg_dir/etc/dracut.conf"); my $dracutmodulelist = "xcat nfs base network kernel-modules syslog"; - if (majversion($osver) >= 10) { + if (defined(imgutils::openeuler_release_version($osver)) + ? scalar(glob($dracutmoduledir . '[0-9]*network-manager')) + : majversion($osver) >= 10) { $dracutmodulelist .= " network-manager"; } @@ -1211,7 +1257,9 @@ sub mkinitrd_dracut { chmod($perm & 07777, "$dracutmpath/installkernel"); my $dracutmodulelist = "xcat nfs base network kernel-modules syslog"; - if (majversion($osver) >= 10) { + if (defined(imgutils::openeuler_release_version($osver)) + ? scalar(glob($dracutmoduledir . '[0-9]*network-manager')) + : majversion($osver) >= 10) { $dracutmodulelist .= " network-manager"; } @@ -1262,6 +1310,30 @@ sub mkinitrd_dracut { !system("chroot $rootimg_dir dracut $additional_options -f /tmp/initrd.$$.gz $kernelver") or xdie("Error: failed to generate the initial ramdisk for $mode.\n"); umount_chroot($rootimg_dir); + if ($native_bootdir) { + move("$rootimg_dir/tmp/initrd.$$.gz", "$native_bootdir/initrd-$mode.gz") + or xdie("Error: failed to move the initial ramdisk for $mode: $!\n"); + my $old_kernel = -e "$destdir/kernel" || -l "$destdir/kernel"; + if ($old_kernel) { + link("$destdir/kernel", "$native_bootdir/previous-kernel") + or xdie("Error: failed to preserve the previous kernel: $!\n"); + } + rename("$native_bootdir/kernel", "$destdir/kernel") + or xdie("Error: failed to publish the kernel: $!\n"); + unless (rename("$native_bootdir/initrd-$mode.gz", "$destdir/initrd-$mode.gz")) { + my $error = $!; + my $restored = $old_kernel + ? rename("$native_bootdir/previous-kernel", "$destdir/kernel") + : unlink("$destdir/kernel"); + unless ($restored) { + $native_bootdir->unlink_on_destroy(0); + xdie("Error: failed to publish the initial ramdisk: $error; kernel rollback failed: $!. Boot files retained in $native_bootdir\n"); + } + xdie("Error: failed to publish the initial ramdisk for $mode: $error\n"); + } + print "the initial ramdisk for $mode is generated successfully.\n"; + return; + } print "the initial ramdisk for $mode is generated successfully.\n"; print("Move $rootimg_dir/tmp/initrd.$$.gz -> $destdir/initrd-$mode.gz"); move("$rootimg_dir/tmp/initrd.$$.gz", "$destdir/initrd-$mode.gz"); @@ -2030,6 +2102,7 @@ sub postscripts { sub using_systemd { my $os = shift; + return 1 if defined(imgutils::openeuler_release_version($os)); if ($os =~ /fedora(\d+)/) { if ($1 >= 15) { return 1;