#! /bin/bash # mk-basefile, create basefiles for some distributions # # Thomas Lange, Uni Koeln, 2011-2024 # based on the Makefile implementation of Michael Goetze # # Usage example: mk-basefile -J STRETCH64 # This will create a STRETCH64.tar.xz basefile. # Supported distributions (i386/amd64): # Debian GNU/Linux # Ubuntu 14.04/16.04/20.04/22.04 # AlmaLinux 9 # Rocky Linux 8/9 # CentOS 5/6/7/8 # 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://deb.debian.org/debian/ MIRROR_UBUNTU=http://mirror.netcologne.de/ubuntu/ MIRROR_TRISQUEL=http://mirror.fsf.org/trisquel/ MIRROR_CENTOS=http://mirror.netcologne.de/ EXCLUDE_SQUEEZE=isc-dhcp-client,isc-dhcp-common,info EXCLUDE_WHEEZY=info EXCLUDE_JESSIE=info EXCLUDE_STRETCH=info EXCLUDE_BUSTER= EXCLUDE_BULLSEYE= EXCLUDE_BOOKWORM= EXCLUDE_TRIXIE= EXCLUDE_FORKY= EXCLUDE_SID= EXCLUDE_BELENOS=dhcp3-client,dhcp3-common,info EXCLUDE_TRUSTY=dhcp3-client,dhcp3-common,info EXCLUDE_XENIAL=udhcpc,dibbler-client,info EXCLUDE_FLIDAS=udhcpc,dibbler-client,info EXCLUDE_BIONIC=udhcpc,dibbler-client,info EXCLUDE_ETIONA=udhcpc,dibbler-client,info EXCLUDE_FOCAL=udhcpc,dibbler-client,info EXCLUDE_NABIA=udhcpc,dibbler-client,info EXCLUDE_JAMMY=udhcpc,dibbler-client,info EXCLUDE_ARAMO=udhcpc,dibbler-client,info EXCLUDE_NOBLE=udhcpc,dibbler-client,info # here you can add packages, that are needed very early INCLUDE_DEBIAN= INCLUDE_ETIONA=ifupdown INCLUDE_NABIA=ifupdown INCLUDE_ARAMO=ifupdown 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() { # set local mirror for rinse post script [ -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() { # set local mirror for rinse post script 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() { if [[ $cmd ]]; then if [[ -e $cmd ]]; then cp "$cmd" $xtmp/tmp chroot $xtmp "/tmp/$cmd" else chroot $xtmp $cmd fi fi chroot $xtmp apt-get clean rm -f $xtmp/etc/hostname $xtmp/etc/resolv.conf \ $xtmp/var/lib/apt/lists/*_* $xtmp/usr/bin/qemu-*-static \ $xtmp/etc/udev/rules.d/70-persistent-net.rules \ $xtmp/var/lib/dbus/machine-id > $xtmp/etc/machine-id } 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 $attributes --numeric-owner --one-file-system -C $xtmp -cf - . | $zip > $target.$ext } rpmdist() { local arch=$1 local vers=$2 local dist=$3 local domain=$(domainname) check setarch $arch $l32 rinse --directory $xtmp --distribution $dist-$vers --arch $arch --before-post-install $xtmp/post domainname $domain # workaround for #613377 cleanup-rinse tarit } alma() { rpmdist $1 $2 alma } rocky() { rpmdist $1 $2 rocky } 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 } debgeneric() { local DIST=$1 shift local mirror=$1 shift local arch=$1 dist=${DIST%%[0-9][0-9]} local exc="EXCLUDE_$dist" [ -n "${!exc}" ] && exc="--exclude=${!exc}" || unset exc local inc="INCLUDE_$dist" [ -n "${!inc}" ] && inc="--include=${!inc}" || unset inc dist=${dist,,} check if [ -n "$arch" ]; then qemu-debootstrap --arch $arch ${exc} $inc $dist $xtmp $mirror target="${target}_${arch^^}" else if [[ $DIST =~ 64 ]]; then arch=amd64 else arch=i386 fi debootstrap --arch $arch ${exc} $inc $dist $xtmp $mirror fi cleanup-deb tarit } prtdists() { echo "Available: ALMA9_64 ROCKY8_64 ROCKY9_64 CENTOS5_32 CENTOS5_64 CENTOS6_32 CENTOS6_64 CENTOS7_32 CENTOS7_64 CENTOS8_64 SLC5_32 SLC5_64 SLC6_32 SLC6_64 SLC7_64 TRUSTY32 TRUSTY64 XENIAL32 XENIAL64 FLIDAS64 BIONIC64 ETIONA64 FOCAL64 NABIA64 JAMMY64 ARAMO64 NOBLE64 SQUEEZE32 SQUEEZE64 WHEEZY32 WHEEZY64 JESSIE32 JESSIE64 STRETCH32 STRETCH64 BUSTER32 BUSTER64 BULLSEYE32 BULLSEYE64 BOOKWORM32 BOOKWORM64 TRIXIE32 TRIXIE64 FORKY32 FORKY64 SID32 SID64 " } usage() { cat <