Tested with flidas vm.
#! /bin/bash
-
# mk-basefile, create basefiles for some distributions
#
# Thomas Lange, Uni Koeln, 2011-2018
# 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_BUSTER=info
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
# here you can add packages, that are needed very early
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 \
dist=${DIST%%[0-9][0-9]}
local exc="EXCLUDE_$dist"
+ [ -n "${!exc}" ] && exc="--exclude=${!exc}" || unset exc
dist=${dist,,}
check
fi
if [ -n "$arch" ]; then
- qemu-debootstrap --arch $arch --exclude=${!exc} $inc $dist $xtmp $mirror
+ qemu-debootstrap --arch $arch ${exc} $inc $dist $xtmp $mirror
target="${target}_${arch^^}"
else
if [[ $DIST =~ 64 ]]; then
else
arch=i386
fi
- debootstrap --arch $arch --exclude=${!exc} $dist $xtmp $mirror
+ debootstrap --arch $arch ${exc} $inc $dist $xtmp $mirror
fi
cleanup-deb
tarit
-z Use gzip for compressing the tar file.
-J Use xz for compressing the tar file.
-k Keep the temporary subtree structure, do not remove it.
+ -x CMD Run CMD in chroot. If CMD exists as a file, copy it and run it.
+ Debian based only
-h Print help.
Usage example: mk-basefile -J STRETCH64
cleanup=1
attributes="--xattrs --selinux --acls"
-while getopts ashzJd:kf: opt ; do
+while getopts ashzJd:kf:x: opt ; do
case "$opt" in
a) echo "$0: Warning. -a is ignored, because xtattrs, acls and selinux are always added." ;;
d) export TMPDIR=$OPTARG ;;
k) cleanup=0 ;;
h) usage ;;
s) prtdists ; exit 0;;
+ x) cmd="$OPTARG" ;;
?) exit 3 ;; # error in option parsing
esac
done
SLC6_32) slc i386 6 ;;
SLC6_64) slc amd64 6 ;;
SLC7_64) slc amd64 7 ;;
+ BELENOS*|FLIDAS*)
+ debgeneric $target $MIRROR_TRISQUEL ;;
TRUSTY*|XENIAL*|BIONIC*)
debgeneric $target $MIRROR_UBUNTU ;;
SQUEEZE*|WHEEZY*|JESSIE*|STRETCH*|BUSTER*|SID*)
- release=stretch
+ release=buster
apt_cdn=http://deb.debian.org
security_cdn=http://security.debian.org
# if you have enough RAM (>2GB) you may want to enable this line. It
# also puts /var/cache into a ramdisk.
-#FAI_RAMDISKS="$target/var/lib/dpkg $target/var/cache"
+# ian: uncommented
+FAI_RAMDISKS="$target/var/lib/dpkg $target/var/cache"
# if you want to use the faiserver as APT proxy
-#APTPROXY=http://faiserver:3142
+# ian: uncommented
+APTPROXY=http://faiserver:3142
#! /bin/bash
+set -x
# if package locales will be installed, then install it early, before
# other packages
if [ $FAI_ACTION != "install" -a $FAI_ACTION != "dirinstall" ]; then
fi
fcopy -Bi /etc/apt/apt.conf.d/force_confdef
-ainsl -a /etc/ucf.conf "^conf_force_conffold=YES"
- # ian: on flidas this gives an error: update-locale: Error: invalid locale settings: LANG=en_US.UTF-8
- # # in case the locales are already included inside the base file (Ubuntu)
- # if [ -f $target/usr/sbin/locale-gen ]; then
- # $ROOTCMD dpkg-reconfigure -fnoninteractive locales
- # exit
- # fi
+ # in case the locales are already included inside the base file (Ubuntu)
+ if [ -f $target/usr/sbin/locale-gen ]; then
+ exit
+ fi
# if we want to install locales, install them now
install_packages -l 2>/dev/null | egrep -q ' locales|locales '
+# duplicated in DEBIAN
+PACKAGES install-norec
+debconf-utils
+file
+less
+rsync
+openssh-client openssh-server
+time
+procinfo
+locales
+console-setup kbd
+pciutils usbutils
+unattended-upgrades
+
PACKAGES install I386
linux-image-generic
memtest86+
linux-image-generic
memtest86+
+# duplicated in DEBIAN
PACKAGES install GRUB_PC
-grub-pc
+grub-pc cryptsetup btrfs-tools mbuffer sudo bridge-utils netcat-openbsd resolvconf lsof
+
-PACKAGES install
-ubuntu-minimal
-ubuntu-server
+PACKAGES install FLIDAS64 XENIAL64
+linux-image-generic-hwe-8.0
- PACKAGES install XORG
- ubuntu-desktop
- ubuntu-standard
- ubuntu-minimal
+ PACKAGES install GERMAN
+ language-pack-gnome-de
#! /bin/bash
+# modified from upstream fai example
+error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
+
+ netplan_yaml() {
+ # network configuration using ubuntu's netplan.io
+ local IFNAME="$1"
+ local METHOD="$2"
+ echo "Generating netplan configuration for $IFNAME ($METHOD)" >&2
+ echo "# generated by FAI"
+ echo "network:"
+ echo " version: 2"
+ echo " renderer: $RENDERER"
+ case "$RENDERER" in
+ networkd)
+ echo " ethernets:"
+ echo " $IFNAME:"
+ case "$METHOD" in
+ dhcp)
+ echo " dhcp4: true"
+ ;;
+ static)
+ echo " addresses: [$CIDR]"
+ echo " gateway4: $GATEWAYS_1"
+ echo " nameservers:"
+ echo " search: [$DOMAIN]"
+ echo " addresses: [${DNSSRVS// /, }]"
+ ;;
+ esac
+ esac
+ }
+
+ iface_stanza() {
+ # classic network configuration using /etc/network/interfaces
+ local IFNAME="$1"
+ local METHOD="$2"
+ echo "Generating interface configuration for $IFNAME ($METHOD)" >&2
+ echo "# generated by FAI"
+ echo "auto $IFNAME"
+ echo "iface $IFNAME inet $METHOD"
+ case "$METHOD" in
+ static)
+ echo " address $IPADDR"
+ echo " netmask $NETMASK"
+ echo " broadcast $BROADCAST"
+ echo " gateway $GATEWAYS"
+ ;;
+ esac
+ }
+
newnicnames() {
# determine predictable network names only for stretch and above
[ $do_init_tasks -eq 0 ] && return
-
+ [ -z "$NIC1" ] && return
ver=$($ROOTCMD dpkg-query --showformat='${Version}' --show udev)
if dpkg --compare-versions $ver lt 220-7; then
return
fi
- [ -z "$NIC1" ] && return
fields="ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH"
for field in $fields; do
break
fi
done
+ # This condition is only needed because the nfsroot I use
+ # is based on Jessie, which has an old udev which can't
+ # figure out the persistent interface name used in stretch.
+ if ifclass VM; then NIC1=ens3; return; fi
if [[ ! $name ]]; then
echo "$0: error: could not find systemd predictable network name. Using $NIC1."
fi
}
if [ -z "$NIC1" ]; then
- echo "ERROR: \$NIC1 is not defined. Cannot configure /etc/network/interfaces properly."
+ echo "WARNING: \$NIC1 is not defined. Cannot add ethernet to /etc/network/interfaces."
fi
- newnicnames
CIDR=$(ip -o -f inet addr show $NIC1 | awk '{print $4}')
- if ifclass DHCPC && [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ]; then
+ newnicnames
+
+ case "$FAI_ACTION" in
+ install|dirinstall)
+ ifclass DHCPC && METHOD=dhcp || METHOD=static
+ ifclass XORG && RENDERER=NetworkManager || RENDERER=networkd
- if ifclass VM; then
+ if [ -d $target/etc/netplan ]; then
+ # Ubuntu >= 17.10 with netplan.io
+ if [ -n "$NIC1" ]; then
+ netplan_yaml $NIC1 $METHOD > $target/etc/netplan/01-${NIC1}.yaml
+ fi
+ elif [ -d $target/etc/network/interfaces.d ]; then
+ # ifupdown >= 0.7.41 (Debian >= 8, Ubuntu >= 14.04)
- iface_stanza lo loopback > $target/etc/network/interfaces.d/lo
+
- if [ -n "$NIC1" -a ! -f $target/etc/NetworkManager/NetworkManager.conf ]; then
- iface_stanza $NIC1 $METHOD > $target/etc/network/interfaces.d/$NIC1
- fi
++ if ifclass VM; then
+ # note, this condition would apply to the elif below too,
+ # but I don't specify a static ip in fai, so not bothering
+ cat > $target/etc/network/interfaces <<-EOF
+ # generated by FAI
+ auto lo $NIC1
+ iface lo inet loopback
+ iface $NIC1 inet dhcp
+EOF
- else
++ else
+ cat > $target/etc/network/interfaces <<-EOF
+ # generated by FAI
+ auto lo br0
+ iface lo inet loopback
+ iface $NIC1 inet manual
+ # make a bridge by default so we can have bridged vms.
+ # Some example I read had stp on, but i don't need stp,
+ # and it causes a vm to fail pxe boot, presumably unless
+ # you add some delay.
+ # http://wiki.libvirt.org/page/PXE_boot_%28or_dhcp%29_on_guest_failed
+ iface br0 inet dhcp
+ bridge_ports $NIC1
+ bridge_stp off
+ bridge_maxwait 0
+EOF
++ fi
+ else
- (
- iface_stanza lo loopback
- iface_stanza $NIC1 $METHOD
- ) > $target/etc/network/interfaces
++ (
++ iface_stanza lo loopback
++ iface_stanza $NIC1 $METHOD
++ ) > $target/etc/network/interfaces
fi
- elif [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ]; then
- [ -n "$CIDR" ] && cat > $target/etc/network/interfaces <<-EOF
- # generated by FAI
- auto lo $NIC1
- iface lo inet loopback
- iface $NIC1 inet static
- address $CIDR
- gateway $GATEWAYS
- EOF
- [ -n "$NETWORK" ] && echo "localnet $NETWORK" > $target/etc/networks
- if [ ! -L $target/etc/resolv.conf -a -e /etc/resolv.conf ]; then
- cp -p /etc/resolv.conf $target/etc
+
+ if ! ifclass DHCPC ; then
+ [ -n "$NETWORK" ] && echo "localnet $NETWORK" > $target/etc/networks
+ if [ ! -L $target/etc/resolv.conf -a -e /etc/resolv.conf ]; then
+ cp -p /etc/resolv.conf $target/etc
+ fi
fi
- fi
+ ;;
+ esac
# here fcopy is mostly used, when installing a client for running in a
# different subnet than during the installation
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
+set -x
set -a
# do not set up grub during dirinstall
GROOT=$($ROOTCMD grub-probe -tdrive -d $BOOT_DEVICE)
+ # handle /boot in lvm-on-md
+ _bdev=$(readlink -f $BOOT_DEVICE)
+ if [ "${_bdev%%-*}" = "/dev/dm" ]; then
+ BOOT_DEVICE=$( lvs --noheadings -o devices $BOOT_DEVICE | sed -e 's/^*\([^(]*\)(.*$/\1/' )
+ fi
# 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
echo Install grub on /dev/$device
$ROOTCMD grub-install --no-floppy "/dev/$device"
done
-
- elif [[ $GROOT =~ 'hostdisk' ]]; then
- for dev in $BOOT_DEVICE; do
- $ROOTCMD grub-install --no-floppy --modules=part_msdos $dev
- if [ $? -eq 0 ]; then
- echo "Grub installed on hostdisk $BOOT_DEVICE"
- fi
- done
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
fi
- usedm=$(dmsetup ls 2>/dev/null | egrep -v '^live-rw|^live-base|^No devices found' | wc -l)
- if [ $usedm -ne 0 ]; then
- if [ ! -d $target/etc/lvm ]; then
- echo ERROR: Found lvm devices, but the lvm2 package was not installed
- error=1
- fi
- fi
+ # i use dm for crypt, not lvm, so this gives false positive. todo, send patch to remove this
+ # upstream.
+ # usedm=$(dmsetup ls 2>/dev/null | egrep -v '^live-rw|^live-base|^No devices found' | wc -l)
+ # if [ $usedm -ne 0 ]; then
+ # if [ ! -d $target/etc/lvm ]; then
+ # echo ERROR: Found lvm devices, but the lvm2 package was not installed
+ # error=1
+ # fi
+ # fi
fi
# remove backup files from cfengine, but only if cfengine is installed
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
return
fi
- dists="jessie stretch buster xenial trusty"
+ dists="jessie stretch buster bullseye bookworm bionic xenial trusty"
for d in $dists; do
if grep -iq $d $target/etc/os-release; then
release=$d