#! /bin/bash # mk-basefile, create basefiles for some distributions # # Thomas Lange, Uni Koeln, 2011-2015 # based on the Makefile implementation of Michael Goetze # # Usage example: fai-mk-basefile -J SQUEEZE64 # This will create a SQUEEZE64.tar.xz basefile. # Supported distributions (each i386/amd64): # Debian GNU/Linux # Ubuntu 14.04/16.04 # CentOS 5/6/7 # Scientific Linux Cern 5/6 # # Packages you might want to install to use this command: # debootstrap, rinse, xz-utils # Define your local mirros here # For the first stage, set the CentOS/SLC mirror in /etc/rinse/rinse.conf MIRROR_DEBIAN=http://httpredir.debian.org/debian/ MIRROR_DEBIAN=http://localmirror/debian/ MIRROR_UBUNTU=http://mirror.netcologne.de/ubuntu/ MIRROR_CENTOS=http://mirror.netcologne.de/ #MIRROR_CENTOS=http://localmirror #MIRROR_SLC=http://localmirror EXCLUDE_SQUEEZE=isc-dhcp-client,isc-dhcp-common,info,tasksel,tasksel-data EXCLUDE_WHEEZY=isc-dhcp-client,isc-dhcp-common,info,tasksel,tasksel-data EXCLUDE_JESSIE=isc-dhcp-client,isc-dhcp-common,info,tasksel,tasksel-data EXCLUDE_TRUSTY=dhcp3-client,dhcp3-common,info EXCLUDE_XENIAL=isc-dhcp-client,isc-dhcp-common,udhcpc,dibbler-client,dhcpcd5,info,tasksel,tasksel-data INCLUDE_DEBIAN=aptitude setarch() { l32= if [ X$1 = Xi386 ]; then l32=linux32 fi } check() { if [ `id -u` != 0 ]; then echo "You must be root to create chroots." exit 1 fi mknod $xtmp/test-dev-null c 1 3 if [ $? -eq 1 ]; then echo "Cannot create device files on $xtmp, aborting." echo "Perhaps this directory is mounted with option nodev." rm -rf $xtmp exit 1 fi echo test > $xtmp/test-dev-null if [ $? -eq 1 ]; then echo "Cannot create device files on $xtmp, aborting." echo "Perhaps this directory is mounted with option nodev." rm -rf $xtmp exit 1 fi rm -f $xtmp/test-dev-null } mkpost-centos() { [ -z "$MIRROR_CENTOS" ] && return cat < $xtmp/post #! /bin/sh mkdir -p $xtmp/etc/yum.repos.d/orig cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig perl -pi -e 's,mirrorlist=,#mirrorlist=,; s,#baseurl=http://mirror.centos.org,baseurl=$MIRROR_CENTOS,;' $xtmp/etc/yum.repos.d/CentOS-Base.repo EOM chmod 555 $xtmp/post } mkpost-slc() { ver=$1 [ -z "$MIRROR_SLC" ] && return cat < $xtmp/post #! /bin/sh mkdir -p $xtmp/etc/yum.repos.d/orig cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-os.repo perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-updates.repo EOM chmod 555 $xtmp/post } cleanup-deb() { chroot $xtmp aptitude clean rm -f $xtmp/etc/hostname $xtmp/etc/resolv.conf $xtmp/etc/machine-id rm $xtmp/var/lib/apt/lists/*_* rm -f $xtmp/etc/udev/rules.d/70-persistent-net.rules } cleanup-rinse() { # check if chroot works echo "Installed packages in chroot:" chroot $xtmp rpm -qa|sort echo -n "CHROOT rpm -qa: " chroot $xtmp rpm -qa|wc -l rm -f $xtmp/etc/resolv.conf $xtmp/post if [ -d $xtmp/etc/yum.repos.d/orig ]; then mv $xtmp/etc/yum.repos.d/orig/* $xtmp/etc/yum.repos.d/ rm -rf $xtmp/etc/yum.repos.d/orig fi } tarit() { tar --xattrs --selinux --acl --one-file-system -C $xtmp -cf - . | $zip > $target.$ext } centos() { local arch=$1 local vers=$2 local domain=$(domainname) check setarch $arch mkpost-centos $l32 rinse --directory $xtmp --distribution centos-$vers --arch $arch --before-post-install $xtmp/post domainname $domain # workaround for #613377 cleanup-rinse tarit } slc() { local arch=$1 local vers=$2 check setarch $arch mkpost-slc $vers $l32 rinse --directory $xtmp --distribution slc-$vers --arch $arch --before-post-install $xtmp/post cleanup-rinse tarit } squeeze() { local arch=$1 check debootstrap --arch $arch --exclude=${EXCLUDE_SQUEEZE} squeeze $xtmp ${MIRROR_DEBIAN} cleanup-deb tarit } wheezy() { local arch=$1 check debootstrap --arch $arch --exclude=${EXCLUDE_WHEEZY} wheezy $xtmp ${MIRROR_DEBIAN} cleanup-deb tarit } jessie() { local arch=$1 check debootstrap --arch $arch --exclude=${EXCLUDE_JESSIE} --include=${INCLUDE_DEBIAN} jessie $xtmp ${MIRROR_DEBIAN} cleanup-deb tarit } trusty() { local arch=$1 check debootstrap --arch $arch --exclude=${EXCLUDE_TRUSTY} --include=${INCLUDE_DEBIAN} trusty $xtmp ${MIRROR_UBUNTU} cleanup-deb tarit } xenial() { local arch=$1 check debootstrap --arch $arch --exclude=${EXCLUDE_XENIAL} --include=${INCLUDE_DEBIAN} xenial $xtmp ${MIRROR_UBUNTU} cleanup-deb tarit } unknown() { echo "Unknown distribution. Aborting." echo "Available: CENTOS5_32 CENTOS5_64 CENTOS6_32 CENTOS6_64 CENTOS7_32 CENTOS7_64 SLC5_32 SLC5_64 SLC6_32 SLC6_64 SLC7_64 TRUSTY32 TRUSTY64 XENIAL32 XENIAL64 SQUEEZE32 SQUEEZE64 WHEEZY32 WHEEZY64 JESSIE32 JESSIE64 " exit 99 } # main routine ext=tar zip=cat tmpdir=/var/tmp while getopts zJd: opt ; do case "$opt" in d) tmpdir=$OPTARG ;; z) zip="gzip -9"; ext=tar.gz ;; J) zip="xz -8" ext=tar.xz ;; esac done shift $(($OPTIND - 1)) xtmp=$(mktemp -d $tmpdir/basefiles.XXXXXXXX) if [ $? -eq 1 ]; then echo "mktemp failed. Aborting." exit 2 fi target=$1 # also the name of the output file case "$target" in CENTOS5_32) centos i386 5 ;; CENTOS5_64) centos amd64 5 ;; CENTOS6_32) centos i386 6 ;; CENTOS6_64) centos amd64 6 ;; CENTOS7_32) centos i386 7 ;; CENTOS7_64) centos amd64 7 ;; SLC5_32) slc i386 5 ;; SLC5_64) slc amd64 5 ;; SLC6_32) slc i386 6 ;; SLC6_64) slc amd64 6 ;; SLC7_64) slc amd64 7 ;; TRUSTY32) trusty i386 ;; TRUSTY64) trusty amd64 ;; XENIAL32) xenial i386 ;; XENIAL64) xenial amd64 ;; SQUEEZE32) squeeze i386 ;; SQUEEZE64) squeeze amd64 ;; WHEEZY32) wheezy i386 ;; WHEEZY64) wheezy amd64 ;; JESSIE32) jessie i386 ;; JESSIE64) jessie amd64 ;; *) unknown ;; esac # cleanup rm -rf $xtmp