#
# Thomas Lange, Uni Koeln, 2011-2017
# based on the Makefile implementation of Michael Goetze
+ #
+ # Usage example: mk-basefile -J STRETCH64
+ # This will create a STRETCH64.tar.xz basefile.
# Supported distributions (each i386/amd64):
# Debian GNU/Linux
# Define your local mirros here
# For the first stage, set the CentOS/SLC mirror in /etc/rinse/rinse.conf
- MIRROR_DEBIAN=http://http.us.debian.org/debian
+ 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,tasksel,tasksel-data
EXCLUDE_WHEEZY=info,tasksel,tasksel-data
- EXCLUDE_JESSIE=tasksel,tasksel-data
- EXCLUDE_STRETCH=tasksel,tasksel-data
+ EXCLUDE_JESSIE=info,tasksel,tasksel-data
+ EXCLUDE_STRETCH=info,tasksel,tasksel-data
+ EXCLUDE_BUSTER=tasksel,tasksel-data
+
+EXCLUDE_BELENOS=dhcp3-client,dhcp3-common,info
EXCLUDE_TRUSTY=dhcp3-client,dhcp3-common,info
- EXCLUDE_FLIDAS=tasksel,tasksel-data
- EXCLUDE_XENIAL=tasksel,tasksel-data
++EXCLUDE_FLIDAS=udhcpc,dibbler-client,info,tasksel,tasksel-data
+ EXCLUDE_XENIAL=udhcpc,dibbler-client,info,tasksel,tasksel-data
+ # we need aptitude in the base file, since users may want to use it for installing packages
INCLUDE_DEBIAN=aptitude
mkpost-centos() {
+ # set local mirror for rinse post script
[ -z "$MIRROR_CENTOS" ] && return
cat <<EOM > $xtmp/post
#! /bin/sh
mkpost-slc() {
+ # set local mirror for rinse post script
ver=$1
[ -z "$MIRROR_SLC" ] && return
cat <<EOM > $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
+ 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/etc/machine-id
}
local DIST=$1
shift
local mirror=$1
+ shift
+ local arch=$1
- if [[ $DIST =~ 64 ]]; then
- arch=amd64
- else
- arch=i386
- fi
-
- DIST=${DIST%%??}
- dist=${DIST,,}
+ dist=${DIST%%[0-9][0-9]}
+ local exc="EXCLUDE_$dist"
+ dist=${dist,,}
- local exc="EXCLUDE_$DIST"
check
- debootstrap --arch $arch --exclude=${!exc} --include=${INCLUDE_DEBIAN} $dist $xtmp $mirror
+ if [ -n "$arch" ]; then
+ qemu-debootstrap --arch $arch --exclude=${!exc} --include=${INCLUDE_DEBIAN} $dist $xtmp $mirror
+ target="${target}_${arch^^}"
+ else
+ if [[ $DIST =~ 64 ]]; then
+ arch=amd64
+ else
+ arch=i386
+ fi
+ debootstrap --arch $arch --exclude=${!exc} --include=${INCLUDE_DEBIAN} $dist $xtmp $mirror
+ fi
cleanup-deb
tarit
}
WHEEZY32 WHEEZY64
JESSIE32 JESSIE64
STRETCH32 STRETCH64
+ BUSTER32 BUSTER64
"
}
cat <<EOF
mk-basefile, create minimal base files for a Linux distritubtion
- Copyright (C) 2011-2016 by Thomas Lange
+ Copyright (C) 2011-2017 by Thomas Lange
Usage: mk-basefile [OPTION] ... DISTRIBUTION
-s Show list of supported linux distributions
-a Add xtattrs, acl and selinux properties to the tar file.
+ -f ARCH Build for foreign architecture ARCH.
-d DIR Use DIR for creating the temporary subtree structure.
-z Use gzip for compressing the tar file.
-J Use xz for compressing the tar file.
attributes=
cleanup=1
- while getopts ashzJd:k opt ; do
+ while getopts ashzJd:kf: opt ; do
case "$opt" in
a) attributes="--xattrs --selinux --acl" ;;
d) export TMPDIR=$OPTARG ;;
+ f) export ARCH=$OPTARG ;;
z) zip="gzip -9"; ext=tar.gz ;;
J) zip="xz -8" ext=tar.xz ;;
k) cleanup=0 ;;
target=$1 # also the name of the output file
+ [ -z "$target" ] && usage
case "$target" in
CENTOS5_32) centos i386 5 ;;
CENTOS5_64) centos amd64 5 ;;
SLC6_32) slc i386 6 ;;
SLC6_64) slc amd64 6 ;;
SLC7_64) slc amd64 7 ;;
+ BELENOS*|FLIDAS*)
+ debgeneric $target $MIRROR_TRISQUEL ;;
TRUSTY*|XENIAL*)
debgeneric $target $MIRROR_UBUNTU ;;
- SQUEEZE*|WHEEZY*|JESSIE*|STRETCH*)
- debgeneric $target $MIRROR_DEBIAN ;;
+ SQUEEZE*|WHEEZY*|JESSIE*|STRETCH*|BUSTER*)
+ debgeneric $target $MIRROR_DEBIAN $ARCH;;
*) echo "Unknown distribution. Aborting."
prtdists
exit 99 ;;
# (c) Thomas Lange, 2001-2016, lange@debian.org
# (c) Michael Goetze, 2010-2011, mgoetze@mgoetze.net
+
+# on ubuntu 16.04 which didn't run this script, some things which didn't
+# apply:
+# /etc/dpkg/dpkg.cfg.d/fai didn't exist,
+# machine-id was already setup.
+
+# on that system and a debian stretch system, after reboot,
+# some things done here don't seem to persist:
+# some thin/etc/mtab is symlink somewhere else,
+# and mailname is $HOSTNAME.lan
+
+# the adjtime thing is to support changing the system clock
+# from representing UTC (the default) to localtime (windows default).
+
+# afaik, the only useful thing here for me is setting /etc/hostname
+
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
# a list of modules which are loaded at boot time
sed -i -e 's#sbin/agetty --noclear#sbin/agetty -f /etc/issue.linuxlogo --noclear#' $target/lib/systemd/system/getty@.service
fi
- if [ ! -f $target/etc/machine-id -a -f $target/bin/systemd-machine-id-setup ]; then
+ # make sure a machine-id exists
+ if [ ! -f $target/etc/machine-id ]; then
+ > $target/etc/machine-id
+ fi
+ # recreate machine-id if the file is empty
+ if [ X"$(stat -c '%s' $target/etc/machine-id 2>/dev/null)" = X0 -a -f /bin/systemd-machine-id-setup ]; then
$ROOTCMD systemd-machine-id-setup
fi
exit $error
fi
- $ROOTCMD grub-mkdevicemap --no-floppy
+ GROOT=$($ROOTCMD grub-probe -tdrive -d $BOOT_DEVICE)
# Check if RAID is used for the boot device
if [[ $BOOT_DEVICE =~ '/dev/md' ]]; then
+ GROOT=$($ROOTCMD grub-probe -tdrive -d $BOOT_DEVICE)
raiddev=${BOOT_DEVICE#/dev/}
# install grub on all members of RAID
for device in `LC_ALL=C perl -ne 'if(/^'$raiddev'\s.+raid\d+\s(.+)/){ $_=$1; s/\d+\[\d+\]//g; print }' /proc/mdstat`; do
done
elif [[ $GROOT =~ 'hostdisk' ]]; then
- cat > $target/boot/grub/device.map <<EOF
- (hd0) $BOOT_DEVICE
- EOF
$ROOTCMD grub-install --no-floppy --modules=part_msdos $BOOT_DEVICE
if [ $? -eq 0 ]; then
echo "Grub installed on hostdisk $BOOT_DEVICE"
fi
- rm $target/boot/grub/device.map
else
- $ROOTCMD grub-install --no-floppy "$GROOT"
- if [ $? -eq 0 ]; then
- echo "Grub installed on $BOOT_DEVICE = $GROOT"
- fi
+ for dev in $BOOT_DEVICE; do
+ GROOT=$($ROOTCMD grub-probe -tdrive -d $dev)
+ $ROOTCMD grub-install --no-floppy "$GROOT"
+ if [ $? -eq 0 ]; then
+ echo "Grub installed on $dev = $GROOT"
+ fi
+ done
fi
$ROOTCMD update-grub
fi
# Make sure everything is configured properly
-if ifclass DEBIAN ; then
+if ifclass DEBIAN || ifclass UBUNTU; then
+ echo "Running \"apt-get -f install\" for the last time."
$ROOTCMD apt-get -f install
fi
if [ $FAI_ACTION = "install" ]; then
lskernels=$(echo $target/boot/vmlinu*)
- [ -f ${lskernels%% *} ] || echo "ERROR: No kernel was installed. Have a look at shell.log" >&2
+ if [ ! -f ${lskernels%% *} ]; then
+ echo "ERROR: No kernel was installed. Have a look at shell.log" >&2
+ error=1
+ fi
fi
# copy sources.list
break
fi
done
- echo "\$release set to $release"
}
# if installation was done from CD, replace useless sources.list
setrel
if [ -f $target/etc/apt/sources.list -a -n "$release" ]; then
grep -q 'file generated by fai-cd' $target/etc/apt/sources.list && cat <<EOF > $target/etc/apt/sources.list
- deb http://httpredir.debian.org/debian $release main contrib non-free
- deb http://httpredir.debian.org/debian-security $release/updates main contrib non-free
+ deb $apt_cdn/debian $release main contrib non-free
+ deb $apt_cdn/debian-security $release/updates main contrib non-free
deb [trusted=yes] http://fai-project.org/download $release koeln
EOF
fi
+ # for ARM architecture, we may need the kernel and initrd to boot or flash the device
+ if ifclass ARM64; then
+ cp -pv $target/boot/vmlinuz* $target/boot/initrd* $LOGDIR
+ fi
+
exit $error