code drop for xeon phi (mic) support phase 2. 1. Support mpss 3.1; 2. Support to install software in .filelist, rpm and simple format; 3. Support the hcp software to be installed in .filelist format by genimage command; 4. Support the nfs mount setting for mic node (base on litefile table); 5. Support Internal bridge setting for mic host
This commit is contained in:
parent
36e4842a1c
commit
9f1fd6c223
@ -6540,7 +6540,7 @@ sub scan {
|
||||
|
||||
my $output = xCAT::Utils->runxcmd({ command => ['xdsh'],
|
||||
node => $nodes,
|
||||
arg => ['/opt/intel/mic/bin/micinfo', '-listDevices'] }, $subreq, 0, 1);
|
||||
arg => ['micinfo', '-listDevices'] }, $subreq, 0, 1);
|
||||
|
||||
# parse the output from 'xdsh micinfo -listDevices'
|
||||
my %host2mic;
|
||||
|
@ -307,7 +307,7 @@ sub rinv {
|
||||
my @hosts = (keys %$host2mic);
|
||||
my $output = xCAT::Utils->runxcmd({ command => ['xdsh'],
|
||||
node => \@hosts,
|
||||
arg => ["/opt/intel/mic/bin/micinfo"]}, $subreq, 0, 1);
|
||||
arg => ["/usr/bin/micinfo"]}, $subreq, 0, 1);
|
||||
|
||||
# classify all the output with the host name
|
||||
my %outofhost;
|
||||
@ -379,6 +379,27 @@ sub copytar {
|
||||
'f=s' => \$file);
|
||||
}
|
||||
|
||||
# get the
|
||||
my ($mpssver, $targetos, $targetosver);
|
||||
my $tarfilename = basename ($file);
|
||||
if ($tarfilename =~ /mpss-([\d\.-]+)-(rhel|suse)-([\d\.-]+)\.tar/) {
|
||||
$mpssver = $1;
|
||||
$targetos = $2;
|
||||
$targetosver = $3;
|
||||
} elsif ($tarfilename =~ /mpss/) {
|
||||
if ($osname =~ /mpss-([\d\.-]+)-(rhel|suse)-([\d\.-]+)/) {
|
||||
$mpssver = $1;
|
||||
$targetos = $2;
|
||||
$targetosver = $3;
|
||||
} else {
|
||||
xCAT::MsgUtils->message("E", {error=>["The flag -n needs be specified to identify the version of mpss and target os. The value format for -n must be mpss-[mpss_versoin]-[rhel/suse]-[os_version]."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
# not for Xeon Phi
|
||||
return;
|
||||
}
|
||||
|
||||
my $installroot = "/install";
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("installdir");
|
||||
my $t_entry = $entries[0];
|
||||
@ -386,35 +407,40 @@ sub copytar {
|
||||
$installroot = $t_entry;
|
||||
}
|
||||
|
||||
my $tmpdir = "/tmp/mictmp";
|
||||
my $destdir = "$installroot/$osname";
|
||||
rmtree ($tmpdir);
|
||||
mkpath ($tmpdir);
|
||||
my $destdir = "$installroot/mpss$mpssver";
|
||||
mkpath ($destdir);
|
||||
|
||||
# creae the default dirs in the mpss image dir
|
||||
mkpath ("$destdir/common");
|
||||
mkpath ("$destdir/overlay/package");
|
||||
mkpath ("$destdir/overlay/rpm");
|
||||
`/bin/touch "$destdir/common.filelist"`;
|
||||
|
||||
# extract the files from the mpss tar file
|
||||
my $cmd = "tar xvf $file -C $tmpdir";
|
||||
my @output = xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC != 0) {
|
||||
xCAT::MsgUtils->message("E", {error=>["Error when run [$cmd], @output"], errorcode=>["1"]}, $callback);
|
||||
return 1;
|
||||
}
|
||||
#my $cmd = "tar xvf $file -C $tmpdir";
|
||||
#my @output = xCAT::Utils->runcmd($cmd, -1);
|
||||
#if ($::RUNCMD_RC != 0) {
|
||||
# xCAT::MsgUtils->message("E", {error=>["Error when run [$cmd], @output"], errorcode=>["1"]}, $callback);
|
||||
# return 1;
|
||||
#}
|
||||
|
||||
# get the rpm packages intel-mic-gpl and intel-mic-flash which include the files for root file system, flash ...
|
||||
my @micgpl = <$tmpdir/*/intel-mic-gpl*>;
|
||||
my @micflash = <$tmpdir/*/intel-mic-flash*>;
|
||||
unless (-r $micgpl[0] && -r $micflash[0]) {
|
||||
xCAT::MsgUtils->message("E", {error=>["Error: Cannot get the rpm files intel-mic-gpl or intel-mic-flash from the tar file."], errorcode=>["1"]}, $callback);
|
||||
return 1;
|
||||
}
|
||||
#my @micgpl = <$tmpdir/*/intel-mic-gpl*>;
|
||||
#my @micflash = <$tmpdir/*/intel-mic-flash*>;
|
||||
#unless (-r $micgpl[0] && -r $micflash[0]) {
|
||||
# xCAT::MsgUtils->message("E", {error=>["Error: Cannot get the rpm files intel-mic-gpl or intel-mic-flash from the tar file."], errorcode=>["1"]}, $callback);
|
||||
# return 1;
|
||||
#}
|
||||
|
||||
# extract the files from rpm packages
|
||||
$cmd = "cd $destdir; rpm2cpio $micgpl[0] | cpio -idum; rpm2cpio $micflash[0] | cpio -idum";
|
||||
@output = xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC != 0) {
|
||||
xCAT::MsgUtils->message("E", {error=>["Error when run [$cmd], @output"], errorcode=>["1"]}, $callback);
|
||||
return 1;
|
||||
}
|
||||
#$cmd = "cd $destdir; rpm2cpio $micgpl[0] | cpio -idum; rpm2cpio $micflash[0] | cpio -idum";
|
||||
#@output = xCAT::Utils->runcmd($cmd, -1);
|
||||
#if ($::RUNCMD_RC != 0) {
|
||||
# xCAT::MsgUtils->message("E", {error=>["Error when run [$cmd], @output"], errorcode=>["1"]}, $callback);
|
||||
# return 1;
|
||||
#}
|
||||
|
||||
|
||||
|
||||
# generate the image objects
|
||||
my $oitab = xCAT::Table->new('osimage');
|
||||
@ -426,14 +452,22 @@ sub copytar {
|
||||
my %values;
|
||||
$values{'imagetype'} = "linux";
|
||||
$values{'provmethod'} = "netboot";
|
||||
$values{'rootfstype'} = "ramdisk";
|
||||
$values{'description'} = "Linux for Intel mic";
|
||||
$values{'osname'} = "Linux";
|
||||
$values{'osvers'} = "mic";
|
||||
$values{'osvers'} = "mic$mpssver";
|
||||
$values{'osarch'} = "x86_64";
|
||||
$values{'profile'} = "compute";
|
||||
|
||||
my $imagename = "$osname-netboot-compute";
|
||||
# set the osdistroname attr which will be used to get the repo path for the rpm install in osimage
|
||||
my $osver;
|
||||
if ($targetos =~ /rhel/) {
|
||||
$osver = "rhels".$targetosver;
|
||||
} elsif ($targetos =~ /suse/) {
|
||||
$osver = "sles".$targetosver;
|
||||
}
|
||||
$values{'osdistroname'} = $osver."-x86_64";
|
||||
|
||||
my $imagename = "mpss$mpssver-$osver-compute";
|
||||
$oitab->setAttribs({'imagename' => $imagename}, \%values);
|
||||
|
||||
my $litab = xCAT::Table->new('linuximage');
|
||||
@ -441,13 +475,15 @@ sub copytar {
|
||||
xCAT::MsgUtils->message("E", {error=>["Error: Cannot open table linuximage."], errorcode=>["1"]}, $callback);
|
||||
return 1;
|
||||
}
|
||||
|
||||
my $otherpkgdir = "$installroot/post/otherpkgs/mic$mpssver/x86_64";
|
||||
|
||||
# set a default package list
|
||||
my $pkglist = "$::XCATROOT/share/xcat/netboot/mic/compute.pkglist";
|
||||
$litab->setAttribs({'imagename' => $imagename}, {'pkgdir' => $destdir, 'pkglist' => $pkglist});
|
||||
$litab->setAttribs({'imagename' => $imagename}, {'pkgdir' => $destdir, 'pkglist' => $pkglist, 'otherpkgdir' => $otherpkgdir});
|
||||
|
||||
xCAT::MsgUtils->message("I", {data=>["The image $imagename has been created."]}, $callback);
|
||||
rmtree ($tmpdir);
|
||||
#rmtree ($tmpdir);
|
||||
}
|
||||
|
||||
# get the console configuration for rcons:
|
||||
@ -627,7 +663,7 @@ sub nodeset {
|
||||
my $nthash = $nttab->getNodesAttribs($nodes,['provmethod']);
|
||||
foreach my $node (@$nodes) {
|
||||
unless (defined ($nthash->{$node}->[0]->{'provmethod'})) {
|
||||
xCAT::MsgUtils->message("E", {error=>["The provmethod for the node $node must be set by [nodeset <node> osimage=<image name>] or set in the provmethod attribute of the node."], errorcode=>["1"]}, $callback);
|
||||
xCAT::MsgUtils->message("E", {error=>["The <image name> must be specified in [nodeset <node> osimage=<image name>] or it must be set in the provmethod attribute before running nodeset command."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -660,6 +696,22 @@ sub nodeset {
|
||||
$osimage{$_->{'imagename'}} = $_->{'pkgdir'};
|
||||
}
|
||||
|
||||
# get the bridge configuration from nics table
|
||||
my $nicstab = xCAT::Table->new("nics");
|
||||
unless ($nicstab) {
|
||||
xCAT::MsgUtils->message("E", {error=>["Cannot open the nics table."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
# get mic mount entries from litefile table
|
||||
my $lftab = xCAT::Table->new("litefile");
|
||||
unless ($lftab) {
|
||||
xCAT::MsgUtils->message("E", {error=>["Cannot open the litefile table."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
my @lfentall = $lftab->getAttribs({'image'=>'ALL'}, 'file', 'options');
|
||||
|
||||
|
||||
# get the tftp dir and create the path for mic configuration
|
||||
my $tftpdir = "/tftpboot";
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("$tftpdir");
|
||||
@ -677,6 +729,8 @@ sub nodeset {
|
||||
#overlay=ol1
|
||||
my %imghash; # cache of osimage information
|
||||
my @hosts = (keys %$host2mic);
|
||||
# get the bridge configuration from nics table, use host as key
|
||||
my $nicshash = $nicstab->getNodesAttribs(\@hosts, ['nicips', 'nictypes']);
|
||||
foreach my $host (@hosts) {
|
||||
my @cfgfile;
|
||||
push @cfgfile, "#XCAT MIC CONFIGURATION FILE#";
|
||||
@ -696,7 +750,7 @@ sub nodeset {
|
||||
# and make sure the osimage which set to the mic shold be same for all the mics on one host
|
||||
if ($osimg) {
|
||||
if ($osimg ne $nthash->{$micname}->[0]->{'provmethod'}) {
|
||||
xCAT::MsgUtils->message("E", {error=>["The provmethod for the nodes in the same host should be same."], errorcode=>["1"]}, $callback);
|
||||
xCAT::MsgUtils->message("E", {error=>["The provmethod for the mic nodes which located in the same host should be same."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@ -721,6 +775,24 @@ sub nodeset {
|
||||
return;
|
||||
}
|
||||
|
||||
# get the bridge configuration
|
||||
my ($brgip, $brgtype);
|
||||
if (defined ($nicshash->{$host}) && defined ($nicshash->{$host}->[0]->{'nicips'})) {
|
||||
foreach (split(/,/, $nicshash->{$host}->[0]->{'nicips'})) {
|
||||
if (/$micbrg!(.+)/) {
|
||||
$brgip = $1;
|
||||
}
|
||||
}
|
||||
push @cfgfile, "brgip=$brgip";
|
||||
|
||||
foreach (split(/,/, $nicshash->{$host}->[0]->{'nictypes'})) {
|
||||
if (/$micbrg!(.+)/) {
|
||||
$brgtype = $1;
|
||||
}
|
||||
}
|
||||
push @cfgfile, "brgtype=$brgtype";
|
||||
}
|
||||
|
||||
# generate the mic specific entry in the configuration file
|
||||
my $micattrs = "$micid:ip=$micip|br=$micbrg|name=$micname";
|
||||
if (defined ($michash->{$micname}->[0]->{'onboot'})) {
|
||||
@ -735,17 +807,61 @@ sub nodeset {
|
||||
push @cfgfile, "imgpath=$osimage{$osimg}";
|
||||
|
||||
# get all the overlay entries for the osimage and do the cache for image
|
||||
# search all the dir in the overlay dir execpt the system dir (system dir includes the files
|
||||
# search all the dir in the /install/<image>/overlay dir, the dir tree in 'overlay' should be following:
|
||||
# |--mnt
|
||||
# | `--system (files for system boot)
|
||||
# | |--common.filelist
|
||||
# | `--common
|
||||
# | `--overlay
|
||||
# | `--overlay
|
||||
# | `--rpm
|
||||
# | `--simple
|
||||
# | |--simple.cfg (the file must be multiple lines of 'a->b' format; 'a' is dir name in simple/, 'b' is the path on mic for 'a'
|
||||
# | `--package
|
||||
# | |--the base file for fs
|
||||
# | `--opt/mic
|
||||
# | |--yy.filelist
|
||||
# | `--yy
|
||||
# | |--xx.filelist
|
||||
# | `--xx
|
||||
#the system dir (system dir includes the files
|
||||
# which generated by genimage command, and will be copied to mic osimage separated)
|
||||
if (! -d "$osimage{$osimg}/system") {
|
||||
xCAT::MsgUtils->message("E", {error=>["Missed system directory in $osimage{$osimg}. Did you miss to run genimage command?"], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
if (defined ($imghash{$osimg}{'ollist'})) {
|
||||
push @cfgfile, "overlay=$imghash{$osimg}{'ollist'}";
|
||||
} else {
|
||||
my @overlays = <$osimage{$osimg}/opt/intel/mic/filesystem/overlay/*>;
|
||||
my @items = <$osimage{$osimg}/overlay/*>;
|
||||
my $ollist; # overlay list
|
||||
foreach my $obj (@overlays) {
|
||||
foreach my $obj (@items) {
|
||||
my $objname = basename($obj);
|
||||
if (-d $obj && $objname ne "system") {
|
||||
$ollist .= ",$objname";
|
||||
if (-d $obj) {
|
||||
if ($objname eq "rpm") {
|
||||
$ollist .= ",rpm:$objname";
|
||||
} elsif ($objname eq "simple") {
|
||||
if (-f "$osimage{$osimg}/overlay/simple/simple.cfg") {
|
||||
open (SIMPLE, "<$osimage{$osimg}/overlay/simple/simple.cfg");
|
||||
while (<SIMPLE>) {
|
||||
if (/(.+)->(.+)/) {
|
||||
$ollist .= ",simple:$_";
|
||||
}
|
||||
}
|
||||
}
|
||||
} elsif ($objname eq "package") {
|
||||
my @pfl = <$osimage{$osimg}/overlay/package/opt/mic/*.filelist>;
|
||||
foreach my $filelist (@pfl) {
|
||||
$filelist = basename($filelist);
|
||||
if ($filelist =~ /(.+)\.filelist/) {
|
||||
$ollist .= ",pfilelist:$1";
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($objname =~ /(.+)\.filelist/) {
|
||||
$ollist .= ",filelist:$1";
|
||||
}
|
||||
}
|
||||
}
|
||||
$ollist =~ s/^,//;
|
||||
@ -754,6 +870,16 @@ sub nodeset {
|
||||
push @cfgfile, "overlay=$ollist";
|
||||
}
|
||||
|
||||
# generate the nfs mount entries for mic node
|
||||
my @lfentimg = $lftab->getAttribs({'image'=>$osimg}, 'file', 'options');
|
||||
foreach my $ent (@lfentall, @lfentimg) {
|
||||
if (defined ($ent->{'options'}) && $ent->{'options'} eq "micmount") {
|
||||
if (defined ($ent->{'file'})) {
|
||||
push @cfgfile, "micmount=$ent->{file}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (open (CFG, ">$tftpdir/xcat/miccfg/miccfg.$host")) {
|
||||
foreach (@cfgfile) {
|
||||
print CFG $_."\n";
|
||||
@ -763,6 +889,7 @@ sub nodeset {
|
||||
xCAT::MsgUtils->message("E", {error=>["Cannot open the file $tftpdir/xcat/miccfg/miccfg.$host to write."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# run the cmd on the host to configure the mic
|
||||
|
@ -20,7 +20,7 @@ $| = 1;
|
||||
my $tmppath = "/tmp/mictmp";
|
||||
my $logpath = "/var/log/xcat/";
|
||||
my $logfile = "$logpath/configmic.log";
|
||||
my $micmnt = "/opt/intel/mic/mnt";
|
||||
my $micmnt = "/var/mpss/mnt";
|
||||
|
||||
mkpath $tmppath;
|
||||
mkpath $micmnt;
|
||||
@ -92,6 +92,9 @@ my %miccfg;
|
||||
my $miclist;
|
||||
my $overlay;
|
||||
my $ospath;
|
||||
my $brgname;
|
||||
my $brgip;
|
||||
my $brgtype;
|
||||
while (<CFGFILE>) {
|
||||
if (/(\d+):(.*)/) {
|
||||
my $deviceid = $1;
|
||||
@ -99,13 +102,24 @@ while (<CFGFILE>) {
|
||||
foreach (@params) {
|
||||
my ($n, $v) = split (/=/, $_);
|
||||
$miccfg{$deviceid}{$n} = $v;
|
||||
if ($n eq 'br') {
|
||||
$brgname = $v;
|
||||
}
|
||||
}
|
||||
} elsif (/^miclist=(.*)/) {
|
||||
$miclist = $1;
|
||||
} elsif (/^overlay=(.*)/) {
|
||||
$overlay = $1;
|
||||
} elsif (/^imgpath=(.*)/) {
|
||||
$ospath= $1;
|
||||
$ospath = $1;
|
||||
} elsif (/^brgip=(.*)/) {
|
||||
$brgip = $1;
|
||||
} elsif (/^brgtype=(.*)/) {
|
||||
$brgtype = $1;
|
||||
} elsif (/^micmount=(.+)/) {
|
||||
if ($1 =~ /(.+):(.+)/) {
|
||||
$miccfg{'micmount'}{$1} = $2;
|
||||
}
|
||||
}
|
||||
}
|
||||
close (CFGFILE);
|
||||
@ -113,8 +127,8 @@ close (CFGFILE);
|
||||
$miclist =~ s/,/ /g;
|
||||
|
||||
# add the mount entry for mounting of root fs from master to /etc/fstab
|
||||
# e.g. mount $master:/install/mpss3 /opt/intel/mic/mnt
|
||||
$cmd = "grep $master:$ospath $micmnt /etc/fstab ";
|
||||
# e.g. mount $master:/install/mpss3 /var/mpss/mnt
|
||||
$cmd = "grep \'$master:$ospath \' $micmnt /etc/fstab ";
|
||||
($rc, $output) = runsyscmd ($cmd);
|
||||
if ($rc) {
|
||||
# not found the exact mount entry
|
||||
@ -140,9 +154,33 @@ if ($rc) {
|
||||
runsyscmd ($cmd);
|
||||
}
|
||||
|
||||
# the dir structure in mount opint 'mnt'
|
||||
# |--mnt
|
||||
# | `--system (files for system boot)
|
||||
# | |--common.filelist
|
||||
# | `--common
|
||||
# | `--overlay
|
||||
# | `--overlay
|
||||
# | `--rpm
|
||||
# | `--simple
|
||||
# | |--simple.cfg (the file must be multiple lines of 'a->b' format; 'a' is dir name in simple/, 'b' is the path on mic for 'a'
|
||||
# | `--package
|
||||
# | |--the base file for fs
|
||||
# | `--opt/mic
|
||||
# | |--yy.filelist
|
||||
# | `--yy
|
||||
# | |--xx.filelist
|
||||
# | `--xx
|
||||
|
||||
# make sure the remote files are accessable
|
||||
unless (-r "$micmnt/opt/intel/mic/filesystem/base.filelist") {
|
||||
outputmsg("Error: cannot access the $micmnt/opt/intel/mic/filesystem/base.filelist\n", 8);
|
||||
unless (-r "$micmnt/common.filelist") {
|
||||
outputmsg("Error: cannot access the $micmnt/common.filelist\n", 8);
|
||||
}
|
||||
|
||||
# initialize mic card if it has not been
|
||||
if (! -f "/etc/mpss/default.conf") {
|
||||
$cmd = "micctrl --initdefaults";
|
||||
runsyscmd ($cmd, "Error: failed to initiate the mic configuration file.\n", 200)
|
||||
}
|
||||
|
||||
# start to configure the mic
|
||||
@ -162,12 +200,12 @@ while ($i > 0) {
|
||||
$i--;
|
||||
}
|
||||
|
||||
# remove the mic configuration file
|
||||
unlink ("/etc/sysconfig/mic/default.conf");
|
||||
# remove the mic configuration files and source files for ramfs, them will be recreated base on setting
|
||||
unlink ("/etc/mpss/default.conf");
|
||||
foreach my $mic (split (/ /, $miclist)) {
|
||||
unlink ("/etc/sysconfig/mic/$mic.conf");
|
||||
unlink ("/opt/intel/mic/filesystem/$mic.filelist");
|
||||
rmtree ("/opt/intel/mic/filesystem/$mic");
|
||||
unlink ("/etc/mpss/$mic.conf");
|
||||
unlink ("/var/mpss/$mic.filelist");
|
||||
rmtree ("/var/mpss/$mic");
|
||||
}
|
||||
|
||||
# reset the configuration to default
|
||||
@ -175,34 +213,79 @@ $cmd = "micctrl --initdefaults $miclist";
|
||||
runsyscmd ($cmd, "Error: failed to initiate the mic devices.\n", 200);
|
||||
|
||||
# configure the base dir
|
||||
$cmd = "micctrl --basedir=/opt/intel/mic/mnt/opt/intel/mic/filesystem/base --list=/opt/intel/mic/mnt/opt/intel/mic/filesystem/base.filelist $miclist";
|
||||
runsyscmd ($cmd, "Error: failed to change the base dir for mic file system..\n", 101);
|
||||
#$cmd = "micctrl --basedir=/opt/intel/mic/mnt/opt/intel/mic/filesystem/base --list=/opt/intel/mic/mnt/opt/intel/mic/filesystem/base.filelist $miclist";
|
||||
#runsyscmd ($cmd, "Error: failed to change the base dir for mic file system..\n", 101);
|
||||
|
||||
# configure the commondir
|
||||
$cmd = "micctrl --commondir=/opt/intel/mic/mnt/opt/intel/mic/filesystem/common --list=/opt/intel/mic/mnt/opt/intel/mic/filesystem/common.filelist $miclist";
|
||||
runsyscmd ($cmd, "Error: failed to change the common dir for mic file system.\n", 102);
|
||||
$cmd = "micctrl --commondir=$micmnt/common --list=$micmnt/common.filelist $miclist";
|
||||
runsyscmd ($cmd, "Error: failed to set the common dir for mic file system.\n", 102);
|
||||
|
||||
# configure the overlay
|
||||
# configure the overlay file system
|
||||
my @ols = split (/,/, $overlay);
|
||||
foreach (@ols) {
|
||||
$cmd = "micctrl --overlay=filelist --state=on --source=/opt/intel/mic/mnt/opt/intel/mic/filesystem/overlay/$_ --target=/opt/intel/mic/mnt/opt/intel/mic/filesystem/overlay/$_.filelist $miclist";
|
||||
runsyscmd ($cmd, "Error: failed to change the overlay dir for mic file system.\n", 103);
|
||||
if (/^filelist:(.+)/) {
|
||||
$cmd = "micctrl --overlay=Filelist --source=$micmnt/overlay/$1/ --target=$micmnt/overlay/$1.filelist --state=on $miclist";
|
||||
} elsif (/^pfilelist:(.+)/) {
|
||||
$cmd = "micctrl --overlay=Filelist --source=$micmnt/overlay/package/ --target=$micmnt/overlay/package/opt/mic/$1.filelist --state=on $miclist";
|
||||
} elsif (/^rpm:(.+)/) {
|
||||
$cmd = "micctrl --overlay=RPM --source=$micmnt/overlay/rpm/ --state=on $miclist";
|
||||
} elsif (/^simple:(.+)->(.+)/) {
|
||||
$cmd = "micctrl --overlay=Simple --source=$micmnt/overlay/simple/$1 --target=$2 --state=on $miclist";
|
||||
}
|
||||
|
||||
runsyscmd ($cmd, "Error: failed to set the overlay dir for mic file system.\n", 103);
|
||||
}
|
||||
|
||||
# configure bridge for mic
|
||||
my ($netbit, $brc, $mtu);
|
||||
if ($brgtype && $brgtype =~ /Internal/i) {
|
||||
$cmd = "micctrl --addbridge=$brgname --type=Internal --ip=$brgip";
|
||||
runsyscmd ($cmd, "Error: failed to add bridge for mic.\n", 111);
|
||||
} else {
|
||||
# for External bridge, it must has been set up correctly
|
||||
# get the ip of the bridge
|
||||
$cmd = "ip -4 addr show";
|
||||
($rc, $output) = runsyscmd ($cmd);
|
||||
$cmd = "ip -4 route show";
|
||||
my ($rc2, $output2) = runsyscmd ($cmd);
|
||||
foreach (@$output) {
|
||||
if (/inet\s+([\d\.]+)\/(\d+)\s+brd\s+([\d\.]+) scope global $brgname/) {
|
||||
$brgip = $1;
|
||||
$netbit = $2;
|
||||
$brc = $3;
|
||||
last;
|
||||
} elsif (/\d+:\s+$brgname:.*mtu\s+(\d+)/) {
|
||||
$mtu = $1;
|
||||
}
|
||||
}
|
||||
|
||||
unless ($brgip && $netbit && $brc) {
|
||||
outputmsg("Error: failed to get ip for the bridge $brgname.\n", 110);
|
||||
}
|
||||
|
||||
# add the bridge to mic configuration
|
||||
# since the micctrl --addbridge=<brgname> --type=external --ip=<ip of brg> --netbits=8 does not
|
||||
# work with '--netbis=8', the bridge configuration has been done by changing cfg file directly.
|
||||
#$cmd = "echo \"Bridge $brg External $brip $netbit $mtu\" >> /etc/sysconfig/mic/default.conf";
|
||||
#runsyscmd ($cmd);
|
||||
$cmd = "micctrl --addbridge=$brgname --type=external --ip=$brgip --netbits=$netbit --mtu=$mtu";
|
||||
runsyscmd ($cmd, "Error: failed to add bridge for mic.\n", 111);
|
||||
}
|
||||
|
||||
# do the mic specific configuration
|
||||
$cmd = "ip -4 addr show";
|
||||
($rc, $output) = runsyscmd ($cmd);
|
||||
$cmd = "ip -4 route show";
|
||||
my ($rc2, $output2) = runsyscmd ($cmd);
|
||||
foreach my $micid (keys %miccfg) {
|
||||
if ($micid !~ /^\d*$/) {
|
||||
# not mic specific, return
|
||||
next;
|
||||
}
|
||||
my $micname = $miccfg{$micid}{'name'};
|
||||
# set the boot device to be staticramfs so that the osimage don't need to generated for every boot
|
||||
$cmd = "micctrl --rootdev=StaticRamFS --target=/opt/intel/mic/filesystem/$micname.image mic$micid";
|
||||
runsyscmd ($cmd, "Error: failed to set root image for mic.\n", 104);
|
||||
#$cmd = "micctrl --rootdev=StaticRamFS --target=/opt/intel/mic/filesystem/$micname.image mic$micid";
|
||||
#runsyscmd ($cmd, "Error: failed to set root image for mic.\n", 104);
|
||||
|
||||
# set the linux kernel location
|
||||
$cmd = "micctrl --osimage=$micmnt/lib/firmware/mic/uos.img mic$micid";
|
||||
runsyscmd ($cmd, "Error: failed to linux kernle location for mic.\n", 105);
|
||||
#$cmd = "micctrl --osimage=$micmnt/lib/firmware/mic/uos.img mic$micid";
|
||||
#runsyscmd ($cmd, "Error: failed to linux kernle location for mic.\n", 105);
|
||||
|
||||
# set the autoboot
|
||||
if ($miccfg{$micid}{'onboot'} =~ /no/i) {
|
||||
@ -213,79 +296,47 @@ foreach my $micid (keys %miccfg) {
|
||||
runsyscmd ($cmd, "Error: failed to set the autoboot for mic.\n", 106);
|
||||
|
||||
# set the hostname
|
||||
$cmd = "sed \"s/Hostname .*/Hostname \"$micname\"/\" /etc/sysconfig/mic/mic$micid.conf > $tmppath/mic$micid.conf";
|
||||
$cmd = "sed \"s/Hostname .*/Hostname \"$micname\"/\" /etc/mpss/mic$micid.conf > $tmppath/mic$micid.conf";
|
||||
runsyscmd ($cmd, "Error: failed to set hostname for mic.\n", 107);
|
||||
copy ("$tmppath/mic$micid.conf", "/etc/sysconfig/mic/mic$micid.conf");
|
||||
copy ("$tmppath/mic$micid.conf", "/etc/mpss/mic$micid.conf");
|
||||
|
||||
# configure the Verbose log
|
||||
if ($miccfg{$micid}{'vlog'} =~ /yes/i) {
|
||||
$cmd = "sed \"s/VerboseLogging .*/VerboseLogging \"Enabled\"/\" /etc/sysconfig/mic/mic$micid.conf > $tmppath/mic$micid.conf";
|
||||
$cmd = "sed \"s/VerboseLogging .*/VerboseLogging \"Enabled\"/\" /etc/mpss/mic$micid.conf > $tmppath/mic$micid.conf";
|
||||
runsyscmd ($cmd, "Error: failed to set Verbose log for mic.\n", 108);
|
||||
copy ("$tmppath/mic$micid.conf", "/etc/sysconfig/mic/mic$micid.conf");
|
||||
copy ("$tmppath/mic$micid.conf", "/etc/mpss/mic$micid.conf");
|
||||
}
|
||||
|
||||
# configure the bridge and ip for the mic
|
||||
# get the ip of the bridge
|
||||
my $brg = $miccfg{$micid}{br};
|
||||
my ($brip, $netbit, $brc, $mtu);
|
||||
foreach (@$output) {
|
||||
if (/inet\s+([\d\.]+)\/(\d+)\s+brd\s+([\d\.]+) scope global $brg/) {
|
||||
$brip = $1;
|
||||
$netbit = $2;
|
||||
$brc = $3;
|
||||
last;
|
||||
} elsif (/\d+:\s+$brg:.*mtu\s+(\d+)/) {
|
||||
$mtu = $1;
|
||||
}
|
||||
}
|
||||
|
||||
unless ($brip && $netbit && $brc) {
|
||||
outputmsg("Error: failed to get ip for the bridge $brg.\n", 110);
|
||||
}
|
||||
|
||||
# add the bridge to mic configuration
|
||||
# since the micctrl --addbridge=<brgname> --type=external --ip=<ip of brg> --netbits=8 does not
|
||||
# work with '--netbis=8', the bridge configuration has been done by changing cfg file directly.
|
||||
$cmd = "echo \"Bridge $brg External $brip $netbit $mtu\" >> /etc/sysconfig/mic/default.conf";
|
||||
runsyscmd ($cmd);
|
||||
|
||||
# configre network for each mic
|
||||
$cmd = "micctrl --network=static --bridge=".$brg." --ip=".$miccfg{$micid}{ip}." mic$micid";
|
||||
# configure network for each mic
|
||||
$cmd = "micctrl --network=static --bridge=".$miccfg{$micid}{br}." --ip=".$miccfg{$micid}{ip}." mic$micid";
|
||||
runsyscmd ($cmd, "Error: failed to generate IP configuration for mic.\n", 104);
|
||||
|
||||
# configure nfs mount for each mic
|
||||
foreach my $msrc (keys %{$miccfg{'micmount'}}) {
|
||||
$cmd = "micctrl --addnfs=$brgip:/$msrc --dir=$miccfg{micmount}{$msrc} mic$micid";
|
||||
runsyscmd ($cmd, "Error: failed to add nfs mount for mic.\n", 104);
|
||||
}
|
||||
|
||||
# take the configuration to effect
|
||||
$cmd = "micctrl --resetconfig mic$micid";
|
||||
runsyscmd ($cmd, "Error: failed to spread the configuration.\n", 201);
|
||||
|
||||
# get the gateway of the bridge
|
||||
my $netmask = 2**$netbit - 1 << (32 - $netbit);
|
||||
my $brnet = unpack("N", inet_aton($brip));
|
||||
$brnet &= $netmask;
|
||||
$brnet = inet_ntoa(pack("N", $brnet));
|
||||
my $brgw;
|
||||
foreach (@$output2) {
|
||||
if (/$brnet\/$netbit\s+dev\s+$brg.*src\s+([\d\.]+)/) {
|
||||
$brgw = $1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
# configure the mic interface to the real interface cfg file instead of mic cfg file
|
||||
# this also because the defect of intel tool so that we have to do it separated
|
||||
my @ifcfg = ("IPADDR=$miccfg{$micid}{ip}\n", "GATEWAY=$brgw\n", "PREFIX=$netbit\n");
|
||||
unless (open (IFCFG, ">/opt/intel/mic/filesystem/mic$micid/etc/sysconfig/network/ifcfg-mic0")) {
|
||||
outputmsg ("Error: cannot open ifcfg-mic$micid\n", 111);
|
||||
}
|
||||
print IFCFG @ifcfg;
|
||||
close (IFCFG);
|
||||
# back up the /etc/passwd and /etc/shadow which generated by 'micctrl --initdefaults'
|
||||
system ("/bin/cp -rf /var/mpss/mic$micid/etc/passwd /tmp/mictmp/passwd");
|
||||
system ("/bin/cp -rf /var/mpss/mic$micid/etc/shadow /tmp/mictmp/shadow");
|
||||
|
||||
# copy the system files which generated by genimage to the micdir
|
||||
# e.g. /etc/hosts /etc/passwd ...
|
||||
my $src = "$micmnt/opt/intel/mic/filesystem/overlay/system/*";
|
||||
my $dst = "/opt/intel/mic/filesystem/mic$micid";
|
||||
my $src = "$micmnt/system/*";
|
||||
my $dst = "/var/mpss/mic$micid";
|
||||
|
||||
$cmd = "/bin/cp -rf $src $dst";
|
||||
runsyscmd ($cmd, "Error: failed to copy the overlay dir.\n", 300);
|
||||
|
||||
# append /etc/passwd and /etc/shadow which generated by 'micctrl --initdefaults'
|
||||
system ("/bin/grep micuser /tmp/mictmp/passwd >> /var/mpss/mic$micid/etc/passwd");
|
||||
system ("/bin/grep micuser /tmp/mictmp/shadow >> /var/mpss/mic$micid/etc/shadow");
|
||||
|
||||
# generate the static root file system in ramdisk format
|
||||
$cmd = "micctrl --updateramfs mic$micid";
|
||||
runsyscmd ($cmd, "Error: failed to generate the static ramfs.\n", 301);
|
||||
@ -308,6 +359,10 @@ while ($i > 0) {
|
||||
|
||||
# notice nodeset command, the configuratoin has been done
|
||||
foreach my $micid (keys %miccfg) {
|
||||
if ($micid !~ /^\d*$/) {
|
||||
# not mic specific, return
|
||||
next;
|
||||
}
|
||||
outputmsg ("MICMSG:$miccfg{$micid}{'name'}: Done\n");
|
||||
}
|
||||
|
||||
|
@ -20,8 +20,12 @@ $| = 1;
|
||||
my $tmppath = "/tmp/mictmp";
|
||||
my $logpath = "/var/log/xcat/";
|
||||
my $logfile = "$logpath/flash.log";
|
||||
my $micmnt = "/opt/intel/mic/mnt";
|
||||
my $flashpath = "$micmnt/opt/intel/mic/flash";
|
||||
my $micmnt = "/var/mpss/mnt";
|
||||
my $flashpath = "$micmnt/usr/share/mpss/flash";
|
||||
|
||||
if (! -d "$flashpath") {
|
||||
$flashpath = "/usr/share/mpss/flash";
|
||||
}
|
||||
|
||||
mkpath $tmppath;
|
||||
mkpath $micmnt;
|
||||
@ -110,8 +114,8 @@ close (CFGFILE);
|
||||
$miclist =~ s/,/ /g;
|
||||
|
||||
# add the mount entry for mounting of root fs from master to /etc/fstab
|
||||
# e.g. mount $master:/install/mpss3 /opt/intel/mic/mnt
|
||||
$cmd = "grep $master:$ospath $micmnt /etc/fstab ";
|
||||
# e.g. mount $master:/install/mpss3 /var/mpss/mnt
|
||||
$cmd = "grep \'$master:$ospath \' $micmnt /etc/fstab ";
|
||||
($rc, $output) = runsyscmd ($cmd);
|
||||
if ($rc) {
|
||||
# not found the exact mount entry
|
||||
@ -155,7 +159,7 @@ foreach my $micid (keys %miccfg) {
|
||||
$micidlist =~ s/^,//;
|
||||
|
||||
# do the flash
|
||||
$cmd = "/opt/intel/mic/bin/micflash -update $flashpath -device $micidlist";
|
||||
$cmd = "micflash -update $flashpath -device $micidlist";
|
||||
($rc, $output) = runsyscmd ($cmd);
|
||||
|
||||
# generate the output messages
|
||||
|
@ -14,19 +14,193 @@ use strict;
|
||||
use File::Path;
|
||||
use File::Basename;
|
||||
use File::Copy;
|
||||
use File::Find;
|
||||
use Getopt::Long;
|
||||
Getopt::Long::Configure("bundling");
|
||||
Getopt::Long::Configure("pass_through");
|
||||
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin/../imgutils";
|
||||
use imgutils;
|
||||
use xCAT::Table;
|
||||
|
||||
|
||||
my $arch;
|
||||
my $profile;
|
||||
my $osver;
|
||||
my $pkglist;
|
||||
my $srcdir;
|
||||
my $otherpkglist;
|
||||
my $rootimg_dir;
|
||||
my $srcdir_otherpkgs;
|
||||
my $tempfile;
|
||||
GetOptions(
|
||||
'a=s' => \$arch,
|
||||
'p=s' => \$profile,
|
||||
'o=s' => \$osver,
|
||||
'pkglist=s' => \$pkglist,
|
||||
'srcdir=s' => \$srcdir,
|
||||
'otherpkglist=s' => \$otherpkglist,
|
||||
'otherpkgdir=s' => \$srcdir_otherpkgs,
|
||||
'tempfile=s' =>\$tempfile,
|
||||
);
|
||||
|
||||
my $fsdir = "$srcdir/opt/intel/mic/filesystem";
|
||||
my $systemdir = "$fsdir/overlay/system";
|
||||
$rootimg_dir = "$srcdir/overlay/package/";
|
||||
my @yumdirs;
|
||||
my $imagename;
|
||||
if (@ARGV > 0) {
|
||||
$imagename=$ARGV[0];
|
||||
}
|
||||
unless ($imagename) {
|
||||
print "Error: osimage name needs be specified.\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
sub isyumdir {
|
||||
if ($File::Find::name =~ /\/repodata$/) {
|
||||
my $location = $File::Find::name;
|
||||
$location =~ s/\/repodata$//;
|
||||
push @yumdirs,$location;
|
||||
}
|
||||
}
|
||||
|
||||
if ($otherpkglist) {
|
||||
|
||||
# get the distroname
|
||||
my $oitab = xCAT::Table->new('osimage');
|
||||
unless ($oitab) {
|
||||
print "Error: Cannot open table osimage.\n";
|
||||
return 1;
|
||||
}
|
||||
# generate the yum configuration file
|
||||
|
||||
my $aiddistro;
|
||||
my $oient = $oitab->getAttribs({'imagename'=>$imagename}, 'osdistroname');
|
||||
if ($oient && $oient->{'osdistroname'}) {
|
||||
$aiddistro = $oient->{'osdistroname'};
|
||||
}
|
||||
|
||||
my $distrotab = xCAT::Table->new('osdistro');
|
||||
unless ($distrotab) {
|
||||
print "Error: Cannot open table osdistro.\n";
|
||||
return 1;
|
||||
}
|
||||
my $aiddistrodir;
|
||||
my $distroent = $distrotab->getAttribs({'osdistroname'=>$aiddistro}, 'dirpaths');
|
||||
if ($distroent && $distroent->{'dirpaths'}) {
|
||||
$aiddistrodir = $distroent->{'dirpaths'}
|
||||
}
|
||||
|
||||
my @pkgdirs = split(",", $aiddistrodir);
|
||||
foreach my $dir (@pkgdirs) {
|
||||
find(\&isyumdir, <$dir/>);
|
||||
if (!grep /$dir/, @yumdirs) {
|
||||
print "The repository for $dir should be created before running the genimge. Try to run [createrepo $dir].\n";
|
||||
}
|
||||
}
|
||||
|
||||
my $yumconfig;
|
||||
open($yumconfig,">","/tmp/genimage.$$.yum.conf");
|
||||
my $repnum=0;
|
||||
foreach $srcdir (@yumdirs) {
|
||||
print $yumconfig "[$aiddistro-$repnum]\nname=$aiddistro-$repnum\nbaseurl=file://$srcdir\ngpgpcheck=0\n\n";
|
||||
$repnum += 1;
|
||||
}
|
||||
$repnum-=1;
|
||||
close($yumconfig);
|
||||
mkpath "$rootimg_dir/etc";
|
||||
|
||||
my %extra_hash = imgutils::get_package_names($otherpkglist);
|
||||
my %extrapkgnames;
|
||||
|
||||
my %repohash;
|
||||
if (keys(%extra_hash) > 0) {
|
||||
open($yumconfig,">>","/tmp/genimage.$$.yum.conf");
|
||||
my $index=1;
|
||||
my $pass;
|
||||
foreach $pass (sort {$a <=> $b} (keys(%extra_hash))) {
|
||||
foreach (keys(%{$extra_hash{$pass}})) {
|
||||
if (($_ eq "PRE_REMOVE") || ($_ eq "POST_REMOVE") || ($_ eq "ENVLIST")) { next;}
|
||||
print $yumconfig "[otherpkgs$index]\nname=otherpkgs$index\nbaseurl=file://$srcdir_otherpkgs/$_\ngpgpcheck=0\n\n";
|
||||
$repohash{$pass}{$index} = 1;
|
||||
$index++;
|
||||
my $pa=$extra_hash{$pass}{$_};
|
||||
$extrapkgnames{$pass} .= " " . join(' ', @$pa);
|
||||
}
|
||||
}
|
||||
close($yumconfig);
|
||||
$index--;
|
||||
my $yumcmd_base = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$rootimg_dir/ --disablerepo=* ";
|
||||
foreach (0..$repnum) {
|
||||
$yumcmd_base .= "--enablerepo=$aiddistro-$_ ";
|
||||
}
|
||||
|
||||
foreach $pass (sort {$a <=> $b} (keys(%extra_hash))) {
|
||||
my $yumcmd = $yumcmd_base;
|
||||
foreach my $repo_index ( keys %{$repohash{$pass}} ) {
|
||||
$yumcmd .= "--enablerepo=otherpkgs$repo_index ";
|
||||
}
|
||||
|
||||
system("$yumcmd clean all");
|
||||
|
||||
my $envlist;
|
||||
if(exists($extra_hash{$pass}{ENVLIST})){
|
||||
$envlist = join(' ', @{$extra_hash{$pass}{ENVLIST}});
|
||||
}
|
||||
# remove the packages that are specified in the otherpkgs.list files with leading '-'
|
||||
my $yumcmd_remove= "$yumcmd erase ";
|
||||
if (exists ($extra_hash{$pass}{'PRE_REMOVE'})) {
|
||||
my $pa=$extra_hash{$pass}{'PRE_REMOVE'};
|
||||
my $rm_packges= join(' ', @$pa);
|
||||
if ($rm_packges) {
|
||||
print "$envlist $yumcmd_remove $rm_packges\n";
|
||||
my $rc = system("$envlist $yumcmd_remove $rm_packges");
|
||||
if ($rc) {
|
||||
print "yum invocation failed\n";
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# install extra packages
|
||||
$yumcmd .= "install ";
|
||||
# append extra pkg names to yum command
|
||||
if ($extrapkgnames{$pass}) {
|
||||
$yumcmd .= " $extrapkgnames{$pass} ";
|
||||
$yumcmd =~ s/ $/\n/;
|
||||
|
||||
print "$envlist $yumcmd\n";
|
||||
my $rc = system("$envlist $yumcmd");
|
||||
if ($rc) {
|
||||
print "yum invocation failed\n";
|
||||
exit 1;
|
||||
}
|
||||
} else {
|
||||
print "No Packages marked for install\n";
|
||||
}
|
||||
|
||||
# remove the packages that are specified in the otherpkgs.list files with leading '--'
|
||||
if (exists ($extra_hash{$pass}{'POST_REMOVE'})) {
|
||||
my $pa=$extra_hash{$pass}{'POST_REMOVE'};
|
||||
my $rm_packges= join(' ', @$pa);
|
||||
if ($rm_packges) {
|
||||
print "$envlist $yumcmd_remove $rm_packges\n";
|
||||
my $rc = system("$envlist $yumcmd_remove $rm_packges");
|
||||
if ($rc) {
|
||||
print "yum invocation failed\n";
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
my $fsdir = "$srcdir/";
|
||||
my $systemdir = "$fsdir/system";
|
||||
mkpath ($systemdir);
|
||||
|
||||
# this is the file list which includes the files which should be copied
|
||||
@ -57,15 +231,11 @@ foreach my $file (@sysfilelist) {
|
||||
copy ($file, "$systemdir/$file");
|
||||
}
|
||||
|
||||
#Change the /bin/bash to /bin/sh in the /etc/passwd since base file system of mic only has sh.
|
||||
my $cmd = "sed \"s/\\/bin\\/bash/\\/bin\\/sh/\" $systemdir/etc/passwd > /tmp/passwd.mic; mv /tmp/passwd.mic $systemdir/etc/passwd;";
|
||||
system ($cmd);
|
||||
|
||||
# Create emtpy common dir and common.filelist for later using
|
||||
mkpath ("$fsdir/common");
|
||||
system ("touch $fsdir/common.filelist");
|
||||
|
||||
|
||||
print "Genimage for mic has been done.\n";
|
||||
|
||||
1;
|
||||
|
Loading…
Reference in New Issue
Block a user