[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.