2015-04-24 build Vyos lithium from source
This document describes one mechanism to build a bootable Vyos iso from the Vyos github source code repository.
Start with a Centos 6 workstation with the virtualization package and tools. Really, anything that can do KVM virtualization should work.
Download debian-6.0.7-amd64-netinst.iso (sha256sum is 28b2070d54b73d24f6d66d4223a0ca5e975e2555478c89ee8b48cbb4b89ee88d) or debian-6.0.7-i386-netinst.iso (sha256sum is 26a8c9de527ad59d473e10dffc8883c0dc095cf95ed3439bfdae952276dbc0df) from http://www.debian.org/releases/squeeze/debian-installer/. Use that in virt-manager to create a VM.
type linux, version debian squeeze 2G memory, 20G disk advanced, type KVM, arch x86_64 graphic install install std system utilities, and ssh server
On your workstation:
# define build machine
target=root@host46
targetdir=/home/carl/vyos/updates
# copy ssh key
ssh-copy-id -i $target
# copy the script to your build machine
scp build.vyos $target:/tmp
# run phase 1 to finish debian setup
ssh $target 'cd /home/carl/vyos; bash /tmp/build.vyos phase1'
# you could save the vm disk at this point
# copy patches
ssh $target mkdir -p $targetdir
for p in *.git.patch; do
i=$(basename $p .git.patch)
logger "copy modified $i"
scp -rpq $p $target:/$targetdir
done
ssh $target ls -al $targetdir
# run phase 2 to build iso from source
ssh $target 'cd /home/carl/vyos; bash /tmp/build.vyos phase2'
# fetch the iso and build log
f=$(ssh $target "echo /home/carl/vyos/build-iso/livecd/VyOS-livecd*.iso")
b=$(basename "$f")
scp $target:$f .
scp $target:/tmp/phase2.log.txt $b.log.txt
build.vyos
function logger() {
d=$(date)
echo " "
echo "*** $d $1"
}
function phase1 {
logger "import debian keys"
apt-get install debian-archive-keyring
logger "import vyos keys"
wget http://vyos.net/so3group_maintainers.key
gpg --import so3group_maintainers.key
gpg --list-keys
apt-key add ./so3group_maintainers.key
logger "install squashfs from backports"
echo "deb http://backports.debian.org/debian-backports squeeze-backports main" >>/etc/apt/sources.list
apt-get update
apt-get -y -t squeeze-backports install squashfs-tools
logger "install more build dependencies"
apt-get -y install git autoconf automake dpkg-dev live-helper syslinux genisoimage
logger "install undocumented dependencies, debclean needed by submod-clean"
apt-get -y install devscripts
logger "install undocumented dependencies found by submod-clean"
apt-get -y install autogen bison cdbs flex gawk gcc-4.4-multilib \
hardening-wrapper indent iptables-dev libapt-pkg-dev libatm1-dev \
libattr1-dev libboost-filesystem1.42-dev libcap-dev \
libc-ares-dev libcurl4-openssl-dev \
libdaemon-dev libdb4.8-dev libdb-dev libdevmapper-dev libedit-dev \
libexpat1-dev libfreetype6-dev libglib2.0-dev libgmp3-dev libkrb5-dev \
libldap2-dev libncurses5-dev libnetfilter-conntrack-dev \
libnfnetlink-dev libpam0g-dev libpcap0.8-dev libpci-dev \
libperl-dev libpgm-dev libpopt-dev libreadline-dev libsensors4-dev \
libsnmp-dev libssl-dev libtool libusb-dev \
libwrap0-dev libxml2-dev libzmq-dev lynx pkg-config python-all-dev \
python-setuptools quilt ruby uuid-dev xfonts-unifont zlib1g-dev
logger "install undocumented dependencies found by build attempts"
apt-get -y install kernel-package dkms doxygen libcunit1-dev libdumbnet-dev \
libfuse-dev libgtk2.0-dev libgtkmm-2.4-dev libicu-dev libnotify-dev \
libx11-dev libxinerama-dev libxss-dev libxtst-dev dh-autoreconf \
xmlto mscgen graphviz python-pygments xmlstarlet asciidoc source-highlight
logger "install more dependencies found by lithium build attempts"
apt-get -y install libcluster-glue-dev cluster-glue-dev libbz2-dev swig \
libgnutls-dev libopenhpi-dev libopenipmi-dev liblzo2-dev \
libpkcs11-helper1-dev libsqlite3-dev
logger "look for pending upgrades"
apt-get upgrade --dry-run
}
function phase2 {
arch=$(dpkg --print-architecture)
flavor=amd64-vyos
[ $arch == "i386" ] && flavor=586-vyos
logger "install more dependencies found by lithium build attempts"
apt-get -y install libsysfs-dev libpcsclite-dev
logger "look for pending upgrades for arch $arch"
apt-get upgrade --dry-run
logger "setup git clone, building flavor $flavor"
git clone https://github.com/vyos/build-iso.git
cd build-iso
#git branch $branch --track origin/$branch
git checkout $branch
git submodule init
git submodule update
for i in pkgs/*; do
if [ -d "$i/.git" ]; then
logger "select branch $branch for $i"
pushd "$i"
p=$(basename "$i")
#git branch $branch --track origin/$branch
git checkout $branch
if [ $? -eq 1 ]; then
git checkout master
fi
if [ -f ../../../updates/$p.git.patch ]; then
#git am --ignore-whitespace ../../../updates/$p.git.patch
patch -p1 <../../../updates/$p.git.patch
fi
popd
fi
done
logger "show active branches"
for i in pkgs/*; do
if [ -d "$i/.git" ]; then
(cd $i; b=$(git branch | grep '^\*'); echo $i "$b")
fi
done
logger "fetch source from vyos"
git pull
git submodule init
tools/submod-git pull
(
logger "linux-image missing debian/control file"
cd pkgs/linux-image
debian/bin/build-flavour.sh $flavor
)
(
logger "vyos-open-vm-tools missing config/guess file, source too deep"
cd pkgs/vyos-open-vm-tools
mv -f open-vm-tools/* .
automake --add-missing
)
logger "cleanup all the subpackages"
tools/submod-clean -d
logger "rebuild some packages needed to build the rest"
for i in pkgs/{net-snmp,libmnl,ppp}; do
p=$(basename $i)
if [ -d $i/.git ]; then
logger "building source package $p"
tools/submod-mk $p >$i/vyos.prebuild.log 2>&1
fi
done
logger "install some rebuilt packages"
PKGS="
pkgs/libsnmp*.deb
pkgs/libmnl*.deb
pkgs/vyatta-ppp*.deb
"
dpkg -i $PKGS
logger "rebuild more packages needed to build conntrack-tools"
for i in pkgs/libnl3 pkgs/libnfnetlink pkgs/libnetfilter-{conntrack,cthelper,cttimeout,queue}; do
p=$(basename $i)
if [ -d $i/.git ]; then
logger "building source package $p"
tools/submod-mk $p >$i/vyos.prebuild.log 2>&1
fi
done
logger "install more rebuilt packages"
PKGS="
pkgs/libnl*.deb pkgs/libnfnetlink*.deb pkgs/libnetfilter*.deb
"
dpkg -i $PKGS
logger "again cleanup all the subpackages"
tools/submod-clean -d
(
logger "updated strongswan 5.2 was setup on a newer system, regenerate aclocal and friends"
cd pkgs/vyatta-strongswan
# aclocal
# automake --add-missing
autoreconf
)
logger "rebuild all packages from source"
for i in pkgs/*; do
p=$(basename $i)
if [ -d $i/.git ]; then
logger "building source package $p"
tools/submod-mk $p >$i/vyos.build.log 2>&1
cat $i/vyos.build.log
fi
done
logger "build the new iso"
export PATH=/sbin:/usr/sbin:$PATH
autoreconf -i
./configure
cat >>livecd/config.vyatta/chroot_local-packageslists/vyatta-full.list <<EOF
libstrongswan
strongswan
strongswan-tools
EOF
make iso
(
logger "find packages that were built from source but the iso used the version from dev.packages.vyos.net"
cd livecd
fn=config.vyatta/chroot_local-packageslists/vyatta-full.list
for p in ../pkgs/*.deb; do
pp=${p%%_*}
pkg=${pp#../pkgs/}
c=$(find cache/packages_chroot -name "${pkg}_*.deb" | wc -l)
if [ $c -gt 0 ]; then
a=$(basename ../pkgs/${pkg}_*.deb)
b=$(basename cache/packages_chroot/${pkg}_*.deb)
[ "$a" != "$b" ] && echo "$a $b"
echo "$pkg" >>$fn
fi
done
logger "remove duplicate package pppoe from rp-pppoe, which conflicts with vyatta-ppp"
sed -i -e '/^pppoe$/d' $fn
)
logger "rebuild the new iso"
rm -rf livecd/{auto,binary*,cache,chroot,config,*.iso,.stage}
make iso
logger "show packages still pulled from dev.packages.vyos.net"
ls -al livecd/cache/packages_chroot
logger "done, iso in $(pwd)/livecd"
ls -al $(pwd)/livecd/*iso
}
case "$1" in
phase*)
branch=lithium
$1 2>&1 | tee /tmp/$1.log.txt
;;
esac