#!/bin/sh
RELEASE=6.0
PKGOSVER=6.0
#PKGRELEASE=2012Q3
WORKDIR=/usr/work/makexva/work
ROOTSIZE=$((9*1024))
SWAPSIZE=$((1*1024))
INODES=1000000
for ARCH in i386 amd64
do
PKGURL=
http://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/$ARCH/${PKGOSVER}${PKGRELEASE+_$PKGRELEASE}
SETSDIR=/usr/netbsd/6.0/6.0_RELEASE/$ARCH/binary/sets
SCRATCH=$WORKDIR/scratch.$ARCH
FS=$WORKDIR/xvaimg.fs
XVA=$WORKDIR/NetBSD-$RELEASE-$ARCH.xva
ZIP=$WORKDIR/NetBSD-$RELEASE-$ARCH.zip
PACKAGES="sysutils/xenstoretools-4.1.3.tgz
sysutils/xe-guest-utilities-6.0.2nb3.tgz"
FSSECTORS=$(($ROOTSIZE+$SWAPSIZE))
FSSECTORS=$(($FSSECTORS*2048))
STARTSEC=0
case $ARCH in
i386)
KERNTYPE=XEN3PAE_DOMU
PKGARCH=i386
;;
amd64)
KERNTYPE=XEN3_DOMU
PKGARCH=x86_64
;;
*)
echo "Unknown ARCH"
exit 1
;;
esac
SETS="base comp etc games kern-$KERNTYPE man misc tests text xbase xcomp xetc xfont xserver"
pkgv="0"
for dir in /usr/pkg/sbin /usr/sbin
do
[ ! -x $dir/pkg_add ] && continue
ver=`$dir/pkg_add -V`
[ -z "$ver" ] && continue
if [ $ver -gt $pkgv ]; then
PKGADD=$dir/pkg_add
pkgv=$ver
fi
done
if [ -z "$PKGADD" ]; then
echo "Could not locate pkg_add"
exit 1
fi
if [ "$pkgv" -lt 20120000 ]; then
echo "pkg_add too old, please update"
exit 1
fi
mkdir -p $WORKDIR
echo "Fetch packages"
for pkg in $PACKAGES
do
ftp -o $WORKDIR/${pkg#*/} $PKGURL/$pkg
done
mkdir -p $SCRATCH || exit 1
for s in $SETS
do
echo "Extracting $s"
tar -xpzf $SETSDIR/$s.tgz -C $SCRATCH || exit 1
done
echo "Make devices"
(cd $SCRATCH/dev ; sh MAKEDEV all)
echo "Create fstab"
mkdir -p $SCRATCH/kern $SCRATCH/proc
cat << EOF > $SCRATCH/etc/fstab
/dev/xbd0a / ffs rw,log 1 1
/dev/xbd0b none swap sw,dp
kernfs /kern kernfs rw
procfs /proc procfs rw
EOF
echo "Configure rc.conf"
sed 's/rc_configured=NO/rc_configured=YES/' \
$SCRATCH/etc/rc.conf > $SCRATCH/etc/rc.conf.tmp && \
mv $SCRATCH/etc/rc.conf.tmp $SCRATCH/etc/rc.conf
echo "xenguest=YES" >> $SCRATCH/etc/rc.conf
echo "xendomname=NO" >> $SCRATCH/etc/rc.conf
echo "Install packages"
for pkg in $PACKAGES
do
echo "-> $pkg"
$PKGADD -m $PKGARCH -K $SCRATCH/var/db/pkg -P $SCRATCH $WORKDIR/${pkg#*/}
done
cp $SCRATCH/usr/pkg/share/examples/rc.d/* $SCRATCH/etc/rc.d
offset_a=$STARTSEC
size_a=$(($ROOTSIZE*2048-$offset_a))
size_b=$(($SWAPSIZE*2048))
offset_b=$(($offset_a+$size_a))
echo "Make image"
makefs -t ffs -s $(($size_a*512)) -f $INODES ${FS} $SCRATCH || exit 1
echo "Create swap space"
dd if=/dev/zero bs=1m count=${SWAPSIZE} >> $FS
cat << EOF > $WORKDIR/disklabel
type: unknown
disk: XenServer
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: $(($FSSECTORS/1008))
total sectors: $FSSECTORS
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
16 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: $size_a $offset_a 4.2BSD 2048 16384 0
b: $size_b $offset_b swap
c: $(($FSSECTORS-$STARTSEC)) $STARTSEC unused 0 0
d: $FSSECTORS 0 unused 0 0
EOF
echo "Create disklabel"
disklabel -v -R -F $FS $WORKDIR/disklabel || exit 1
rm -f $WORKDIR/disklabel
echo "Convert to .xva"
python2.6 xva.py -n "NetBSD/$ARCH $RELEASE" --is-pv \
--disk $FS \
--bootloaderargs="--kernel=/netbsd" \
--filename=$XVA
echo "Create zip"
rm -f $ZIP
zip -D -v $ZIP $XVA
echo "Cleaning up"
rm -rf $FS $SCRATCH
done