[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 5/7] osstest: introduce a FreeBSD build script



In order to generate the FreeBSD installer image and the install media.

The install sets are the vanilla ones generated by the 'ftp' release target.
The installer image is handcrafted based on the filesystem created by the
'bootonly' target, which is then populated with the ssh host keys, and setup
in order to use the serial console. The other difference from upstream FreeBSD
installer images is that the one built by osstest uses a ramdisk instead of
relying on the installer media to be somehow attached, either on a CD or USB
drive. This is required in order to boot the image from pxelinux (where no CD
or USB is actually attached to the host, and everything is fetched from tftp).

Due to the nature of the FreeBSD build, the outputs are different from what
osstest expects from a buildjob, more specifically there's no path_freebsdist
produced, and thus ts-build-check needs to be modified in order to accommodate
this. The FreeBSD build output is going to produce the following binaries
path_freebsd-{base,kernel,manifest,image}.

Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
 ts-build-check   |  14 +++-
 ts-freebsd-build | 230 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 241 insertions(+), 3 deletions(-)
 create mode 100755 ts-freebsd-build

diff --git a/ts-build-check b/ts-build-check
index b9ade876..68d6cc2d 100755
--- a/ts-build-check
+++ b/ts-build-check
@@ -28,9 +28,17 @@ logm("checking builds ...");
 foreach my $k (sort keys %r) {
     next unless $k =~ m/^(.*?)(_?)buildjob$/;
     my $part= $1;
-    my $path= "path_${part}dist";
-    logm("checking $k $path");
-    get_stashed($path, $r{$k});
+    if ("$part" eq "freebsd") {
+        foreach (qw(base kernel manifest image)) {
+            my $path= "path_${part}-$_";
+            logm("checking $k $path");
+            get_stashed($path, $r{$k});
+        }
+    } else {
+        my $path= "path_${part}dist";
+        logm("checking $k $path");
+        get_stashed($path, $r{$k});
+    }
 }
 
 logm("all ok.");
diff --git a/ts-freebsd-build b/ts-freebsd-build
new file mode 100755
index 00000000..c0366c97
--- /dev/null
+++ b/ts-freebsd-build
@@ -0,0 +1,230 @@
+#!/usr/bin/perl -w
+# This is part of "osstest", an automated testing framework for Xen.
+# Copyright (C) 2017 Citrix Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+# 
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+use strict qw(vars);
+use DBI;
+use POSIX;
+
+unshift @INC, qw(.);
+use Osstest;
+use Osstest::TestSupport;
+use Osstest::BuildSupport;
+
+tsreadconfig();
+
+selectbuildhost(\@ARGV);
+builddirsprops();
+
+sub install_deps () {
+    target_cmd_root($ho, 'pkg install git', 300);
+}
+
+sub checkout () {
+    prepbuilddirs();
+
+    # Remove the directory as root, there might be files owned by root
+    target_cmd_root($ho, <<END, 300);
+chflags -fR noschg $builddir/freebsd
+rm -rf $builddir/freebsd
+END
+
+    logm("Checkout the FreeBSD source tree");
+    build_clone($ho, 'freebsd', $builddir, 'freebsd');
+}
+
+sub build () {
+    my $authkeys = authorized_keys();
+    my $target = "bootonly";
+
+    # Build process as documented in the handbook:
+    # https://www.freebsd.org/doc/handbook/updating-src.html
+
+    logm("Cleaning up previous builds");
+    target_cmd_build($ho, 300, $builddir, <<END);
+cd freebsd
+export MAKEOBJDIRPREFIX=$builddir/obj
+make cleanworld
+END
+
+    logm("Building world");
+    target_cmd_build($ho, 7200, $builddir, <<END);
+cd freebsd
+export MAKEOBJDIRPREFIX=$builddir/obj
+(make $makeflags TARGET=$r{arch} buildworld 2>&1 && touch ../build-ok-stamp) \\
+    |tee ../log
+test -f ../build-ok-stamp
+echo ok.
+END
+
+    logm("Building kernel");
+    target_cmd_build($ho, 3600, $builddir, <<END);
+cd freebsd
+export MAKEOBJDIRPREFIX=$builddir/obj
+(make $makeflags TARGET=$r{arch} buildkernel 2>&1 && touch ../build-ok-stamp) 
\\
+    |tee ../log
+test -f ../build-ok-stamp
+echo ok.
+END
+
+    logm("Creating the install sets");
+    # NB: the steps below need to be done as root or the permissions
+    # of the files won't be properly set (and the target will fail).
+    target_cmd_root($ho, <<END, 900);
+cd $builddir/freebsd
+export MAKEOBJDIRPREFIX=$builddir/obj
+(make -C release TARGET=$r{arch} ftp 2>&1 && touch ../build-ok-stamp) \\
+    |tee ../log
+test -f ../build-ok-stamp
+echo ok.
+END
+
+    logm("Populating the installer image");
+    target_cmd_root($ho, <<END, 900);
+cd $builddir/freebsd
+export MAKEOBJDIRPREFIX=$builddir/obj
+(make -C release TARGET=$r{arch} $target 2>&1 && touch ../build-ok-stamp) \\
+    |tee ../log
+test -f ../build-ok-stamp
+echo ok.
+END
+
+    logm("Placing ssh host keys");
+    foreach my $file (<$c{OverlayLocal}/etc/ssh/ssh_host_*_key*>) {
+        target_putfile_root($ho, 30, $file,
+                            "$builddir/freebsd/release/$target/etc/ssh/");
+    }
+
+    logm("Configuring the installer image");
+    target_cmd_root($ho, <<END, 30);
+set -ex
+target=$builddir/freebsd/release/$target
+# Enable sshd by default
+echo 'sshd_enable="YES"' >> \$target/etc/rc.conf
+
+# Allow root login and copy the keys
+echo 'PermitRootLogin yes' >> \$target/etc/ssh/sshd_config
+mkdir -p \$target/root/.ssh
+cat << ENDKEYS > \$target/root/.ssh/authorized_keys
+$authkeys
+ENDKEYS
+
+# Set host keys permissions
+chown root:wheel \$target/etc/ssh/ssh_host_*_key*
+chmod 0600 \$target/etc/ssh/ssh_host_*_key
+chmod 0644 \$target/etc/ssh/ssh_host_*_key.pub
+
+# Setup serial console output for stage1
+printf "%s" "-h -S$c{Baud}" >> \$target/boot.config
+cat << ENDBOOT >> \$target/boot/loader.conf
+# Serial console configuration
+boot_serial="YES"
+comconsole_speed="$c{Baud}"
+console="comconsole"
+boot_verbose="YES"
+beastie_disable="YES"
+
+# mfs boot parameters
+geom_uzip_load="YES"
+tmpfs_load="YES"
+mfs_load="YES"
+mfs_type="mfs_root"
+mfs_name="/mfsroot"
+vfs.root.mountfrom="ufs:/dev/ufs/FreeBSD_Install"
+ENDBOOT
+
+# Enable DHCP on all network interfaces
+echo 'ifconfig_DEFAULT="DHCP"' >> \$target/etc/rc.conf
+
+# Remove the local script that launches the installer by default
+rm -rf \$target/etc/rc.local
+
+# Create a temporary fstab with the root dir
+echo '/dev/ufs/FreeBSD_Install / ufs rw 1 1' > \$target/etc/fstab
+
+# Remove the linked resolv.conf
+rm -rf \$target/etc/resolv.conf
+END
+
+    logm("Create the installer");
+    target_cmd_root($ho, <<END, 600);
+set -ex
+target=$builddir/freebsd/release/$target
+output=$builddir/install.img
+mkdir -p \$output.tmp
+
+# Do some pruning
+rm -rf \$target/usr/share/man
+rm -rf \$target/usr/share/examples
+rm -rf \$target/usr/share/doc
+rm -rf \$target/usr/share/dtrace
+
+# Create a mfs root image
+makefs -b 10% -B little -o label=FreeBSD_Install \$output.tmp/mfsroot \$target
+# Compress image
+gzip \$output.tmp/mfsroot
+
+# Copy boot to the staging dir
+cp -r \$target/boot \$output.tmp/
+cp \$target/boot.config \$output.tmp/
+
+# The loader only needs the tmpfs and geom_uzip modules in order
+# to boot into the mfs root, the rest of the modules can be loaded from
+# the mfs root itself.
+for module in `ls \$output.tmp/boot/kernel/*.ko`; do
+    if [ `basename "\$module"` != "geom_uzip.ko" ] && \\
+       [ `basename "\$module"` != "tmpfs.ko" ]; then
+        rm -f \$module
+    fi
+done
+
+makefs -B little \$output.part \$output.tmp
+
+# Make the image bootable
+mkimg -s gpt -b \$target/boot/pmbr -p efi:=\$target/boot/boot1.efifat \\
+    -p freebsd-boot:=\$target/boot/gptboot -p freebsd-ufs:=\$output.part \\
+    -p freebsd-swap::1M -o \$output
+
+rm \$output.part
+rm -rf \$output.tmp
+END
+}
+
+sub stash () {
+    logm("Stashing FreeBSD build output");
+    built_stash_file($ho, $builddir, "freebsd-image", "install.img", 0);
+    built_stash_file($ho, $builddir, "freebsd-manifest",
+                     "freebsd/release/ftp/MANIFEST", 0);
+    built_stash_file($ho, $builddir, "freebsd-base",
+                     "freebsd/release/ftp/base.txz", 0);
+    built_stash_file($ho, $builddir, "freebsd-kernel",
+                     "freebsd/release/ftp/kernel.txz", 0);
+    built_stash_debugfile($ho, $builddir, "freebsd-kernel-dbg",
+                          "freebsd/release/ftp/kernel-dbg.txz", 0);
+    my $srcversion = target_cmd_output_root($ho, <<END, 30);
+awk '/^\\\#define[[:space:]]*__FreeBSD_version/ { print \$3 }' \\
+    $builddir/freebsd/sys/sys/param.h | cut -c1-2
+END
+    store_runvar("freebsd_version", "$srcversion");
+}
+
+install_deps();
+checkout();
+build();
+stash();
+
+logm("FreeBSD build successful");
+
-- 
2.11.0 (Apple Git-81)


_______________________________________________
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®.