[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/7] osstest: add a FreeBSD host install recipe
On Tue, May 23, 2017 at 05:04:10PM +0100, Ian Jackson wrote: > Roger Pau Monne writes ("[PATCH 4/7] osstest: add a FreeBSD host install > recipe"): > > The installation is performed using the bsdinstall tool, which is > > part of the FreeBSD base system. The installer image is setup with > > the osstest ssh keys and sshd enabled by default, which allows the > > test harness to just ssh into the box, create the install config > > file and launch the scripted install. > > Thanks. I've read this in some detail now. My comments follow. > > > In order to support the FreeBSD installer a new method is added, > > that allows setting the pxe boot of a host using a memdisk. Also, a > > new tftp path is added in order to point to the place where the > > FreeBSD installed images should be stored. > > Can you please add to the commit message a deployment note that the > tftp root needs to be provide with a copy of memdisk, eg > /home/tftp/memdisk -> /usr/lib/syslinux/memdisk Done. > > diff --git a/Osstest.pm b/Osstest.pm > > index a78728cd..a0c0339c 100644 > > --- a/Osstest.pm > > +++ b/Osstest.pm > > @@ -227,6 +227,7 @@ sub readglobalconfig () { > > $c{TftpTmpDir} ||= "$c{TftpPlayDir}tmp/"; > > > > $c{TftpDiBase} ||= "$c{TftpPlayDir}debian-installer"; > > + $c{TftpFreeBSDBase} ||= "$c{TftpPlayDir}freebsd-installer"; > > You need to document this in README. (not needed anymore since we got rid of this). > > + foreach (@sets, "MANIFEST") { > > I think it would be better to give this loop control variable a name. > When the scope of a use of $_ is too big, $_ has a tendency to get > trashed; this makes the code fragile in the face of future changes. Done. > > > + if (!defined($r{"freebsd_sets"})) { > > + # Get everything before the "." (ie: get base from base.txz) > > + my $stash_name = lc((split /\./)[0]); > > IMO that's not very idomatic perl. I won't insist you change it, but > maybe this would be better > > my $stash_name = $set; > $stash_name =~ s/[^.]+$//; > > or > > $set =~ m/^[^.]+/ or die "$set ?"; > $stash_name = $&; > > (Do you intend to split on the first `.' ?) I don't expect this names to ever have more than one dot, this is not something that changes, so there should really be only one dot (or none in the MANIFEST case). I prefer the second one because it strips the ".", while the first one doesn't. (as you probably already guessed my perl/regexp is not very good) > > > +sub setup_netboot_installer () { > > + my $pxeimg = "$ho->{Tftp}{FreeBSDBase}/install-$ho->{Name}.img"; > > I think this would be better under TftpTmpDir. Cf ts-host-install's > placement of $ho--initrd.gz. > > Maybe we want a function target_tftp_prefix or something which returns > $ho->{Tftp}{TmpDir}".hostnamepath($ho) > ? Sounds fine, I guess I will add this as a pre-patch since there's already a consumer in ts-host-install. > Also the sha names could be in {TmpDir}/freebsd-images. Does this, in > fact, need to be configurable at all ? I think probably not. OK, so then I will just drop FreeBSDBase and just use $ho->{Tftp}{TmpDir}/freebsd-images. I don't think there's a lot of value in have it in a standard folder, since those are just random builds. I guess this makes more sense for Debian because they are actual releases, and thus can be used for other stuff also? > > + my $script = <<END; > > +set -ex > > +basedir=$ho->{Tftp}{Path}/$ho->{Tftp}{FreeBSDBase}/ > > +hash=`sha256sum $image|head -c 64` > > +localpath="$r{arch}/\$hash/install.img"; > > +mkdir -p \$basedir > > +( > > +flock -x -w 600 200 > > In osstest we generally use with-lock-ex from chiark-utils, rather > than flock from util-linux. (Bonus: it should be more portable for if > someone wants to run a controller on BSD...) > > with-lock-ex needs to be used in the wrapper way. > (Also, calling flock on a directory is rather outre'.) I don't have any problems using with-lock-ex, I just didn't know it existed :). > You've written all this in bash because you found it too hard or > annoying in Perl ? I don't much mind that, but the escaping is a bit > irritating. Maybe you want to pass the script its parameters as > arguments so that you can use <<'END' rather than <<END ? Hm, yes, I wasn't really confident of writing this in perl and being sure that the lock was always released. I'm more confident with shell. > However, > > > + logm("Executing:\n$script"); > > + my $ret = system("/bin/bash -c '$script'"); > > This is quite wrong. Your unparsing is unsound. Amazingly your > script doesn't currently contain ' so this doesn't matter right now, > but that could change. > > You should use the multi-argument form of system(3perl). And, of > course, you should use Osstest::system_checked which does the error > handling for you. > > You might want to build a command in an array @cmd, like copydir in > cr-publish-flight-logs does. (Not sure why that doesn't use > system_checked...) I've changed this to use an array with all the parameters and system_checked, it looks much better now IMHO, thanks. > > +sub install () { > > + my $authkeys = authorized_keys(); > > + my $knownhosts = known_hosts(); > > + my $sshd_keys_url = create_ssh_overlay(); > > + my $disk_names = "ada0 da0 ad0"; > > This should probably be > my @disk_names = qw(ada0 da0 ad0); > in case anyone wants to manipulate it in perl. You can substitute > it straight into the here document; perl will put in the " " again. > > > + my $installer_sets = join(" ", @sets); > > + my $target_sets = "/tmp/osstest_sets"; > > Hardcoded /tmp antipattern. Maybe this is technicallty OK because > it's an installer environment, but I think it sets a very bad > example. Is there some other path you could use ? I'm open to suggestions. We could also use ~/osstest_sets. I don't really have a preference. I've used /tmp because I though it would be less controversial. > > + target_cmd_root($ho, 'chsh -s /bin/sh', 10); > > !! What's the default ? csh. > > +for disk in $disk_names; do > > + if [ -c "/dev/\$disk" ]; then > > + echo \$disk > > + exit 0 > > + fi > > +done > > +exit 1 > > +END > > + defined($disk) or die "Unable to find a valid disk"; > > + logm("Using $disk as destination disk device"); > > I have found that on some hosts, when installing Debian GNU/Linux, I > have to expect a nonstandard disk name. Currently in the DB I can > only find this > hydrazine disk-device /dev/cciss/c0d0 > (in Cambridge; referring to a gone-away machine; NB that the property > name is in the obsolete containing-spaces syntax and is equivalent to > DiskDevice.) > > I think you may want to check a host property. It should probably be > called Freebsd_DiskDevice or something. (Weird capitalisation required > by the word splitting name transformation rules for host propertiess.) Yes, I can do that, but we would have to fill the DB manually. Would you be OK with leaving this as-is in this patch and me adding the property fetching later on? > > + logm("Trying to figure out primary nic device name"); > > + $nic = target_cmd_output_root($ho, <<END, 30); > > +nics=`ifconfig -l` > > +for nic in \$nics; do > > + addr=`ifconfig \$nic inet|grep inet|awk {'print \$2'}` > > + if [ "\$addr" = "$ho->{Ip}" ]; then > > + echo \$nic > > + exit 0 > > + fi > > +done > > +exit 1 > > I have quite a lot of this kind of thing: > > gall-mite 'interface force' eth0 > itch-mite 'interface force' eth0 > grain-weevil 'interface force' eth1 > rice-weevil 'interface force' eth1 > arndale-bluewater Interface_Force eth0 > arndale-lakeside Interface_Force eth0 > arndale-metrocentre Interface_Force eth0 > arndale-westfield Interface_Force eth0 > > This may not be needed for FreeBSD, but I thought I would mention it. > > What would happen if you tried to run this setup on a host where > FreeBSD's idea of the first network interface is not the one which > osstest did the install on ? FreeBSD doesn't really have an idea of the first network interface (unless you count the order in the output from ifconfig -l). Also, on FreeBSD each driver has it's own device, with different name, ie: there are em0, em1, bge0, bce0... interfaces. We could add a host property like Freebsd_NicDevice, but this fallback should stay in case the parameter is not defined? > IIRC there is a way for pxelinux to pass the NIC MAC address to the OS > it is running. Also, the host database contains the MAC address of > the host (and this is generally necessary for osstest to work even in > standalone mode I think), so you might use that rather than the IP > address ? This is not suitable in this case because from FreeBSD installer PoV it has been booted from a disk (because memdisk is used), so none of the PXE variables are propagated. > > + foreach (get_sets_path()) { > > + target_putfile_root($ho, 600, $_->{path}, "$target_sets/$_->{name}" > ); > > Needs linewrap. > > > + logm("Creating the installer script"); > > + target_cmd_root($ho, <<END, 60); > > + set -e > > + cat << ENDSCRIPT > installscript > > OK, my brain is fully bent now. Can we not create installscript on > the controller and transfer it with target_putfilecontents_root_stash ? > That way the logs would contain a copy, too. Yes, that's much better, thanks! > > +# Setup serial console > > +printf "%s" "-h -S$c{Baud}" >> /boot.config > > +cat << ENDBOOT >> /boot/loader.conf > > +boot_serial="YES" > > +comconsole_speed="$c{Baud}" > > +console="comconsole" > > +boot_verbose="YES" > > +beastie_disable="YES" > > +ENDBOOT > > Where does the installer's output go ? Ie, does booting the installer > image produce serial log output ? Yes, the installer image is built with serial output already. The output of the installer itself (bsdinstall) goes to the job log file. Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |