diff -Nru fai-5.3.6ubuntu1/bin/device2grub fai-5.9.4ubuntu1/bin/device2grub --- fai-5.3.6ubuntu1/bin/device2grub 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/device2grub 2020-04-27 02:48:17.000000000 +0000 @@ -26,7 +26,7 @@ $map{$olddevice} = $grubdevice; } -$device=~ m#^(/dev/(?:[shv]d\D|xvd\D|i2o/hd\D|ida/c\d*d\d*|cciss/c\d*d\d*)|nvme\d*n1)p*(\d*)$# || die "Can't match device: $device\n"; +$device=~ m#^(/dev/(?:[shv]d\D|xvd\D|i2o/hd\D|ida/c\d*d\d*|cciss/c\d*d\d*|nvme\d+n1|mmcblk\d+))p?(\d*)$# || die "Can't match device: $device\n"; my ($disk,$partition) = ($1,$2); if ($map{$disk}) { diff -Nru fai-5.3.6ubuntu1/bin/dhcp-edit fai-5.9.4ubuntu1/bin/dhcp-edit --- fai-5.3.6ubuntu1/bin/dhcp-edit 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/dhcp-edit 2020-04-27 02:48:16.000000000 +0000 @@ -138,7 +138,7 @@ return; } - (-x "/etc/init.d/isc-dhcp-server") and print qx#/etc/init.d/isc-dhcp-server restart# + (-x "/etc/init.d/isc-dhcp-server") and print qx#/usr/sbin/invoke-rc.d isc-dhcp-server restart# } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru fai-5.3.6ubuntu1/bin/fai fai-5.9.4ubuntu1/bin/fai --- fai-5.3.6ubuntu1/bin/fai 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai 2020-04-27 02:48:17.000000000 +0000 @@ -5,7 +5,7 @@ # fai -- main installation script executed after booting # # This script is part of FAI (Fully Automatic Installation) -# (c) 1999-2016 by Thomas Lange, lange@informatik.uni-koeln.de +# (c) 1999-2017 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # (c) 2001-2005 by Henning Glawe, glaweh@physik.fu-berlin.de # Freie Universitaet Berlin @@ -32,13 +32,15 @@ export PATH=/usr/local/sbin:/usr/local/bin:/usr/lib/fai:/usr/sbin:/usr/bin:/sbin:/bin # some variables -export FAI_VERSION=FAIVERSIONSTRING +export FAI_VERSION="FAIVERSIONSTRING" stamp=/var/run/fai/FAI_INSTALLATION_IN_PROGRESS -export romountopt="-o async,noatime,nolock,ro,actimeo=1800" +export romountopt=${romountopt:-"-o async,noatime,nolock,ro,actimeo=1800"} [ -n "$STOP_ON_ERROR" ] || export STOP_ON_ERROR=700 export faimond=0 export renewclass=0 +export task_error=0 # tasks can set this variable to indicate an error +final_exit_code=0 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fdie() { @@ -102,11 +104,7 @@ define_fai_flags # we really need to start udev if [ -x /etc/init.d/udev ]; then - if [ X$UPSTART_JOB != Xfai ]; then - /etc/init.d/udev start - else - test -f /etc/init/udevtrigger.conf && udevadm trigger --action=add && udevadm settle - fi + /etc/init.d/udev start fi mkdir -p /var/run/sshd /var/run/network # when using initrd kernels ifup lo @@ -240,6 +238,7 @@ fdie 1 "Run this program as root." >&2 fi +export FAI_RUNDIR=$PWD export start_seconds=$(cut -d . -f 1 /proc/uptime) if [ X$FAI_ACTION = Xdirinstall ]; then @@ -256,7 +255,7 @@ # check if target directory is mounted with bad options fs=$(df -P $FAI_ROOT | tail -1 | awk '{print $6}') - if mount | grep "on $fs " | awk '{print $6}' | egrep -q "nosuid|nodev"; then + if mount | grep "on $fs " | awk '{print $6}' | grep -E -q "nosuid|nodev"; then fdie 5 "Target directory is mounted using nosuid or nodev. Aborting" >&2 fi unset fs @@ -278,7 +277,7 @@ # are we called as an init substitute ? export do_init_tasks=0 -[ "$0" = "/etc/init.d/rcS" ] || [ X$UPSTART_JOB = Xfai ] && do_init_tasks=1 +[ "$0" = "/etc/init.d/rcS" ] && do_init_tasks=1 if [ $do_init_tasks -eq 1 ]; then # if hostname was set on the kernel command line (mostly when booting from CD) @@ -298,10 +297,14 @@ # if the host name is still not set, use the IP for setting the hostname read hname < /proc/sys/kernel/hostname if [ -z "$HOSTNAME" -o $HOSTNAME = '(none)' -o -z "$hname" ]; then - myip=$(ip ad show up | grep -w inet | cut -d t -f 2 | cut -d ' ' -f 2 | cut -d / -f 1 | grep -v 127.0.0.1| tr '.' '-') - export HOSTNAME="ip-$myip" + myip=$(ip ad show up | grep -P -o '(?<=inet )[^/]+' | grep -v 127.0.0.1| tr '.' '-') + if [ -n "$myip" ]; then + export HOSTNAME="ip-$myip" + else + export HOSTNAME=debian + fi echo $HOSTNAME > /proc/sys/kernel/hostname - echo "Using IP for setting the host name: $HOSTNAME" + echo "Setting the host name: $HOSTNAME" fi unset hname myip @@ -339,7 +342,16 @@ fstart > >( tee -a $LOGDIR/fai.log ) 2>&1 task action |& tee -a $LOGDIR/fai.log -final_exit_code=${PIPESTATUS[0]} +if [ ${PIPESTATUS[0]} -gt 0 ]; then + final_exit_code=1 +fi +if [ -f $LOGDIR/task_error ]; then + task_error=$(< $LOGDIR/task_error) + if [ $task_error -gt 0 ]; then + final_exit_code=1 + fi +fi + [ -L "/var/run/fai/current_config" ] && rm -f "/var/run/fai/current_config" diff -Nru fai-5.3.6ubuntu1/bin/fai-cd fai-5.9.4ubuntu1/bin/fai-cd --- fai-5.3.6ubuntu1/bin/fai-cd 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-cd 2020-09-03 02:04:20.000000000 +0000 @@ -5,7 +5,7 @@ # fai-cd -- make a fai CD, a bootable CD that performs the FAI # # This script is part of FAI (Fully Automatic Installation) -# (c) 2004-2016 by Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2004-2020 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # Support for grub2 added by Sebastian Hetze, s.hetze@linux-ag.de # with major support from Michael Prokop, prokop@grml-solutions.com @@ -34,8 +34,8 @@ # last die exit code 22 -boot_image="boot/grub/eltorito.img" count=0 +space=0 config_space="" configset=0 forceremoval=0 @@ -47,6 +47,7 @@ rel=0 target=0 autodiscover=0 +vname="FAI_CD" # arguments to be passed on to internal fai-cd call arguments="-MB" @@ -59,7 +60,7 @@ usage() { cat <<-EOF - fai-cd Copyright (C) 2004-2016 Thomas Lange + fai-cd Copyright (C) 2004-2020 Thomas Lange Usage: fai-cd [OPTIONS] -m MIRRORDIR ISONAME Usage: fai-cd [OPTIONS] -B ISONAME @@ -75,39 +76,63 @@ local e=$1 # first parameter is the exit code shift - echo "ERROR: $@" >&2 # print error message + echo -e "ERROR: $@" >&2 # print error message exit $e } # - - - - - - - - - - - - - - - - - - - - - - - - - - +error_space() { + + local e=$1 + shift + local msg=$1 + echo "Not enough space left on image for the $msg" >&2 + df -h $tmp/$liveos/mounted-ext3fs >&2 + echo "You can add more space to the image by using the option -s. See man fai-cd for details." >&2 + die $e +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - +check_programs() { + + local msg + [ $squash_only -eq 0 ] && ! command -v xorriso >&/dev/null && msg+="xorriso not found. Please install package." + command -v mksquashfs >&/dev/null || msg+="\nmksquashfs not found. Please install the package squashfs-tools." + command -v mkfs.vfat >&/dev/null || msg+="\nmkfs.vfat not found. Please install the package dosfstools." + command -v mcopy >&/dev/null || msg+="\nmcopy not found. Please install the package mtools." + + if [ -n "$msg" ]; then + die 8 "$msg" + fi +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - create_ext3fs_image() { # create the folder that will be used for the squashfs.img later # along with it, a temporary folder is created to mount the ext3fs.img mkdir -p $tmp/$liveos/mounted-ext3fs + # hide some directories before copying the nfsroot + customize_nfsroot calculate_required_size # creates an empty file dd if=/dev/zero of=$tmp/$liveos/ext3fs.img bs=1MB count=$count 2>/dev/null || die 9 "dd failed. Maybe no enough free space in $tmp" - mkfs.ext4 -q -O^has_journal -F -L FAI-NFSROOT $tmp/$liveos/ext3fs.img + mkfs.ext4 -m1 -q -O^has_journal -F -L FAI-NFSROOT $tmp/$liveos/ext3fs.img # the resulting ext3fs.img is mounted mount -o loop,noatime $tmp/$liveos/ext3fs.img $tmp/$liveos/mounted-ext3fs - # hide some directories before copying the nfsroot - customize_nfsroot echo "Copying the nfsroot to CD image" # copy the contents of the nfsroot into it - cp -Ppr $ONFSROOT/. $tmp/$liveos/mounted-ext3fs/ || die $? "Not enough space left on device for the nfsroot" + cp -Ppr $ONFSROOT/. $tmp/$liveos/mounted-ext3fs/ || error_space $? "nfsroot" rm -f $tmp/$liveos/mounted-ext3fs/etc/resolv.conf # find $tmp/$liveos/mounted-ext3fs # for debugging # copy config space into nfsroot-copy unless -d is given if [ $configset -eq 0 ]; then echo "Copying the config space to CD image" - cp -Ppr $FAI_CONFIGDIR/* $tmp/$liveos/mounted-ext3fs/var/lib/fai/config/ || die $? "Not enough space left on device for the config directory" + cp -Ppr $FAI_CONFIGDIR/* $tmp/$liveos/mounted-ext3fs/var/lib/fai/config/ || error_space $? "config directory" fi # add the partial mirror to the CD addmirror @@ -161,61 +186,47 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - create_grub2_image() { - mkdir -p $tmp/boot/grub $NFSROOT/boot/grub - if [ -f $NFSROOT/boot/grub/core.img ]; then - cp $NFSROOT/boot/grub/core.img $tmp/boot/grub - MODULEBASE=$NFSROOT/usr/lib/grub - elif [ -f $NFSROOT/usr/lib/grub/i386-pc/cdboot.img ]; then - chroot $NFSROOT /usr/bin/grub-mkimage -p /boot/grub -d /usr/lib/grub/i386-pc -o /boot/grub/core.img biosdisk iso9660 --format=i386-pc - cp $NFSROOT/boot/grub/core.img $tmp/boot/grub - MODULEBASE=$NFSROOT/usr/lib/grub - else - echo "no grub2 installation found in NFSROOT, using downloaded $grubPackage" - apt-get -y -d install --reinstall grub-pc >/dev/null - apt-get -y -d install --reinstall grub-common >/dev/null - grubPackage=`ls -rt /var/cache/apt/archives/grub-pc*|tail -1` - grubCommonPackage=`ls -rt /var/cache/apt/archives/grub-common*|tail -1` - if [ -z "$grubPackage" ]; then - die 22 "Downloading grub2 failed." - fi - if [ -z "$grubCommonPackage" ]; then - die 22 "Downloading grub-common failed." - fi - GRUBDIR=$tmp/grubPackage - mkdir -p $GRUBDIR - dpkg -x $grubPackage $GRUBDIR - cd $GRUBDIR - ./usr/bin/grub-mkimage -p /boot/grub -d usr/lib/grub/*-pc -o $tmp/boot/grub/core.img biosdisk iso9660 --format=i386-pc - MODULEBASE=$GRUBDIR/usr/lib/grub - fi + mkdir -p $tmp/boot - # check for jessie path - if strings $NFSROOT/usr/lib/grub/i386-pc/kernel.img | grep -q i386-pc/%s.mod; then - grubtarget=$tmp/boot/grub/i386-pc + if [ -d $NFSROOT/usr/lib/grub/x86_64-efi ]; then + cp $grub_config $NFSROOT/tmp/grub.cfg + # insert date into grub menu + perl -pi -e "s/_VERSIONSTRING_/ $isoversion /" $NFSROOT/tmp/grub.cfg + if [ -n "$config_space" ] || [ $configset -eq 1 ]; then + perl -pi -e "s|FAI_CONFIG_SRC=(.*?)\S+|FAI_CONFIG_SRC=$config_space|" $NFSROOT/tmp/grub.cfg + fi + + chroot $NFSROOT grub-mkstandalone \ + --format=x86_64-efi \ + --output=/tmp/bootx64.efi \ + --locales="" --fonts="" \ + "boot/grub/grub.cfg=/tmp/grub.cfg" + mv $NFSROOT/tmp/bootx64.efi $scratch + + dd if=/dev/zero of=$scratch/efiboot.img bs=1M count=3 2>/dev/null + mkfs.vfat $scratch/efiboot.img + mmd -i $scratch/efiboot.img efi efi/boot + mcopy -i $scratch/efiboot.img $scratch/bootx64.efi ::efi/boot/ else - # wheezy - grubtarget=$tmp/boot/grub + die 11 "No grub-efi-amd64-bin installation found in NFSROOT. Aborting." fi - - mkdir -p $grubtarget - for a in $MODULEBASE/*-pc/{*.mod,efiemu??.o,cdboot.img,boot.img,command.lst,moddep.lst,fs.lst,handler.lst,parttool.lst}; do - [[ -e $a ]] && cp $a $grubtarget - done - rm -rf $GRUBDIR - cp $grub_config $tmp/boot/grub/grub.cfg - # insert date into grub menu - perl -pi -e "s/_VERSIONSTRING_/ $isoversion /" $tmp/boot/grub/grub.cfg - if [ -n "$config_space" ] || [ $configset -eq 1 ]; then - perl -pi -e "s|FAI_CONFIG_SRC=(.*?)\S+|FAI_CONFIG_SRC=$config_space|" $tmp/boot/grub/grub.cfg + if [ -d $NFSROOT/usr/lib/grub/i386-pc ]; then + chroot $NFSROOT grub-mkstandalone \ + --format=i386-pc \ + --output=/tmp/core.img \ + --locales="" --fonts="" \ + --install-modules="linux normal iso9660 biosdisk memdisk search ls echo test chain msdospart part_msdos part_gpt minicmd ext2 keystatus all_video font sleep gfxterm" \ + --modules="linux normal iso9660 biosdisk search" \ + "boot/grub/grub.cfg=/tmp/grub.cfg" + cat $NFSROOT/usr/lib/grub/i386-pc/cdboot.img $NFSROOT/tmp/core.img > $scratch/bios.img + rm $NFSROOT/tmp/core.img + else + die 11 "No grub-pc installation found in NFSROOT. Aborting." fi cp -p $NFSROOT/boot/vmlinuz-$kernelversion $tmp/boot/vmlinuz cp -p $NFSROOT/boot/initrd.img-$kernelversion $tmp/boot/initrd.img cp -p $NFSROOT/boot/config-$kernelversion $tmp/boot/ - cat $grubtarget/cdboot.img $tmp/boot/grub/core.img > $tmp/boot/grub/eltorito.img - boot_image="boot/grub/eltorito.img" - - embed_image="$tmp/boot/grub/embed.img" - cat $grubtarget/boot.img $tmp/boot/grub/core.img > $embed_image + touch $tmp/FAI-CD } # - - - - - - - - - - - - - - - - - - - - - - - - - - calculate_required_size() { @@ -229,7 +240,8 @@ fi # not dividing by 1024 to get the exact, this allows us to get some additional space - count=$(($size/900)) + # add some addition space + count=$(($size/850 + $space)) } provide_memtest_boot_option() { @@ -240,11 +252,9 @@ if [ -f $NFSROOT/boot/memtest86+.bin ]; then cp $NFSROOT/boot/memtest86+.bin $tmp/boot - elif [ -f /boot/memtest86+.bin ]; then - cp /boot/memtest86+.bin $tmp/boot + echo "Adding memtest86+ to grub menu" else - echo "no memtest86+.bin found, omit memtest boot option" - return + return 0 fi cat >> $tmp/boot/grub/grub.cfg </dev/null + local initrdfiles=($ONFSROOT/tmp/initrd.img*) + if [[ -e $initrdfiles ]]; then + mv "${initrdfiles[@]}" $ONFSROOT/boot 2>/dev/null + fi fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - mkiso() { echo "Writing FAI CD-ROM image to $isoname. This may need some time." - xorriso -report_about HINT -as mkisofs -graft-points -b $boot_image \ - -V "$vname" -A "$aname" \ - -no-emul-boot -boot-info-table --embedded-boot ${embed_image} -partition_offset 16 -no-pad -o $isoname \ - -R $tmp --sort-weight 0 / --sort-weight 1 /boot || die 12 "xorriso failed." + xorriso -report_about HINT -as mkisofs -iso-level 3 \ + -iso_mbr_part_type 00 \ + -full-iso9660-filenames \ + -volid "$vname" -appid "$aname" \ + -eltorito-boot boot/grub/bios.img \ + -no-emul-boot -boot-load-size 4 -boot-info-table \ + --eltorito-catalog boot/grub/boot.cat \ + --grub2-boot-info \ + --grub2-mbr $NFSROOT/usr/lib/grub/i386-pc/boot_hybrid.img \ + -eltorito-alt-boot -e EFI/efiboot.img -no-emul-boot \ + -append_partition 2 0xef $scratch/efiboot.img \ + -o $isoname -graft-points \ + --sort-weight 0 / --sort-weight 1 /boot \ + "$tmp" \ + /boot/grub/bios.img=$scratch/bios.img \ + /EFI/efiboot.img=$scratch/efiboot.img || die 12 "xorriso failed." + echo -n "ISO image size and filename: "; du -h $isoname unhide_dirs @@ -330,8 +356,8 @@ mkdir $tmp/$liveos/mounted-ext3fs/media/mirror - echo "Copying mirror to CD image" - cp -Pr $mirrordir/{dists,pool} $tmp/$liveos/mounted-ext3fs/media/mirror 2>/dev/null || die $? "Not enough space left on device for the mirror" + echo "Copying the mirror to CD image" + cp -Pr $mirrordir/{dists,pool} $tmp/$liveos/mounted-ext3fs/media/mirror 2>/dev/null || error_space $? "mirror" # create the sources.list for the CD cat > $tmp/$liveos/mounted-ext3fs/etc/apt/sources.list <> $tmp/squashfs-root/LiveOS/mounted-ext3fs/etc/apt/sources.list + echo "deb [trusted=yes] file:/media/mirror $i $comp" >> $tmp/squashfs-root/LiveOS/mounted-ext3fs/etc/apt/sources.list done } @@ -358,9 +384,10 @@ # main program # Parse commandline options -while getopts "AenkfhHg:JbSBMm:C:d:" opt ; do +while getopts "AekfhHg:Jbs:SBMn:m:V:c:C:d:" opt ; do case "$opt" in A) autodiscover=1 ;; + c) csdir="$OPTARG" ;; C) cdir="$OPTARG" ; arguments+=" -C $cdir";; e) hidevartmp=1 ;; f) forceremoval=1 ;; @@ -370,9 +397,12 @@ J) sqopt="-comp xz" ; arguments+=" -J";; M) nomirror=1 ;; m) mirrordir="$OPTARG" ;; + n) setnfsroot="$OPTARG" ;; b) burn=1 ; arguments+=" -b";; + s) space="$OPTARG" ;; S) squash_only=1 ;; B) bootonly=1 ;; + V) vname="$OPTARG" ;; d) config_space="$OPTARG"; configset=1 ; arguments+=" -d $config_space";; ?) usage ;; esac @@ -385,10 +415,15 @@ nomirror=1 bootonly=1 hidedirs=" - net/ceph - net/wireless sound + net/ceph + fs/ceph + fs/ocfs2 + fs/btrfs + fs/xfs + drivers/net/wireless drivers/block/drbd + drivers/hwmon drivers/staging/lustre drivers/scsi drivers/ata @@ -418,9 +453,7 @@ [ $(id -u) != "0" ] && die 9 "Run this program as root." fi -[ $squash_only -eq 1 -o -x "$(which xorriso)" ] || die 8 "xorriso not found. Please install package." -[ -x "$(which mksquashfs)" ] || die 8 "mksquashfs not found. Please install the package squashfs-tools." -[ -x "$(which strings)" ] || die 8 "command strings not found. Please install package binutils." +check_programs # use FAI_ETC_DIR from environment variable if [ -n "$FAI_ETC_DIR" -a -z "$cdir" ]; then @@ -438,6 +471,13 @@ . $cfdir/fai.conf . $cfdir/nfsroot.conf : ${FAI:=/var/lib/fai/config} # default value + +if [ -n "$setnfsroot" ]; then + NFSROOT=$setnfsroot # override by -n +fi +if [ -n "$csdir" ]; then + FAI_CONFIGDIR=$csdir # override by -c +fi ONFSROOT=$NFSROOT # save original nfsroot if [ $autodiscover -eq 1 ]; then @@ -462,12 +502,13 @@ [ -f "$grub_config" ] || die 13 "Grub menu file $grub_config not found." if [ $bootonly -eq 0 -o $configset -eq 1 ]; then - [ -z "$FAI_CONFIGDIR" ] && die 14 "Variable \$FAI_CONFIG not set." + [ -z "$FAI_CONFIGDIR" ] && die 14 "Variable \$FAI_CONFIGDIR not set." [ -d $FAI_CONFIGDIR ] || die 15 "Can't find config space $FAI_CONFIGDIR." [ -d $FAI_CONFIGDIR/class ] || die 16 "Config space $FAI_CONFIGDIR seems to be empty." fi tmp=$(mktemp -t -d fai-cd.XXXXXX) || exit 13 +scratch=$(mktemp -t -d scratch.XXXXXX) || exit 13 trap "cleanup_liveos_mounts" EXIT ERR @@ -487,7 +528,6 @@ kernelversion=$(ls -tr $NFSROOT/boot/vmlinu?-* | tail -1 | sed -e 's#.*/vmlinuz-##') faiversion=$(dpkg --root=$NFSROOT -l fai-client|awk '/fai-client/ {print $3}') isoversion=$(printf "FAI %-6s build $(date '+%Y %b %d - %R')" "$faiversion") -vname="FAI_CD" aname="Fully Automatic Installation by Thomas Lange, $isoversion" create_grub2_image diff -Nru fai-5.3.6ubuntu1/bin/fai-chboot fai-5.9.4ubuntu1/bin/fai-chboot --- fai-5.3.6ubuntu1/bin/fai-chboot 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-chboot 2020-04-27 02:48:17.000000000 +0000 @@ -5,7 +5,7 @@ # fai-chboot -- manage configuration for network boot # # This script is part of FAI (Fully Automatic Installation) -# Copyright (C) 2003-2016 Thomas Lange, lange@informatik.uni-koeln.de +# Copyright (C) 2003-2019 Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # #********************************************************************* @@ -34,7 +34,7 @@ use Getopt::Std; use File::Copy; -our ($opt_D,$opt_p,$opt_h,$opt_t,$opt_s,$opt_C,$opt_P,$opt_E,$opt_c,$opt_l,$opt_d,$opt_i,$opt_S,$opt_L,$opt_B,$opt_I,$opt_n,$opt_v,$opt_e,$opt_F,$opt_f,$opt_k,$opt_g,$opt_o,$opt_u,$opt_U); +our ($opt_D,$opt_p,$opt_h,$opt_t,$opt_s,$opt_C,$opt_P,$opt_E,$opt_c,$opt_l,$opt_d,$opt_i,$opt_S,$opt_L,$opt_B,$opt_I,$opt_n,$opt_v,$opt_e,$opt_F,$opt_f,$opt_k,$opt_g,$opt_o,$opt_u,$opt_U,$opt_q); our ($error,$pxedir,$nfsroot,$tftproot,$verbose,$append,$action,$kernelsuffix); our ($mac,$ipadr,$cfdir,$flags,$debug,$match,$bootprot); our (%hname,%hexname,%type,@allfiles,@templates,@enabled,@other,@patterns,@disabled); @@ -235,7 +235,9 @@ } close (CFG); - if ($opt_l && ! $opt_L) { + if ($opt_q) { + printf "%-16.16s $pxedir/$hex \n",$host; + } elsif ($opt_l && ! $opt_L) { if ($append =~ /FAI_ACTION=(\S+)/) { $append = $1; } else { @@ -350,21 +352,21 @@ ($ipadr,$srchex) = host2hex($srchost); if (-e "$pxedir/$srchex") { - $srcfile = "$pxedir/$srchex"; + $srcfile = "$srchex"; } elsif (-e "$pxedir/$srchex.disable") { - $srcfile = "$pxedir/$srchex.disable"; + $srcfile = "$srchex.disable"; } elsif (-e "$pxedir/$srchost" ) { - $srcfile = "$pxedir/$srchost"; + $srcfile = "$srchost"; } elsif (-e "$pxedir/$srchost.tmpl" ) { - $srcfile = "$pxedir/$srchost.tmpl"; + $srcfile = "$srchost.tmpl"; } else { warn "Source file for $srchost ($srchex) not available\n"; return; } } elsif ( -e "$pxedir/$srchost") { - $srcfile = "$pxedir/$srchost"; + $srcfile = "$srchost"; } elsif ( -e "$pxedir/$srchost.tmpl") { - $srcfile = "$pxedir/$srchost.tmpl"; + $srcfile = "$srchost.tmpl"; } else { warn "Source file for $srchost not available\n"; return; @@ -375,19 +377,19 @@ return; } print "copy pxe config from $srchost to template $desthost\n" if $verbose; - docopy($srcfile,$pxedir,$desthost,$desthost,$ipadr); + docopy("$pxedir/$srcfile",$pxedir,$desthost,$desthost,$ipadr); } else { ($ipadr,$desthex) = host2hex($desthost); if (-f "$pxedir/$desthex.disable") { unlink "$pxedir/$desthex.disable"; print "removed old $pxedir/$desthex.disable\n"; } - print "copy pxe config from $srchost to $desthost ($desthex)\n" if $verbose; - docopy($srcfile,$pxedir,$desthex,$desthost,$ipadr); + print "copy pxe config from $srchost to $desthost, filenames: $srcfile -> $desthex\n" if $verbose; + docopy("$pxedir/$srcfile",$pxedir,$desthex,$desthost,$ipadr); } } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -getopts('gBc:C:D:eEdhnvlLiIpf:Fk:Ss:tu:U:oP') || usage; +getopts('gBc:C:D:eEdhnvlLiIpf:Fk:Ss:tu:U:oPq') || usage; $opt_h and usage; $opt_n and $opt_v = 1; @@ -419,6 +421,7 @@ (-d $pxedir) || die "PXE directory $pxedir does not exist."; $opt_l and lsdir(@ARGV); +$opt_q and lsdir(@ARGV); if ($opt_d) { die "Missing host name(s). Can't disable network booting.\n" unless @ARGV; @@ -473,7 +476,7 @@ # create config so host will boot the install kernel $kernelname = "kernel ${opt_U}vmlinuz-$kernelsuffix"; $initrd = "initrd=${opt_U}initrd.img-$kernelsuffix"; - $rootfs = "root=$nfsroot $bopt"; + $rootfs = "root=$nfsroot:vers=3 $bopt"; $bootprot = "ip=dhcp "; } elsif ($opt_o) { diff -Nru fai-5.3.6ubuntu1/bin/fai-debconf fai-5.9.4ubuntu1/bin/fai-debconf --- fai-5.3.6ubuntu1/bin/fai-debconf 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-debconf 2020-04-27 02:48:17.000000000 +0000 @@ -37,7 +37,7 @@ for class in $classes ; do [ -f $class ] && add_data $class if [ -d $class ]; then - for f in $(ls $class/* | egrep '^[[:alnum:]/_.-]+$') ; do + for f in $(ls $class/* | grep -E '^[[:alnum:]/_.-]+$') ; do [ -f $f ] && add_data $f done fi diff -Nru fai-5.3.6ubuntu1/bin/fai-deps fai-5.9.4ubuntu1/bin/fai-deps --- fai-5.3.6ubuntu1/bin/fai-deps 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-deps 2020-04-27 02:48:16.000000000 +0000 @@ -248,7 +248,7 @@ =head1 SEE ALSO - http://fai-project.org + https://fai-project.org =head1 AUTHOR diff -Nru fai-5.3.6ubuntu1/bin/fai-diskimage fai-5.9.4ubuntu1/bin/fai-diskimage --- fai-5.3.6ubuntu1/bin/fai-diskimage 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-diskimage 2020-04-27 02:48:17.000000000 +0000 @@ -4,14 +4,12 @@ # This script is part of FAI (Fully Automatic Installation) # -# Copyright (C) 2016-2017 Thomas Lange, lange@informatik.uni-koeln.de +# Copyright (C) 2016-2018 Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # this script neither needs /etc/fai nor the nfsroot. Only the config space is needed # should unshare be used ? -set -e - die() { local e=$1 # first parameter is the exit code @@ -23,19 +21,28 @@ cleanup() { - set +e - local dirs dir + local dir for dir in $(mount | awk '{print $3}'| grep $mnt | sort -r); do # try umount several times, because some postinst jobs may still run and use the filesystems for i in {1..8}; do - umount $dir >/dev/null 2>&1 + umount $dir >&/dev/null [ $? -eq 0 ] && break [ $(($i % 3)) -eq 0 ] && echo "Waiting for background jobs to finish." sleep $i done done - set -e + + # call zerofree for ext2/3/4 devices if available + if [ -f /var/run/fai/zerofree.$$ -a -x /usr/sbin/zerofree ]; then + . /var/run/fai/zerofree.$$ 2>/dev/null + rm /var/run/fai/zerofree.$$ + fi losetup -d $loop + # if FAI created a volume group, we can remove it after the loop device is removed + if [ -f /var/run/fai/vgremove.$$ ]; then + . /var/run/fai/vgremove.$$ 2>/dev/null + rm /var/run/fai/vgremove.$$ + fi rm -rf $mnt if [ -f /var/run/fai/FAI_INSTALLATION_IN_PROGRESS ]; then if pgrep -F /var/run/fai/FAI_INSTALLATION_IN_PROGRESS; then @@ -53,11 +60,10 @@ Create a disk image name.raw using FAI and a list of FAI classes. This can be used for a virtual machine or a cloud instance. If you use another suffix the image will be converted. Following formats are -supported: .qcow2, .vdi, .vhdx, .vmdk. +supported: .raw.xz, .raw.zst, .qcow2, .vdi, .vhdx, .vmdk, .simg. -h|--help print help -v|--verbose be verbose - -D|--debug enter debugging -N|--new execute scripts class/[0-9]* for defining classes -c|--class define list of FAI classes -S|--size size of raw image (suffixes k M G T are supported) @@ -70,11 +76,11 @@ check_commands() { local error=0 - if ! type qemu-img > /dev/null 2>&1; then + if ! command -v qemu-img >&/dev/null; then echo "qemu-img not found. Install the package qemu-utils." error=1 fi - if ! type setup-storage > /dev/null 2>&1; then + if ! command -v setup-storage >&/dev/null; then echo "setup-storage not found. Install the package fai-setup-storage." error=1 fi @@ -86,7 +92,7 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call="$0 $*" -TEMP=$(getopt -o NDS:s:u:hvc: --long new,debug,cspace:,hostname:,class:,size:,help,verbose -n "$0" -- "$@") +TEMP=$(getopt -o NS:s:u:hvc: --long new,cspace:,hostname:,class:,size:,help,verbose -n "$0" -- "$@") if [ $? != 0 ] ; then die 6 "Wrong option. Terminating." >&2 ; fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" @@ -94,15 +100,11 @@ verbose=0 convert=1 -debug=0 while true ; do case "$1" in -h|--help) usage 0 ;; - -D|--debug) - debug=1 - shift ;; -v|--verbose) export verbose=1 shift ;; @@ -139,6 +141,29 @@ rawname="$iname.raw" case $ext in raw) convert=0 ;; + xz) convert=2 + rawname=$iname + export XZ_OPT=${XZ_OPT-"-1 -T0"} + cmd="xz $rawname" + ;; + zst) convert=2 + rawname=$iname + # check if zstd support threads + flagtest=$(zstd -h | grep threads) + if [ -z "$flagtest" ]; then + cmd="zstd --rm -q -9 $rawname" + else + cmd="zstd --rm -q -9 -T0 $rawname" + fi + unset flagtest + ;; + simg) convert=2 + cmd="img2simg $rawname $iname.simg" + if ! command -v img2simg >&/dev/null; then + echo "img2simg not found. Install the package img2simg." + error=1 + fi + ;; qcow2) copt="-c -O qcow2 " qcowname="$iname.qcow2" ;; @@ -174,6 +199,10 @@ die 1 "Run this program as root." fi +if command -v vgs >&/dev/null; then + export SS_IGNORE_VG=$(vgs --unbuffered --noheadings -o name --rows) +fi + # create empty disk image, loop setup, temp mount point rm -f $rawname qemu-img create $rawname $size @@ -182,30 +211,24 @@ export disklist=$loopdev mnt=$(mktemp -d -t fai-diskimage.XXXXXX) -trap "cleanup" ERR +trap "cleanup" EXIT LC_ALL=C fai $renew -u $hname -s $uri -c$classes install $mnt - -# do not umount for debugging purpose -if [ $debug -eq 1 ]; then - echo "===================================================================" - echo "The chroot is mounted on $mnt." - echo "${0##*/} now halted." - echo "After debugging, call kill -CONT $$, to continue the process." - echo "===================================================================" - kill -STOP $$ || true -fi - +error=$? cleanup -trap - ERR -set +e +trap - EXIT + # convert if needed if [ $convert -eq 1 ]; then [ $verbose -eq 1 ] && echo "Converting $rawname to $qcowname." qemu-img convert -f raw $rawname $copt $qcowname rm $rawname fi +if [ $convert -eq 2 ]; then + [ $verbose -eq 1 ] && echo "Converting $rawname to $rawname.$ext." + $cmd +fi echo -n "Size of disk image and filename: "; du -h $image echo "Image created by: $call" -exit 0 +exit $error diff -Nru fai-5.3.6ubuntu1/bin/fai-do-scripts fai-5.9.4ubuntu1/bin/fai-do-scripts --- fai-5.3.6ubuntu1/bin/fai-do-scripts 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-do-scripts 2020-04-27 02:48:17.000000000 +0000 @@ -182,7 +182,13 @@ fc_check_status $file $exitcode | tee -a $LOGDIR/ruby.log ;; - *) echo "File $file has unsupported type $filetype." ;; + *) + vecho "Executing: $file" + echo "===== $filetype $file =====" >> $LOGDIR/scripts.log 2>&1 + ./$file >> $LOGDIR/scripts.log 2>&1 + savemaxstatus $? + fc_check_status $file $exitcode | tee -a $LOGDIR/scripts.log + ;; esac } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru fai-5.3.6ubuntu1/bin/fai-link fai-5.9.4ubuntu1/bin/fai-link --- fai-5.3.6ubuntu1/bin/fai-link 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-link 2020-01-25 08:17:50.000000000 +0000 @@ -0,0 +1,48 @@ +#! /bin/bash + +# create a symlink, idempotent +# +# (c) Thomas Lange 2019, lange@debian.org +# +# if $target is defined, create link relative to $target + +mk-link() { + + + local from=$1 + local to=$2 + local oldto + local vopt + + if [ X$verbose = X1 ]; then + vopt=-v + fi + + # todo: check if $from starts with a slash + + if [ -n "$target" ]; then + from="$target$from" + fi + + if [ ! -e $from -a ! -h $from ]; then + ln -s $vopt $to $from + return + fi + + # check if already same link + if [ -h $from ]; then + oldto=$(readlink $from) + if [ $oldto = $to ]; then + if [ X$verbose = X1 ]; then + printf "fai-link: Nothing to do for link $from -> $to\n" + fi + return + fi + fi + + # if different create new link + ln -sf $vopt $to $from +} + +# make link from to +mk-link $1 $2 diff -Nru fai-5.3.6ubuntu1/bin/fai-make-nfsroot fai-5.9.4ubuntu1/bin/fai-make-nfsroot --- fai-5.3.6ubuntu1/bin/fai-make-nfsroot 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-make-nfsroot 2020-04-27 02:48:17.000000000 +0000 @@ -5,7 +5,7 @@ # fai-make-nfsroot -- create nfsroot directory and add additional packages # # This script is part of FAI (Fully Automatic Installation) -# (c) 2000-2016 by Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2000-2020 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # (c) 2004 by Henning Glawe, glaweh@physik.fu-berlin.de # Freie Universitaet Berlin @@ -32,7 +32,7 @@ usage() { cat <<-EOF - Copyright (C) 1999-2016 Thomas Lange + Copyright (C) 1999-2020 Thomas Lange Usage: fai-make-nfsroot [OPTIONS] Create an NFSROOT for FAI. @@ -69,10 +69,10 @@ fi echo "FAI packages and related packages inside the nfsroot:" - $ROOTCMD dpkg-query -W -f='${Package;-18} ${Version}\n' fai-client fai-nfsroot fai-setup-storage dracut-network dracut 2>/dev/null + $ROOTCMD dpkg-query -W -f='${Package;-18} ${Version}\n' fai-client fai-nfsroot fai-setup-storage dracut-network dracut dracut-live dracut-squash 2>/dev/null # check if all important packages are installed - n=$($ROOTCMD dpkg-query -l fai-client fai-nfsroot fai-setup-storage dracut-network dracut 2>/dev/null|egrep ^ii |wc -l) + n=$($ROOTCMD dpkg-query -l fai-client fai-nfsroot fai-setup-storage dracut-network dracut 2>/dev/null|grep -E ^ii |wc -l) if [ $n -ne 5 ]; then echo "ERROR: Some essential pacakges are missing." bad_exit @@ -80,7 +80,7 @@ local files=$(ls $NFSROOT/boot/initrd* 2>/dev/null) [ -z "$files" ] && die 1 "No initrd installed." - egrep -q "^ERROR: |^E: Sub-process |^dpkg: error processing |^dpkg: dependency problems" /var/log/fai/fai-make-nfsroot.log && bad_exit + grep -E -q "^ERROR: |^E: Sub-process |^dpkg: error processing |^dpkg: dependency problems" /var/log/fai/fai-make-nfsroot.log && bad_exit return 0 } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -94,9 +94,10 @@ generic=0 force=0 usexz=1 +full=1 # option e currently does nothing -while getopts aghervC:B:fkKpUz opt ; do +while getopts aghervC:B:fkKpPUzsN opt ; do case "$opt" in a) adjust=1 ;; g) generic=1 ;; @@ -109,9 +110,12 @@ f) force=1 ;; k) kinstall=1 ;; K) kremove=1;; + N) nonfree=NONFREE ;; h) usage ;; e) expert=1 ;; # a dummy option, that only fai-setup uses p) sshpreserve=1 ;; + P) sshpreserve=2 ;; + s) full=0 ;; # do only install a smaller list of packages ?) exit 5 ;; # error in option parsing esac done @@ -182,11 +186,16 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - setclasses() { - local iarch distro + local iarch distro c # Export all the information we have about the system iarch=$($ROOTCMD dpkg --print-architecture|tr /a-z/ /A-Z/) distro=$(. $NFSROOT/etc/os-release; echo ${ID} ${ID}_${VERSION_ID} | tr '[:lower:].' '[:upper:]_') - export classes="NFSROOT $iarch $distro" + + # do we want to install the full list of packages? + if [ $full = 1 ]; then + c=FULL + fi + export classes="NFSROOT $c $iarch $distro $nonfree" if [ X$verbose = X1 ] ; then echo Classes are set to $classes fi @@ -201,7 +210,7 @@ sed -i -e '/PermitRootLogin/d' $NFSROOT/etc/ssh/sshd_config ainsl $NFSROOT/etc/ssh/sshd_config 'PermitRootLogin yes' - if [ $sshpreserve = 1 ]; then + if [ $sshpreserve -ge 1 ]; then tar -C $NFSROOT -xf $tmptar rm $tmptar return 0 @@ -212,8 +221,8 @@ loguserhome=$(eval "cd ~$LOGUSER 2>/dev/null && pwd;true") [ -f $loguserhome/.ssh/known_hosts ] && cp $loguserhome/.ssh/known_hosts $NFSROOT/root/.ssh/known_hosts [ -d $loguserhome/.ssh ] && { - [ -f $loguserhome/.ssh/id_dsa ] && - cp -p $loguserhome/.ssh/id_dsa* $NFSROOT/root/.ssh/ + [ -f $loguserhome/.ssh/id_ed25519 ] && + cp -p $loguserhome/.ssh/id_ed25519* $NFSROOT/root/.ssh/ [ -f $loguserhome/.ssh/id_rsa ] && cp -p $loguserhome/.ssh/id_rsa* $NFSROOT/root/.ssh/ } @@ -239,19 +248,43 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call_debootstrap() { + local targetarch hostarch1 hostarch2 _debootstrap [ -z "$FAI_DEBOOTSTRAP" ] && die 4 "\$FAI_DEBOOTSTRAP not defined." # check if NFSROOT directory is mounted with bad options fs=$(df -P $NFSROOT | tail -1 | awk '{print $6}') - if mount | grep "on $fs " | awk '{print $6}' | egrep -q "nosuid|nodev"; then + if mount | grep "on $fs " | awk '{print $6}' | grep -E -q "nosuid|nodev"; then die 1 "NFSROOT directory $NFSROOT is mounted using nosuid or nodev. Aborting" fi - local dversion=$(dpkg -l debootstrap | awk '/debootstrap/ {print $3}') + local dversion=$(dpkg-query -Wf '${Version}\n' debootstrap) echo "Creating base system using debootstrap version $dversion" - echo "Calling debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $NFSROOT $2" - LC_ALL=C call_verbose debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $NFSROOT $2 + + # Check if we need cross architecture debootstrap + targetarch=$(echo "$(expr "$FAI_DEBOOTSTRAP_OPTS" : '.*--arch[=[:space:]]\([^[:space:]]*\)' || true)" | tail -n 1) + hostarch1=$(dpkg --print-architecture) + hostarch2=$(dpkg --print-foreign-architectures) + if [ -z "$hostarch2" ]; then + hostarch2=$hostarch1 + fi + + _debootstrap=qemu-debootstrap + if [ -z "$targetarch" ]; then + _debootstrap=debootstrap + else + if [ $targetarch = $hostarch1 -o $targetarch = $hostarch2 ]; then + _debootstrap=debootstrap + fi + fi + if [ $_debootstrap = "qemu-debootstrap" ]; then + if ! command -v $_debootstrap >&/dev/null; then + die 1 "qemu-debootstrap not found. Please install the package qemu-user-static." + fi + fi + + echo "Calling $_debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $NFSROOT $2" + LC_ALL=C call_verbose $_debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $NFSROOT $2 if [ $? -ne 0 ]; then - echo "ERROR: debootstrap did not complete successfully." + echo "ERROR: $_debootstrap did not complete successfully." echo "This is mostly caused by a broken mirror." echo "Please check your mirror or use an official mirror." [ X$verbose = X1 ] || echo "Call fai-make-nfsroot -v for better debugging." @@ -260,7 +293,7 @@ if [ ! -f $NFSROOT/usr/bin/apt-get ]; then echo "No apt-get executable available inside the NFSROOT." - echo "Maybe debootstrap did not finish successfully. Aborting." + echo "Maybe $_debootstrap did not finish successfully. Aborting." [ X$verbose = X1 ] || echo "Call fai-make-nfsroot -v for better debugging." exit 11 fi @@ -274,7 +307,7 @@ ainsl $v $NFSROOT/etc/hosts "$NFSROOT_ETC_HOSTS" # add entries for all network devices - local ips=$(ip addr show up| grep -w inet | cut -d t -f 2 | cut -d ' ' -f 2 | cut -d / -f 1 | grep -v 127.0.0.1) + local ips=$(ip addr show up| grep -P -o '(?<=inet )[^/]+' | grep -v 127.0.0.1) local line for eth in $ips; do @@ -294,7 +327,7 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - create_base() { - [ ! -x "$(which debootstrap)" ] && die 1 "Can't find debootstrap command. Aborting." + command -v debootstrap >&/dev/null || die 1 "Can't find debootstrap command. Aborting." call_debootstrap $FAI_DEBOOTSTRAP $ROOTCMD apt-get clean rm -f $NFSROOT/etc/resolv.conf $NFSROOT/etc/hostname $NFSROOT/etc/udev/rules.d/70-persistent-net.rules @@ -303,7 +336,7 @@ else echo "Creating base.tar.xz" fi - tar --one-file-system -C $NFSROOT -cf $NFSROOT/var/tmp/base.tar --exclude etc/machine-id --exclude var/tmp/base.tar --exclude 'var/lib/apt/lists/*_*' . + tar --xattrs --acls --one-file-system -C $NFSROOT -cf $NFSROOT/var/tmp/base.tar --exclude etc/machine-id --exclude var/tmp/base.tar --exclude 'var/lib/apt/lists/*_*' . if [ $usexz -eq 1 ]; then nice xz -q $NFSROOT/var/tmp/base.tar & else @@ -321,12 +354,12 @@ printf "Extracting $basetgz: " case $basetgz in *tar.gz|*.tgz) - tar -C $NFSROOT -zxpf "$basetgz" || die 1 "Error while extracting ${basetgz} in ${NFSROOT}." + tar --xattrs --acls --xattrs-include=* -C $NFSROOT -zxpf "$basetgz" || die 1 "Error while extracting ${basetgz} in ${NFSROOT}." cp -p "$basetgz" $NFSROOT/var/tmp/base.tar.gz ;; *tar.xz|*.txz) - tar -C $NFSROOT -Jxpf "$basetgz" || die 1 "Error while extracting ${basetgz} in ${NFSROOT}." + tar --xattrs --acls --xattrs-include=* -C $NFSROOT -Jxpf "$basetgz" || die 1 "Error while extracting ${basetgz} in ${NFSROOT}." cp -p "$basetgz" $NFSROOT/var/tmp/base.tar.xz ;; esac @@ -336,6 +369,8 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - create_nfsroot() { + local fslist + mkdir -p $NFSROOT/$FAI cd $NFSROOT || die 1 "Can't cd to $NFSROOT" @@ -348,7 +383,6 @@ # save the list of all packages in the base.tar.gz $ROOTCMD dpkg --get-selections | awk '/install$/ {print $1}' > var/tmp/base-pkgs.lis - setclasses if [ -n "$FAI_DEBMIRROR" ]; then [ X$verbose = X1 ] && echo "Mounting $FAI_DEBMIRROR to $NFSROOT/$MNTPOINT." mkdir -p $NFSROOT/$MNTPOINT @@ -359,20 +393,12 @@ # liloconfig, dump needs this file > etc/fstab - # Work around Ubuntu's failure in installing rsyslog with - # "start: Unable to connect to Upstart: Failed to connect to - # socket /com/ubuntu/upstart: Connection refused" - if $ROOTCMD which dpkg-divert >/dev/null 2>&1 && [ -x $NFSROOT/sbin/initctl ] ; then - LC_ALL=C $ROOTCMD dpkg-divert --quiet --add --rename /sbin/initctl - ln -sf /bin/true $NFSROOT/sbin/initctl - INITCTL_DIVERT=true - fi - # we need these option before installing the first package. So we # can't put this into fai-nfsroot /etc/apt/apt.conf.d/90fai cat >$NFSROOT/etc/apt/apt.conf.d/10fai < $NFSROOT/etc/dracut.conf.d/12-no-systemd.conf - echo 'add_dracutmodules+=" livenet "' > $NFSROOT/etc/dracut.conf.d/13-add-cd-support.conf + echo 'omit_dracutmodules+=" dracut-systemd systemd systemd-initrd systemd-networkd systemd-initrd "' > $NFSROOT/etc/dracut.conf.d/12-no-systemd.conf + if [ $full = 1 ];then + echo 'add_dracutmodules+=" livenet "' > $NFSROOT/etc/dracut.conf.d/13-add-cd-support.conf + fslist="nfs lockd ext4" + else + echo 'add_dracutmodules+=" dmsquash-live "' > $NFSROOT/etc/dracut.conf.d/13-add-cd-support.conf + fslist="ext4" + fi echo 'hostonly="no"' > $NFSROOT/etc/dracut.conf.d/20-generic-image.conf cat < $NFSROOT/etc/dracut.conf.d/01-omit.conf -omit_dracutmodules+=" btrfs lvm resume usrmount mdraid shutdown dracut-systemd systemd systemd-initrd systemd-networkd systemd-initrd " -filesystems="nfs lockd ext4" +omit_dracutmodules+=" btrfs crypt dash lvm resume usrmount modsign mdraid shutdown dracut-systemd systemd systemd-initrd systemd-networkd systemd-initrd " +filesystems="$fslist" EOF local fname=$(readlink -f $cfdir/apt/sources.list) @@ -406,8 +438,13 @@ [ X$verbose = X1 ] && echo "Upgrading $NFSROOT" LC_ALL=C call_verbose upgrade_nfsroot - LC_ALL=C add_packages_nfsroot + + # remove file diversion, then create initrd + rm $NFSROOT/etc/kernel/postinst.d/dracut + $ROOTCMD dpkg-divert --rename --remove /etc/kernel/postinst.d/dracut + $ROOTCMD dpkg-reconfigure dracut + set_root_pw # set timezone in nfsroot @@ -415,12 +452,9 @@ cp -a /etc/localtime etc/localtime ln -sf /proc/mounts etc/mtab - [ -f etc/init/tty1.conf ] || ln -s /usr/sbin/fai etc/init.d/rcS - if [ -d etc/init ]; then # if upstart is available - find etc/init ! -type d | egrep -v "fai|udev|hostname|mountall|mounted" | xargs -r rm - fi + ln -s /usr/sbin/fai etc/init.d/rcS - rm -f etc/mdadm/mdadm.conf # remove file which may contain info of the install server + echo "AUTO -all" > etc/mdadm/mdadm.conf # do not activate RAID arrays # this second rm of the same file is needed! rm -f etc/udev/rules.d/70-persistent-net.rules # remove Ubuntu-specific rules to auto-start volume groups, which confuses @@ -441,6 +475,9 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - upgrade_nfsroot() { + local pkgs + + mkdir -p $NFSROOT/dev/pts mount -t proc /proc $NFSROOT/proc mount -t sysfs /sys $NFSROOT/sys mount -t devpts devpts $NFSROOT/dev/pts @@ -450,21 +487,38 @@ # add any 3rd party repository keys that you may need installed into the NFSROOT if [ -d $cfdir/apt/keys ]; then local f - for f in `find $cfdir/apt/keys -type f -name '*.asc'`; do - cat $f | $ROOTCMD apt-key add - + for f in `find $cfdir/apt/keys -type f -name '*.asc' -o -name '*.gpg'`; do + cp $f $NFSROOT/etc/apt/trusted.gpg.d done fi # if we have the keyring on the host, install the key of the fai-project.org package repository - if [ -n "$(apt-key list | grep 074BCDE4)" ]; then - HOME=/root apt-key export 074BCDE4 | chroot $NFSROOT apt-key add - + if [ ! -f $NFSROOT/etc/apt/trusted.gpg.d/fai-project.gpg -a -n "$(apt-key list 2BF8D9FE074BCDE4 2>/dev/null)" ]; then + HOME=/root apt-key export 2BF8D9FE074BCDE4 > $NFSROOT/etc/apt/trusted.gpg.d/fai-project.asc + fi + + if [ $full = 1 ];then + pkgs=nfs-common fi $ROOTCMD apt-get update + # check if we need more dracut packages (dracut >=049) + set +e + $ROOTCMD apt show dracut-live dracut-squash >/dev/null 2>/dev/null + if [ $? -eq 0 ]; then + pkgs+=" dracut-live dracut-squash" + fi + set -e + # disable generating the initrd + fdivert /etc/kernel/postinst.d/dracut + $ROOTCMD ln -s /bin/true /etc/kernel/postinst.d/dracut + # fai-nfsroot must be sucessfully installed before anything else - $ROOTCMD apt-get -yf --no-install-recommends install fai-nfsroot - $ROOTCMD apt-get -yf --no-install-recommends install dracut-network dracut-config-generic nfs-common + $ROOTCMD apt-get -yf --no-install-recommends install fai-nfsroot dracut-network dracut-config-generic $pkgs $ROOTCMD apt-get -y dist-upgrade + # patch dracut. Do not fail if network is not available + local fn=$(find $NFSROOT/usr/lib/dracut/modules.d/ -name net-genrules.sh) + sed -i -e 's/exit 1/exit 0/' $fn fdivert /usr/sbin/update-grub } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -511,24 +565,20 @@ setup_tftp(){ # tftp environment - local pxebin - - # wheezy path - if [ -f $NFSROOT/usr/lib/PXELINUX/pxelinux.0 ]; then - pxebin=$NFSROOT/usr/lib/PXELINUX/pxelinux.0 - else - # jessie/stretch path - pxebin=$NFSROOT/usr/lib/syslinux/pxelinux.0 - fi - rm -f $NFSROOT/boot/*.bak mkdir -p $TFTPROOT/pxelinux.cfg chmod a+r $NFSROOT/boot/initrd.img-* || die 9 "No initrd was created. Check the package name of the linux-image package in /etc/fai/NFSROOT." cp -p $v $NFSROOT/boot/vmlinu?-* $NFSROOT/boot/initrd.img-* $TFTPROOT - cp -u $pxebin $TFTPROOT + cp -u $v $NFSROOT/usr/lib/PXELINUX/pxelinux.0 $TFTPROOT if [ -f $NFSROOT/usr/lib/syslinux/modules/bios/ldlinux.c32 ]; then cp -u $NFSROOT/usr/lib/syslinux/modules/bios/ldlinux.c32 $TFTPROOT fi + if [ -f $NFSROOT/usr/lib/syslinux/modules/efi64/ldlinux.e64 ]; then + cp -u $NFSROOT/usr/lib/syslinux/modules/efi64/ldlinux.e64 $TFTPROOT + fi + if [ -f $NFSROOT/usr/lib/SYSLINUX.EFI/efi64/syslinux.efi ]; then + cp -u $NFSROOT/usr/lib/SYSLINUX.EFI/efi64/syslinux.efi $TFTPROOT + fi if [ X$verbose = X1 ]; then echo "TFTP environment prepared. Enable DHCP and start the TFTP daemon on root $TFTPROOT." fi @@ -576,7 +626,9 @@ # remove all kernels from nfsroot [ -n "$kremove" ] && { echo "Removing all kernels from NFSROOT." - $ROOTCMD aptitude -y purge ~nlinux-image + LC_ALL=C $ROOTCMD apt-cache dumpavail > $NFSROOT/var/lib/dpkg/available + LC_ALL=C $ROOTCMD apt-get -qq purge linux-image\* + rm $NFSROOT/var/lib/dpkg/available exit } @@ -612,21 +664,26 @@ echo "Creating FAI nfsroot in $NFSROOT" -if [ $sshpreserve = 1 ]; then - [ -d $NFSROOT/root/.ssh ] || die 8 "Cannot preserve non-existing $NFSROOT/root/.ssh." - [ X$verbose = X1 ] && echo "Preserving root/.ssh directory from inside the nfsroot." - # save old .ssh directory +if [ $sshpreserve -ge 1 ]; then + [ -d $NFSROOT/root/.ssh ] || echo "Cannot preserve non-existing $NFSROOT/root/.ssh." tmptar=$(mktemp) || die 12 "Cannot create tmp file" - # should we set the umask before? Does it influence the other parts? - tar -C $NFSROOT -cf $tmptar root/.ssh + pdirs="root/.ssh" + if [ $sshpreserve -eq 2 ]; then + pdirs="root/.ssh etc/ssh/ssh_host_*" + fi + [ X$verbose = X1 ] && echo "Preserving $pdirs from inside the nfsroot." + cd $NFSROOT # needed for * in $pdirs to work + tar -C $NFSROOT -cf $tmptar $pdirs + cd - fi if [ -d $NFSROOT/proc ]; then - umount $NFSROOT/dev/pts 1>/dev/null 2>&1 || true + umount $NFSROOT/dev/pts >&/dev/null || true [ -L $NFSROOT/proc/self ] && umount $NFSROOT/proc || true [ -L $NFSROOT/proc/self ] && die 1 "/proc is still mounted inside the nfsroot." umount $NFSROOT/$MNTPOINT 2>/dev/null || true # it's safer to try to umount # remove old nfsroot using a background process + rm -rf $deldir/../.will-now-be-deleted mv $deldir $deldir/../.will-now-be-deleted if [ $? -eq 1 ]; then rm -rf $deldir @@ -648,12 +705,6 @@ ainsl -as $NFSROOT/etc/hosts "127.0.0.1 localhost" fi -# get rid of initctl divert again -if [ "$INITCTL_DIVERT" = true ] ; then - rm -f $NFSROOT/sbin/initctl - LC_ALL=C $ROOTCMD dpkg-divert --rename --remove /sbin/initctl -fi - umount_dirs # Wait for background jobs to finish diff -Nru fai-5.3.6ubuntu1/bin/fai-mirror fai-5.9.4ubuntu1/bin/fai-mirror --- fai-5.3.6ubuntu1/bin/fai-mirror 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-mirror 2020-04-27 02:48:17.000000000 +0000 @@ -5,7 +5,7 @@ # fai-mirror -- create and manage a partial mirror for FAI # # This script is part of FAI (Fully Automatic Installation) -# (c) 2004-2016, Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2004-2019, Thomas Lange, lange@informatik.uni-koeln.de # #********************************************************************* # This program is free software; you can redistribute it and/or modify @@ -89,6 +89,7 @@ -o Aptitude::Log=/dev/null \ -o Aptitude::CmdLine::Ignore-Trust-Violations=yes\ -o APT::Get::AllowUnauthenticated=true \ + -o Acquire::AllowInsecureRepositories=true \ -o DPkg::force-conflicts::=yes \ -o Dir::State=$aptcache/var/lib/apt \ -o Dir::Log=$aptcache/var/log/apt \ @@ -155,7 +156,7 @@ mv $aptcache/etc/apt/sources.list $aptcache # save sources.list # now use different sources.list for debootstrap packages - echo "$FAI_DEBOOTSTRAP" | awk '{printf "deb %s %s main\n",$2,$1}' | perl -p -e 's/file:/copy:/' > $aptcache/etc/apt/sources.list + echo "$FAI_DEBOOTSTRAP" | awk '{printf "deb %s %s main\n",$2,$1}' | sed -e 's/file:/copy:/' > $aptcache/etc/apt/sources.list echo "Adding packages from $NFSROOT/var/tmp/base-pkgs.lis" if [ -f $NFSROOT/var/tmp/base-pkgs.lis ]; then plist=$(< $NFSROOT/var/tmp/base-pkgs.lis) @@ -171,6 +172,7 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - set-classes() { + local addclasses # if -c is given, ignore -x if [ -n "$cclasses" ]; then export classes=${cclasses//,/ } @@ -179,20 +181,80 @@ set +e # all available file names are classes - classes=$(cd $FAI_CONFIGDIR/package_config; ls -1 | egrep -i "^[a-zA-Z0-9_-]+$") + classes=$(cd $FAI_CONFIGDIR/package_config; ls -1 | grep -E -i "^[a-zA-Z0-9_-]+$") addclasses=$(grep -h PACKAGES $FAI_CONFIGDIR/package_config/* | sed -e 's/#.*//' | awk '{printf $3"\n"$4"\n"$5"\n"$6"\n"}') export classes=$(echo -e "$classes\n$addclasses\n" | sort | uniq) [ -n "$exclasses" ] && excludeclass $exclasses set -e } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +mk_class_var_list() { + + # create a list of files named class/*.var that contain a definition of a variable that is + # used in package_config/ + + # we assume, that variables used in package_config are defined in class/*.var. + # For all classes search if there's a variables used in package_config/CLASS + # For all variables found look which files class/CLASS.var define these variables. + + local -a variables=() + local filelist classlist sourefiles + local c i f + + #filelist: all files in package_config which are also a defined class + for c in $classes; do + if [ -f $FAI_CONFIGDIR/package_config/$c ]; then + filelist+=" $c" + fi + done + + if [ -z "$filelist" ]; then + return + fi + + # make the list of variables that are used + # regex: $abc or ${abc} + variables=($(cd $FAI_CONFIGDIR/package_config;grep -h -P -o '\$[A-Za-z0-9_]+|\$\{[A-Za-z0-9_]+\}' $filelist|sort|uniq)) + + # debug + #for v in ${variables[@]}; do + # echo Variable found: $v + #done + + # create a regex like varname= for all variables + for i in ${!variables[@]}; do + variables[i]=$(echo ${variables[i]} | tr -d /{}$/) + variables[i]+="=" + done + + # classlist: make list of files in class, which are also a class + for c in $classes; do + if [ -f $FAI_CONFIGDIR/class/$c.var ]; then + classlist+=" $FAI_CONFIGDIR/class/$c.var" + fi + done + # look for variable definition in this list + for f in $classlist; do + for i in ${!variables[@]}; do + if grep -q -P "${variables[i]}" $f; then + sourefiles+=" $f" + break + fi + done + done + + # these files contain a variable definition which is needed + echo $sourefiles +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - preserve=0 verbose=0 add=1 qflag=-qq bcount=0 -while getopts "a:bBvhx:pc:C:m:P:" opt ; do +setvariables=0 +while getopts "a:bBvhx:pc:C:m:s:P:V" opt ; do case "$opt" in a) arch=$OPTARG ;; B) add=0 ; ((bcount++)) ;; @@ -203,7 +265,9 @@ c) cclasses="$OPTARG";; m) MAXPACKAGES="$OPTARG";; p) preserve=1;; + s) csdir="$OPTARG";; v) verbose=1; vflag=-v; qflag='';; + V) setvariables=1 ;; P) aptpref="$OPTARG";; ?) die 1 "Unknown option";; esac @@ -221,16 +285,18 @@ . $cfdir/fai.conf . $cfdir/nfsroot.conf : ${MNTPOINT:=/media/mirror} # default value - export NFSROOT -[ -x "$(which reprepro)" ] || die 8 "reprepro not found. Please install the package." +if [ -n "$csdir" ]; then + FAI_CONFIGDIR=$csdir # override by -s +fi +command -v reprepro >&/dev/null || die 8 "reprepro not found. Please install the package." [ -n "$exclasses" -a -n "$cclasses" ] && die 3 "Options -x and -c not allowed at the same time." # use first argument if given, use variable mirrordir if not argument was given [ -n "$1" ] && mirrordir=$1 [ -z "$mirrordir" ] && die 2 "Please give the absolute path to the mirror." -{ echo $mirrordir | egrep -q '^/'; } || die 4 "Mirrordir must start with a slash /." +{ echo $mirrordir | grep -E -q '^/'; } || die 4 "Mirrordir must start with a slash /." [ -d $FAI_CONFIGDIR/package_config ] || die 6 "Can't find package config files in $FAI_CONFIGDIR." @@ -238,6 +304,17 @@ : ${MAXPACKAGES:=1} export MAXPACKAGES +set-classes +if [ "$setvariables" -eq 1 ]; then + flist=$(mk_class_var_list) + set -a + for f in $flist; do + echo Sourcing variable definitions in $f + source $flist + done + set +a +fi + initialize # if we are using nfs mounts for Debian mirror, this may fail here, since inside a chroot environment different dir are used @@ -257,35 +334,69 @@ if [ -f "$aptpref" ]; then cp "$aptpref" $aptcache/etc/apt/preferences fi + +# use the trusted keys from the host +cp -a /etc/apt/trusted.gpg.d $aptcache/etc/apt + echo "Getting package information" apt-get $qflag $aptoptions update >/dev/null -set-classes [ $add -eq 1 ] && add_base_packages echo "Downloading packages for classes:" $classes -FAI=$FAI_CONFIGDIR install_packages -N -d $vflag +if FAI=$FAI_CONFIGDIR install_packages -N -d $vflag; then + : +else + die 9 "ERROR when downloading packages. Your mirror is broken. Use fai-mirror -v for details." +fi umount_dirs trap "" EXIT ERR [ $add -eq 0 ] && delete_base_packages + +# in still undefined, use host architecture +if [ -z "$arch" ]; then + arch=$(dpkg --print-architecture) + arch="$arch $(dpkg --print-foreign-architectures)" +fi + # create mirror directory structure echo "Calling reprepro" mkdir $mirrordir/conf cat > $mirrordir/conf/distributions <> $mirrordir/conf/distributions </dev/null 2>&1; then + reprepro -b $mirrordir includedeb $bponame $archivedir/*~bpo[0-9]*+[0-9-]*_*.deb + rm -f $archivedir/*~bpo[0-9]*+[0-9-]*_*.deb + fi +fi + +# allow package without the .deb suffix. At least they must start with a char and contain an underscore or hyphen +reprepro --ignore=extension -b $mirrordir includedeb cskoeln $archivedir/[a-zA-z]*[_-]* +rm -r $archivedir/[a-zA-z]*[_-]* echo "$0 finished." echo -n "Mirror size and location: ";du -sh --exclude aptcache --exclude db $mirrordir diff -Nru fai-5.3.6ubuntu1/bin/fai-mk-configspace fai-5.9.4ubuntu1/bin/fai-mk-configspace --- fai-5.3.6ubuntu1/bin/fai-mk-configspace 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-mk-configspace 2018-03-10 20:42:17.000000000 +0000 @@ -0,0 +1,64 @@ +#! /bin/bash + +# create a initial config space + +usage() { + +cat <&2 ; fi +eval set -- "$TEMP" +unset TEMP + +while true ; do + case "$1" in + -h|--help) + usage 0 ;; + --) + shift + break ;; + *) + die 1 "$0: command line parsing error ! $@" >&2 ;; + esac +done + + +. /etc/fai/nfsroot.conf + +if [ -d $FAI_CONFIGDIR/class ]; then + echo "You already have a config space in $FAI_CONFIGDIR" + exit 0 +fi + +if [ ! -d /usr/share/doc/fai-doc ]; then + echo "Cannot create the config space. Please install the package fai-doc." + exit 1 +fi + +mkdir -p $FAI_CONFIGDIR +if [ $? -ne 0 ]; then + echo "Cannot create the config space in $FAI_CONFIGDIR." + exit 1 +fi + +cp -a /usr/share/doc/fai-doc/examples/simple/* $FAI_CONFIGDIR/. +if [ $? -eq 0 ]; then + echo "Your initial config space is now located in $FAI_CONFIGDIR" +else + echo "Copying the config space examples failed." +fi diff -Nru fai-5.3.6ubuntu1/bin/fai-monitor fai-5.9.4ubuntu1/bin/fai-monitor --- fai-5.3.6ubuntu1/bin/fai-monitor 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-monitor 2020-04-27 02:48:17.000000000 +0000 @@ -14,9 +14,10 @@ use strict; use Socket; use Getopt::Std; +use POSIX qw(strftime); $| = 1; -my ($port, $timeout, $daemon, $timestamp); +my ($port, $timeout, $daemon, $timestamp, $timestamp_format, $localtime); my $pidfile = '/var/run/fai-monitor.pid'; my $logfile = '-'; my $daemonlogfile = '/var/log/fai-monitor.log'; @@ -24,11 +25,18 @@ our %variables; -our ($opt_b,$opt_h,$opt_p,$opt_l,$opt_t,$opt_d,$opt_P,$opt_T,$opt_i); +our ($opt_b,$opt_h,$opt_p,$opt_l,$opt_t,$opt_d,$opt_P,$opt_T,$opt_i,$opt_Z,$opt_f); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sub logline(@) { open(LOGFILE, $logfile) or return 0; - print LOGFILE (scalar localtime(), ' - ') if ($timestamp); + + if ($timestamp) { + if ($localtime) { + print LOGFILE (strftime "$timestamp_format - ", gmtime()); + } else { + print LOGFILE (strftime "$timestamp_format - ", localtime()); + } + } print LOGFILE @_ or return 0; close(LOGFILE); return 1; @@ -192,6 +200,8 @@ -P FILE PID-file. Default is '$pidfile'. Used only if starting in daemon mode. -T Print timestamps in the log. + -f FORMAT Use strftime(FORMAT) for timestamp formatting. + -Z Use gmtime/UTC instead of local time. -i When using -b: send IP of client to fai-choot instead of the hostname the host reports. @@ -200,10 +210,11 @@ } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -getopts('bhTp:l:t:dP:i') || usage; +getopts('bhZTf:p:l:t:dP:i') || usage; $opt_h && usage; $port = $opt_p || 4711; $timeout = $opt_t || 5; +$localtime = $opt_Z || 0; $daemon = $opt_d || 0; $timestamp = $opt_T || 0; $useip = $opt_i || 0; @@ -212,6 +223,12 @@ $pidfile = $opt_P; } +if (defined($opt_f)) { + $timestamp_format = $opt_f +} else { + $timestamp_format = "%a %b %e %H:%M:%S %Y"; +} + if (defined($opt_d)) { (eval "require Proc::Daemon") or die "Daemon mode not available, Proc::Daemon not found. Please install libproc-daemon-perl\n"; diff -Nru fai-5.3.6ubuntu1/bin/fai-new-mac fai-5.9.4ubuntu1/bin/fai-new-mac --- fai-5.3.6ubuntu1/bin/fai-new-mac 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-new-mac 2020-04-27 02:48:17.000000000 +0000 @@ -1,7 +1,7 @@ #! /usr/bin/perl # print only new MAC addresses, which are not yet known -# (c) Thomas Lange, 2007-2012 +# (c) Thomas Lange, 2007-2018 # fai-new-mac -tad # tcpdump -pnlqte udp and src port bootpc and broadcast | fai-new-mac @@ -34,9 +34,9 @@ sub read_arp { - open (ARP,"arp -an|") || die "Can't read arp list. $!\n"; + open (ARP,"ip neigh list|") || die "Can't read arp list. $!\n"; while () { - append_new_mac($1,"MAC found in ARP list") if /at (([0-9a-f]{1,2}:){5}[0-9a-f]{1,2}) \[ether\] on /i + append_new_mac($1,"MAC found in ARP list") if /laddr (([0-9a-f]{2}:){6}) /i } close ARP; } diff -Nru fai-5.3.6ubuntu1/bin/faireboot fai-5.9.4ubuntu1/bin/faireboot --- fai-5.3.6ubuntu1/bin/faireboot 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/faireboot 2020-04-27 02:48:17.000000000 +0000 @@ -23,7 +23,7 @@ mountpoint -q $FAI_ROOT/proc && umount $FAI_ROOT/proc mountpoint -q $FAI_ROOT/dev/pts && umount $FAI_ROOT/dev/pts -killall udevd +killall systemd-udevd sendmon "TASKEND reboot 0" umount -a -t nonfs,noproc 2>/dev/null umount -arf 2>/dev/null diff -Nru fai-5.3.6ubuntu1/bin/fai-sed fai-5.9.4ubuntu1/bin/fai-sed --- fai-5.3.6ubuntu1/bin/fai-sed 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-sed 2020-01-25 08:17:50.000000000 +0000 @@ -0,0 +1,71 @@ +#! /bin/bash + +# fai-sed, call sed with diff before writing +# +# (c) Thomas Lange 2019, lange@debian.org +# + +# idempotent sed. Execute sed command on a file +# but do not overwrite file if nothing has changed + +dryrun=0 + +cmd=$1 +shift +filename=$1 +shift + +if [ -z "$cmd" -o -z "$filename" ]; then + printf "Please add filename and sed command\n" + exit 3 +fi + +# do not allow more than one file +if [ -n "$1" ]; then + printf "Aborting. Too many arguments.\n" + exit 9 +fi + +if [ -n "$target" ]; then + filename="$target$filename" +fi + +if [ ! -f $filename ]; then + printf "WARNING: $filename does not exists. Skipping\n" + exit 0 +fi + +tmp=$(mktemp) +trap "rm $tmp" EXIT + +printf "sed -e $cmd $filename: " +# cp file so we can use sed -i, otherwise the new file created by sed has different chmod, owner +cp -p $filename $tmp +sed -i -e "$cmd" $tmp +res=$? +if [ $res -ne 0 ]; then + printf "sed error $res\n" + exit $res +fi + +cmp -s $filename $tmp +res=$? +if [ $res -eq 2 ]; then + printf " diff error $res. No changes made to $filename\n" + exit 2 +elif [ $res -eq 0 ]; then + printf " No changes.\n" + if [ $dryrun -eq 1 ]; then + exit 0 + fi +else + if [ $dryrun -eq 1 ]; then + printf " Dry-run. Changes not applied.\n" + exit 0 + else + mv $tmp $filename + printf " File changed.\n" + trap '' EXIT + exit 1 + fi +fi diff -Nru fai-5.3.6ubuntu1/bin/fai-setup fai-5.9.4ubuntu1/bin/fai-setup --- fai-5.3.6ubuntu1/bin/fai-setup 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fai-setup 2020-04-27 02:48:17.000000000 +0000 @@ -5,7 +5,7 @@ # fai-setup -- set up FAI # # This script is part of FAI (Fully Automatic Installation) -# (c) 2000-2015 by Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2000-2018 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # #********************************************************************* @@ -34,7 +34,7 @@ options=$@ # all options are also passed to fai-make-nfsroot -while getopts pvC:efgkKV:B: opt ; do +while getopts pPvC:efgkKV:B: opt ; do case "$opt" in C) cfdir=$OPTARG ;; v) verbose=1 ; v=-v ;; @@ -103,23 +103,23 @@ cat $sshdir/id_rsa.pub >> $sshdir/authorized_keys } - [ -f $sshdir/id_dsa ] || { - ssh-keygen -t dsa -N '' -f $sshdir/id_dsa -C "$LOGUSER@$HOSTNAME" - cat $sshdir/id_dsa.pub >> $sshdir/authorized_keys + [ -f $sshdir/id_ed25519 ] || { + ssh-keygen -t ed25519 -N '' -f $sshdir/id_ed25519 -C "$LOGUSER@$HOSTNAME" + cat $sshdir/id_ed25519.pub >> $sshdir/authorized_keys } #Adding servers keys to known_hosts list of LOGUSER. #So that installed clients can ssh $LOGUSER@$HOSTNAME without password if [ ! -f $sshdir/known_hosts ]; then - [ -f /etc/ssh/ssh_host_dsa_key.pub ] && DSASERVER=$(sed -e "s/= .*$/=/" /etc/ssh/ssh_host_dsa_key.pub) + [ -f /etc/ssh/ssh_host_ed25519_key.pub ] && ED25519SERVER=$(sed -e "s/= .*$/=/" /etc/ssh/ssh_host_ed25519_key.pub) [ -f /etc/ssh/ssh_host_rsa_key.pub ] && RSASERVER=$(sed -e "s/= .*$/=/" /etc/ssh/ssh_host_rsa_key.pub ) # determine all IP addresses, and their host names - ips=$(ip addr show up| grep -w inet | cut -d t -f 2 | cut -d ' ' -f 2 | cut -d / -f 1 | grep -v 127.0.0.1) + ips=$(ip addr show up| grep -P -o '(?<=inet )[^/]+' | grep -v 127.0.0.1) for ip in $ips; do hname=$(getent hosts $ip| tr -s ' ' ',') : ${hname:=$ip} echo "Adding $hname to known_hosts." - [ -z "$DSASERVER" ] || echo "$hname $DSASERVER" >> $sshdir/known_hosts + [ -z "$ED25519SERVER" ] || echo "$hname $ED25519SERVER" >> $sshdir/known_hosts [ -z "$RSASERVER" ] || echo "$hname $RSASERVER" >> $sshdir/known_hosts done echo "$sshdir/known_hosts created." @@ -180,47 +180,30 @@ # in expert mode, do not export nfs directories if [ -z "$expert" ]; then - test -f /etc/init.d/nfs-kernel-server && nfsserver=nfs-kernel-server - # by default use the first interface which is up if [ -z "$SERVERINTERFACE" ]; then opt="up" else opt="dev $SERVERINTERFACE" fi - iprange=$(ip addr show $SERVERINTERFACE | grep -w 'inet'|grep -v 127.0.0.1| cut -d t -f 2 | cut -d ' ' -f 2 |head -1) - myip=$(ip a s $dev|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}'|head -1) + iprange=$(ip ad show $SERVERINTERFACE | grep -P -o '(?<=inet )\S+' |grep -v 127.0.0.1| head -1) + myip=$(ip ad show $dev|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}'|head -1) echo "FAI_CONFIGDIR=$FAI_CONFIGDIR" >> /var/log/fai/variables echo "FAI_CONFIG_SRC=nfs://${myip}$FAI_CONFIGDIR" >> /var/log/fai/variables - # if not NFS v4 entry is found add a dummy entry. Workaround for #676883 - if ! egrep -v ^# /etc/exports | grep -q fsid=0; then - echo "No entry for NFS v4 found. Adding a dummy entry. This forces NFS v3 for the nfsroot." - mkdir -p /srv/nfs4 - add_export_line "/srv/nfs4 $iprange(fsid=0,async,ro,no_subtree_check)" - fi - add_export_line $FAI_CONFIGDIR "$iprange(async,ro,no_subtree_check)" add_export_line $NFSROOT "$iprange(async,ro,no_subtree_check,no_root_squash)" - if [ -z "$nfsserver" ]; then - echo "Could not find the type of your nfs server. Maybe" - echo "no nfs server is installed. I can't restart it." + if pidof nfsd >/dev/null + then + invoke-rc.d nfs-kernel-server reload else - if pidof nfsd >/dev/null - then - /etc/init.d/$nfsserver reload - else - /etc/init.d/$nfsserver restart - fi + invoke-rc.d nfs-kernel-server restart fi fi if [ ! -d $FAI_CONFIGDIR/class ]; then - echo "" - echo " You have no FAI configuration space yet. Copy the simple examples with:" - echo " cp -a /usr/share/doc/fai-doc/examples/simple/* $FAI_CONFIGDIR" - echo " Then change the configuration files to meet your local needs." + fai-mk-configspace echo "Please don't forget to fill out the FAI questionnaire after you've finished your project with FAI." echo "" fi diff -Nru fai-5.3.6ubuntu1/bin/fcopy fai-5.9.4ubuntu1/bin/fcopy --- fai-5.3.6ubuntu1/bin/fcopy 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/fcopy 2020-04-27 02:48:17.000000000 +0000 @@ -5,7 +5,7 @@ # fcopy -- copy files using FAI classes and preserve directory structure # # This script is part of FAI (Fully Automatic Installation) -# Copyright (C) 2000-2016 Thomas Lange, lange@informatik.uni-koeln.de +# Copyright (C) 2000-2019 Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # Copyright (C) 2001-2005 Henning Glawe, glaweh@physik.fu-berlin.de # Freie Univeritaet Berlin @@ -36,9 +36,15 @@ use File::Basename; use File::Spec; use File::Temp qw/tempfile/; -use File::lchown qw/lchown lutimes/; use Getopt::Std; +# load module only if available +our $haslchown = eval { + require File::lchown; + File::lchown->import (qw/lchown lutimes/); + 1; +}; + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Global variables my $debug; @@ -46,6 +52,7 @@ my $verbose; my $target; my $source; +my $substitute; my $logfile; my @classes; my $dryrun; @@ -61,7 +68,7 @@ # getopts: our ($opt_s, $opt_t, $opt_r, $opt_m, $opt_M, $opt_v, $opt_d, $opt_D, $opt_i); our ($opt_B, $opt_c, $opt_C, $opt_h, $opt_F, $opt_l, $opt_L, $opt_P, $opt_b); -our ($opt_I, $opt_U, $opt_n, $opt_H); +our ($opt_I, $opt_U, $opt_n, $opt_H, $opt_S); # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sub copy_one { @@ -91,8 +98,9 @@ # $prefix/$source must be a directory if (-f $ps) { ewarn("$ps is a file, but must be a directory containing templates.");return }; unless (-d $ps) { - ewarn("Nonexisting directory $ps. No files copied.") if $debug; - $error = 1; # we could not copy anything + # we could not copy anything + warn "fcopy: Nonexisting directory $ps. No files copied.\n" if $debug; + $error = 1 unless $opt_i; # do not set $error if -i was set return; } @@ -101,7 +109,8 @@ # if no class matches, remove destination or move it to the backup file unless (defined $class) { - ewarn("no matching file for any class for $source defined."); + warn "fcopy: no matching file for any class for $source defined.\n"; + $error = 1 unless $opt_i; # do not set $error if -i was set # do not copy if ($opt_d and -f $destfile) { print LOGFILE "$source\tNONE\t# removed (no matching class)\n" if $logfile; @@ -128,14 +137,26 @@ } } - # execute preinst script - if ( -x "$ps/preinst" ) { - $preinst = 1; # a tmpfile is used because of preinst script + # do we need a tmpfile + if ($substitute or -f "$ps/_substitute" or -x "$ps/preinst") { ($tmpfh,$tmpfile)=tempfile("fcopy.XXXXXX",DIR=>File::Spec->tmpdir()); - warn "preinst script found, copying $sourcefile to $tmpfile" if $debug; - ewarn("copying $sourcefile for preinst processing failed !") unless - _copy($sourcefile,$tmpfh); - if (runscript("preinst",$ps,$tmpfile,$class)) { + $preinst = 1; # a tmpfile is used because of preinst script + } + + if ($substitute or -f "$ps/_substitute") { + warn "Enable substitution. Copying $sourcefile to $tmpfile" if $debug; + + do_substitution($sourcefile,$tmpfh); + } + + if ( -x "$ps/preinst" ) { + # execute preinst script, but not if we also do substitution + unless ($substitute or -f "$ps/_substitute") { + warn "preinst script found, copying $sourcefile to $tmpfile" if $debug; + ewarn("copying $sourcefile for preinst processing failed !") unless + _copy($sourcefile,$tmpfile); + } + if (runscript($ps,"preinst",$tmpfile,$class)) { ewarn("preinst for $sourcefile failed; not proceeding"); _unlink($tmpfile); return 0; @@ -206,7 +227,7 @@ } if (_symlink($sourcelink, $destfile)) { print "fcopy: symlinked $sourcefile -> $sourcelink to $destfile\n" ; - runscript("postinst",$ps,$destfile,$class); + runscript($ps,"postinst",$destfile,$class); } else { ewarn("copy symlink $sourcefile -> $sourcelink to $destfile failed. $!") ; } @@ -215,7 +236,7 @@ if (_copy($tmpfile,$destfile)) { print "fcopy: copied $sourcefile to $destfile\n" ; set_mode($ps,$destfile,$class); - runscript("postinst",$ps,$destfile,$class); + runscript($ps,"postinst",$destfile,$class); } else { ewarn("copy $sourcefile to $destfile failed. $!") ; } @@ -223,6 +244,22 @@ _unlink($tmpfile) if $preinst; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub do_substitution { + + my ($src,$tmp) = @_; + my $line; + + open (SRC,"< $src") || die "fcopy: can't open $src\n"; + while ($line = ) { + $line =~ s/\{%(\w+)%\}/ + if (exists $ENV{$1}) { $ENV{$1}} else {$error=1; warn "Error in substitution: Variable \$$1 undefined. File $src,line $.\n"; "\${$1}"} + /eg; + print $tmp $line; + } + close SRC; + close $tmp; +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sub _mkpath { return 1 if $dryrun; # do not execute if -n or FCOPY_DRYRUN was given @@ -256,21 +293,21 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sub runscript { + my ($path,$script,$destfile,$class) = @_; + # run script $path/$script on $destfile, additional option is $class # returns 0 on success, 1 if the script failed - my ($scriptname,$sourcefile,$destfile,$class) = @_; - - return 1 unless -f "$sourcefile/$scriptname"; - unless ( -x "$sourcefile/$scriptname") { - warn "ERROR: $sourcefile/$scriptname is not executable\n" if $verbose; + return 1 unless -f "$path/$script"; + unless ( -x "$path/$script") { + warn "ERROR: $path/$script is not executable\n" if $verbose; return 1; } - warn "executing $sourcefile/$scriptname $class $destfile\n" if $debug; + warn "executing $path/$script $class $destfile\n" if $debug; return 0 if $dryrun; # do not execute if -n or FCOPY_DRYRUN was given - system "$sourcefile/$scriptname $class $destfile"; + system "$path/$script $class $destfile"; my $rc = $?>>8; if ($rc) { - warn "ERROR: $scriptname returned code $rc\n"; + warn "ERROR: $script returned code $rc\n"; $error = 1; return 1; } @@ -301,48 +338,48 @@ # use the values from the source file my ($sourcefile,$destfile,$class) = @_; my ($uid,$gid,$owner,$group,$mode); - my ($stime,@defmodes); + my ($stime,@smodes); # get mtime,uid,gid,mode from source file or from -m if ($modeset) { # use -m values - @defmodes = @opt_modes; + @smodes = @opt_modes; $stime = (stat("$sourcefile/$class"))[9]; } else { # get mtime,uid,gid,mode from source file if ($opt_H) { - ($stime,@defmodes) = (lstat("$sourcefile/$class"))[9,4,5,2]; + ($stime,@smodes) = (lstat("$sourcefile/$class"))[9,4,5,2]; } else { - ($stime,@defmodes) = (stat("$sourcefile/$class"))[9,4,5,2]; + ($stime,@smodes) = (stat("$sourcefile/$class"))[9,4,5,2]; } } # get mtime,uid,gid,mode from destination file - my ($dtime,@ddefmodes); + my ($dtime,@dmodes); if ($opt_H) { - ($dtime,@ddefmodes) = (lstat("$destfile"))[9,4,5,2]; + ($dtime,@dmodes) = (lstat("$destfile"))[9,4,5,2]; } else { - ($dtime,@ddefmodes) = (stat("$destfile"))[9,4,5,2]; + ($dtime,@dmodes) = (stat("$destfile"))[9,4,5,2]; } # compare time,uid,gid and mode of source file and target file - if ($modeset) { # use -m values - ($owner,$group,$mode) = @opt_modes; - } elsif (-f "$sourcefile/file-modes"){ + if (-f "$sourcefile/file-modes") { ($owner,$group,$mode) = read_file_mode("$sourcefile/file-modes",$class); + } elsif ($modeset) { # use -m values + ($owner,$group,$mode) = @opt_modes; } else { # use values from source file - ($owner,$group,$mode) = @defmodes; + ($owner,$group,$mode) = @smodes; } # if different: change the values # setting modes on a symlink is not portable, so ignore it my $issymlink = $opt_H && -l $destfile; - return if ($stime == $dtime && (($ddefmodes[0] == $owner) && - ($ddefmodes[1] == $group) && ($issymlink || ($ddefmodes[2] == $mode)))); + return if ($stime == $dtime && (($dmodes[0] == $owner) && + ($dmodes[1] == $group) && ($issymlink || ($dmodes[2] == $mode)))); ($uid,$gid) = name2num($owner,$group); warn "chown/chmod u:$uid g:$gid m:$mode $destfile\n" if $debug; return if $dryrun; # do not execute if -n or FCOPY_DRYRUN was given - if ($issymlink) { + if ($issymlink && $haslchown) { lchown ($uid,$gid, $destfile) || ewarn("lchown $owner $group $destfile failed. $!"); unless ($preinst) { lutimes ($stime,$stime, $destfile) || ewarn("lutimes for $destfile failed. $!"); @@ -434,7 +471,7 @@ print << "EOF"; fcopy, copy files using classes. - Copyright (C) 2001-2012 by Thomas Lange + Copyright (C) 2001-2019 by Thomas Lange Usage: fcopy [OPTION] ... SOURCE ... @@ -455,6 +492,7 @@ -n Print the commands, but do not execute them. -r Copy recursivly but skip ignored directories. -s source_dir Look for source files relative to source_dir. + -S Enable substition of variables in files. -t target_dir Copy files relativ to target_dir. -b backup_dir Where to save backups of overwritten files -v Create verbose output. @@ -466,7 +504,7 @@ # main program $|=1; -getopts('Ms:t:rm:vidDc:C:hF:lL:P:Bb:I:UnH') || usage; +getopts('Ms:t:rm:vidDc:C:hF:lL:P:Bb:I:UnHS') || usage; $opt_h && usage; $opt_P and die "Option -P is not supported any more. You may want to use -F\n"; $dryrun = $ENV{FCOPY_DRYRUN} || $opt_n || 0; # is true if in dry-run mode @@ -474,6 +512,7 @@ $opt_M and $opt_m = "root,root,0644"; # set default modes $opt_m && check_mopt(); $nobackup = $opt_B || $ENV{FCOPY_NOBACKUP} || 0; +$substitute = $opt_S || $ENV{FCOPY_SUBSTITUTE} || 0; $verbose = $opt_v || $ENV{verbose} || 0; $debug = $opt_D || $ENV{debug} || 0; $source = $opt_s || $ENV{FAI} && "$ENV{FAI}/files" || `pwd`; @@ -526,5 +565,4 @@ } foreach (@ARGV) { copy_one($source,$_,$target); } -$opt_i && exit 0; # ignore any warning exit $error; diff -Nru fai-5.3.6ubuntu1/bin/ftar fai-5.9.4ubuntu1/bin/ftar --- fai-5.3.6ubuntu1/bin/ftar 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/ftar 2020-04-27 02:48:17.000000000 +0000 @@ -5,7 +5,7 @@ # ftar -- extract tar files using FAI classes # # This script is part of FAI (Fully Automatic Installation) -# Copyright (C) 2001-2016 Thomas Lange, lange@informatik.uni-koeln.de +# Copyright (C) 2001-2017 Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # #********************************************************************* @@ -65,7 +65,7 @@ cat </dev/null 1>/dev/null -if [ $? -eq 0 ]; then +# detect target fstype +targetfstype=`cat /proc/mounts | awk -vt="$target" '{if($2==t){print $3}}'` +if [ "$targetfstype" != "nfs" ]; then xattrs="--xattrs --xattrs-include=*.* --selinux --acl" else xattrs= diff -Nru fai-5.3.6ubuntu1/bin/install_packages fai-5.9.4ubuntu1/bin/install_packages --- fai-5.3.6ubuntu1/bin/install_packages 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/install_packages 2020-04-27 02:48:17.000000000 +0000 @@ -5,10 +5,11 @@ # install_packages -- read package config and install packages via apt-get # # This script is part of FAI (Fully Automatic Installation) -# (c) 2000-2017, Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2000-2019, Thomas Lange, lange@informatik.uni-koeln.de # (c) 2003-2004, Henning Glawe, glaweh@physik.fu-berlin.de # (c) 2004 , Jonas Hoffmann, jhoffman@physik.fu-berlin.de # PRELOAD feature from Thomas Gebhardt +# (c) 2019 , TUXEDO Computers GmbH, tux@tuxedocomputers.com # #********************************************************************* # This program is free software; you can redistribute it and/or modify @@ -71,11 +72,10 @@ # @commands is the order of the commands that are executed -our @commands = qw/y2i y2r zypper zypper-rm yast rpmr urpmi urpme yumgroup yumi yumr dnfgroup dnfi dnfr smarti smartr hold taskrm taskinst clean-internal cupt cupt-r aptitude aptitude-r install install-norec unpack remove dselect-upgrade/; +our @commands = qw/y2i y2r zypper zypper-pattern zypper-product zypper-rm yast rpmr urpmi urpme yumgroup yumi yumr dnfgroup dnfi dnfr smarti smartr hold taskrm taskinst clean-internal cupt cupt-r install install-norec aptitude aptitude-r unpack remove dselect-upgrade/; %command = ( "install" => "apt-get $aptopt --fix-missing install", "install-norec" => "apt-get $aptopt --fix-missing install --no-install-recommends", - "inst-internal" => "apt-get $aptopt --fix-missing -s install", "remove" => "apt-get $aptopt --purge remove", "dselect-upgrade" => "apt-get $aptopt dselect-upgrade", "taskinst" => "tasksel install", @@ -102,7 +102,9 @@ "y2i" => "y2pmsh isc", "y2r" => "y2pmsh remove", "yast" => "yast -i", - "zypper" => "zypper -n install", + "zypper" => "zypper -n install -l", + "zypper-pattern" => "zypper -n install -l -t pattern", + "zypper-product" => "zypper -n install -l -t product", "zypper-rm" => "zypper -n remove", "rpmr" => "rpm -e", "smarti" => "smart install -y", @@ -121,6 +123,7 @@ $maxpl=$ENV{MAXPACKAGES} || $opt_m ; $maxpl && $verbose && warn "Maximum number of packages installed at a time set to $maxpl\n"; $maxpl or $maxpl = 99 ; # set default value +$opt_N=$ENV{FAI_DISABLE_PACKAGE_NAME_CHECK} || $opt_N; my $qopt="-qq" unless $verbose; my $devnull=">/dev/null" unless $verbose; @@ -193,15 +196,14 @@ mkpackagelist(@{$list{$atype}}); # create lists of known and unknown packages getsources(); # retrieve sources if ($opt_l) { - # only print the package list - print join ' ',@known,"\n"; - exit 0; + next; } if ($opt_L) { - # only print the package list - execute("$rootcmd $command{'inst-internal'} @known | egrep ^Inst"); - exit 0; + # only print the package list, only works for install and instal-norec + execute("$rootcmd $command{$atype} -s @known | egrep ^Inst"); + next; } + # pass only maxpl packages to apt-get while (@known) { my $shortlist = join(' ', splice @known,0,$maxpl); @@ -231,6 +233,13 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - # end of the big foreach loop # - - - - - - - - - - - - - - - - - - - - - - - - - - - +if ($opt_L) { + exit 0; +} +if ($opt_l) { + print join ' ',@known,"\n"; + exit 0; +} # remove preloaded files foreach my $entry (@preloadrmlist) { @@ -276,7 +285,7 @@ if (/^PACKAGES\s+(\S+)\s*/) { ($type,$cllist) = ($1,$'); - warn "WARNING: Unknow action $type after PACKAGES\n" unless defined $command{$type}; + warn "WARNING: Unknown action $type after PACKAGES\n" unless defined $command{$type}; # by default no classes are listed after this command so doit $doit = 1; if ($cllist) { @@ -346,33 +355,6 @@ unlink $tempfile; } # - - - - - - - - - - - - - - - - - - - - - - - - - - - -sub installable { - - # ckeck, wether package can be installed. - # return false for packages which only exist in - # dpkg status files - - my $package = shift; - # print "Checking wether $package is installable...\n"; - - # version list of package - my $vlist = $cache->{$package}{VersionList}; - - # for each version - foreach my $version (@$vlist) { - # list of package files - my $flist = $version->{FileList}; - foreach my $fitem (@$flist) { - # if the file is a package index (not a dpkg status file) - # the package is installable - return 1 if ($fitem->{File}{IndexType} eq "Debian Package Index"); - } - } - - # no package index file found for the current package - return 0; -} -# - - - - - - - - - - - - - - - - - - - - - - - - - - - sub mkpackagelist { # CURRENTLY no packages are removed from the list of known packages @@ -521,6 +503,10 @@ my @unknown; my @final; # final list of packages + # clean global hashes + undef %pmap; + undef %install; + foreach my $n (@inlist) { $pack = $n; @@ -547,6 +533,16 @@ insert_pkg($n, $pack, 1, "$n using $pack found") && next; } + # handle $varname in package name + if ( $pack =~ s/\$\w+//) { + insert_pkg($n, $pack, 1, "$n using $pack found") && next; + } + + # handle ${varname} in package name + if ( $pack =~ s/\$\{\w+\}//) { + insert_pkg($n, $pack, 1, "$n using $pack found") && next; + } + # else package is unknown push @unknown, $n; } diff -Nru fai-5.3.6ubuntu1/bin/setup-storage fai-5.9.4ubuntu1/bin/setup-storage --- fai-5.3.6ubuntu1/bin/setup-storage 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/bin/setup-storage 2020-04-27 02:48:17.000000000 +0000 @@ -34,7 +34,7 @@ # input format is documented in @ref parser.pm # # Some (developer) documentation may be found on -# http://wiki.fai-project.org/index.php/Setup-storage +# https://wiki.fai-project.org/index.php/Setup-storage # # Some coding conventions: # - no whitespace after ( and before ) @@ -52,15 +52,15 @@ package FAI; -my $version = "2.0"; +my $version = "2.3"; $|=1; # command line parameter handling use Getopt::Std; $main::VERSION = $version; $Getopt::Std::STANDARD_HELP_VERSION = 1; -our ($opt_X, $opt_f, $opt_h, $opt_d, $opt_s, $opt_D, $opt_L); # the variables for getopt -(&getopts('Xf:hdsD:L:') && !$opt_h) || die <] override disklist variable by space-separated [-L] use instead of LOGDIR variable [-h] print this help message + [-y] print disk variables as YAML file into disk_var.yml EOF # include all subparts, which are part of the FAI perl package @@ -83,6 +84,24 @@ use Fstab; use Exec; +sub prtdebug { + + # for debugging purposes to print the hash structures + use Data::Dumper; + + print "Current disk layout in \%current_config\n"; + print Dumper \%FAI::current_config; + + print "Current LVM layout in \%current_lvm_config\n"; + print Dumper \%FAI::current_lvm_config; + + print "Current RAID layout in \%current_raid_config\n"; + print Dumper \%FAI::current_raid_config; + + print "Current device tree in \%current_dev_children\n"; + print Dumper \%FAI::current_dev_children; +} + # enable debug mode, if requested using -d $opt_d and $FAI::debug = 1; @@ -116,7 +135,7 @@ print "disklist: "; print "$_\n" foreach(@FAI::disks); } -die "No disks defined in \$disklist\n" unless (@FAI::disks); +warn "No disks defined in \$disklist\n" unless (@FAI::disks); # the config source file my $config_file = undef; @@ -175,29 +194,8 @@ # debugging only: print the current configuration if ($FAI::debug) { - # for debugging purposes to print the hash structures use Data::Dumper; - - print "Current disk layout\n"; - - # make sure perl doesn't warn about it being used only once, same below - our %current_config; - print Dumper \%current_config; - - print "Current LVM layout\n"; - - our %current_lvm_config; - print Dumper \%current_lvm_config; - - print "Current RAID layout\n"; - - our %current_raid_config; - print Dumper \%current_raid_config; - - print "Current device tree\n"; - - our %current_dev_children; - print Dumper \%current_dev_children; + prtdebug; } # compute the new LVM and partition sizes; do the partition sizes first to have @@ -206,9 +204,9 @@ &FAI::compute_lv_sizes; # print the current contents of $FAI::configs -$FAI::debug and print "Desired disk layout\n"; +$FAI::debug and print "Desired disk layout in %FAI::configs\n"; $FAI::debug and print Dumper \%FAI::configs; -$FAI::debug and print "Desired device tree\n"; +$FAI::debug and print "Desired device tree in %FAI::dev_children\n"; $FAI::debug and print Dumper \%FAI::dev_children; # generate the command script @@ -264,6 +262,25 @@ or die "Unable to write to file $FAI::DATADIR/disk_var.sh\n"; print DISK_VAR "$_=\${$_:-$FAI::disk_var{$_}}\n" foreach (keys %FAI::disk_var); close DISK_VAR; + + if ($opt_y) { + open(DISK_YML, ">$FAI::DATADIR/disk_var.yml") + or die "Unable to write to file $FAI::DATADIR/disk_var.yml\n"; + + print DISK_YML "---\n# disk_var.sh as YAML\n"; + foreach (keys %FAI::disk_var) { + $FAI::disk_var{$_} =~ s/"//g; + if ( $FAI::disk_var{$_} =~ m/\s/ ) { + # print an array + print DISK_YML "$_:\n"; + my $a = join("\n - ", split(/ /,$FAI::disk_var{$_})); + print DISK_YML " - $a\n"; + } else { + print DISK_YML "$_: $FAI::disk_var{$_}\n"; + } + } + close DISK_YML; + } } # print crypttab @@ -277,3 +294,11 @@ close CRYPTTAB; } + +# at the end print the whole config again +if ($FAI::debug) { + print "==========================================\n"; + print "= Variables at the end of setup-storage =\n"; + print "==========================================\n"; + prtdebug; +} Binary files /tmp/tmpOR6ynH/JU1RCkiHod/fai-5.3.6ubuntu1/conf/fai-project.gpg and /tmp/tmpOR6ynH/YzTAW9y24a/fai-5.9.4ubuntu1/conf/fai-project.gpg differ diff -Nru fai-5.3.6ubuntu1/conf/grub.cfg fai-5.9.4ubuntu1/conf/grub.cfg --- fai-5.3.6ubuntu1/conf/grub.cfg 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/conf/grub.cfg 2020-04-27 02:48:20.000000000 +0000 @@ -1,93 +1,86 @@ ## grub2 configuration set default="Boot OS from first partition on first disk" set timeout=20 -set resolution=1024x768 - -if loadfont /boot/grub/ascii.pf2 ; then - insmod png - set gfxmode=640x480 - insmod gfxterm - insmod vbe - terminal_output gfxterm -fi - -if background_image /boot/grub/fai.png ; then - set color_normal=black/black - set color_highlight=red/black - set menu_color_normal=black/black - set menu_color_highlight=black/yellow -else - set menu_color_normal=white/black - set menu_color_highlight=black/yellow -fi # make sure we can access partitions insmod part_msdos insmod part_gpt +insmod all_video +insmod gfxterm -if [ ${iso_path} ] ; then - set loopback="findiso=${iso_path}" -fi - +set gfxmode=auto +set color_normal=white/black +set color_highlight=red/black +set menu_color_normal=white/black +set menu_color_highlight=black/yellow menuentry " +------------------------------------------------------+" { - set gfxpayload=$resolution +set timeout=20 } menuentry " | Fully Automatic Installation |" { - set gfxpayload=$resolution +set timeout=20 } menuentry " | _VERSIONSTRING_ |" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } menuentry " | (c) Thomas Lange lange@debian.org |" { - set gfxpayload=$resolution +set timeout=20 } menuentry " +------------------------------------------------------+" { - set gfxpayload=$resolution +set timeout=20 } menuentry "" { - set gfxpayload=$resolution +set timeout=20 } + menuentry "Client standalone installation - select installation type from menu " { - set gfxpayload=$resolution + search --set=root --file /FAI-CD linux /boot/vmlinuz FAI_FLAGS="menu,verbose,createvt" FAI_ACTION=install FAI_CONFIG_SRC=file:///var/lib/fai/config rd.live.image root=live:CDLABEL=FAI_CD rd.neednet ip=dhcp quiet initrd /boot/initrd.img } - -menuentry "FAI server installation - using external DHCP" { - set gfxpayload=$resolution - linux /boot/vmlinuz FAI_FLAGS="verbose,createvt" FAI_ACTION=install hostname=faiserver FAI_CONFIG_SRC=file:///var/lib/fai/config rd.live.image root=live:CDLABEL=FAI_CD rd.neednet ip=dhcp quiet - initrd /boot/initrd.img -} - -menuentry "FAI server installation - using a fixed IP" { - set gfxpayload=$resolution - linux /boot/vmlinuz FAI_FLAGS="verbose,createvt" FAI_ACTION=install ip=192.168.33.250::192.168.33.1:255.255.255.0:faiserver:eth0:off FAI_CONFIG_SRC=file:///var/lib/fai/config rd.live.image root=live:CDLABEL=FAI_CD quiet - initrd /boot/initrd.img +menuentry "Boot OS from first partition on first disk" { + if [ "$grub_platform" = "efi" ]; then + if [ -f (hd0,gpt1)/efi/debian/grub.cfg ]; then + configfile (hd0,gpt1)/efi/debian/grub.cfg + elif [ -f (hd1,gpt1)/efi/debian/grub.cfg ]; then + configfile (hd1,gpt1)/efi/debian/grub.cfg + elif [ -f (hd0,gpt2)/boot/grub/grub.cfg ]; then + configfile (hd0,gpt2)/boot/grub/grub.cfg + elif [ -f (hd1,gpt2)/boot/grub/grub.cfg ]; then + configfile (hd1,gpt2)/boot/grub/grub.cfg + else + echo "cannot find grub.cfg" + sleep 7 + fi + # legacy BIOS booting + elif [ -d (cd) ]; then + set root=(hd0) + chainloader +1 + else + set root=(hd1) + chainloader +1 + fi } menuentry "Rescue system, no installation" { - set gfxpayload=$resolution + search --set=root --file /FAI-CD linux /boot/vmlinuz FAI_FLAGS="verbose,createvt" FAI_ACTION=sysinfo FAI_CONFIG_SRC=file:///var/lib/fai/config rd.live.image root=live:CDLABEL=FAI_CD quiet initrd /boot/initrd.img } -menuentry "Boot OS from first partition on first disk" { - if [ -d (cd) ]; then - chainloader (hd0)+1 - fi - - if [ "$root" = "hd1" ]; then - chainloader (hd0)+1 - fi +menuentry "FAI server installation - using external DHCP server" { + search --set=root --file /FAI-CD + linux /boot/vmlinuz FAI_FLAGS="verbose,createvt" FAI_ACTION=install hostname=faiserver FAI_CONFIG_SRC=file:///var/lib/fai/config rd.live.image root=live:CDLABEL=FAI_CD rd.neednet ip=dhcp quiet + initrd /boot/initrd.img +} - if [ "$root" = "hd0" ]; then - set root=(hd1) - chainloader (hd1)+1 - fi +menuentry "FAI server installation - using internal DHCP and a fixed IP" { + search --set=root --file /FAI-CD + linux /boot/vmlinuz FAI_FLAGS="verbose,createvt" FAI_ACTION=install ip=192.168.33.250::192.168.33.1:255.255.255.0:faiserver:eth0:off FAI_CONFIG_SRC=file:///var/lib/fai/config rd.live.image root=live:CDLABEL=FAI_CD quiet + initrd /boot/initrd.img } diff -Nru fai-5.3.6ubuntu1/conf/grub.cfg.autodiscover fai-5.9.4ubuntu1/conf/grub.cfg.autodiscover --- fai-5.3.6ubuntu1/conf/grub.cfg.autodiscover 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/conf/grub.cfg.autodiscover 2020-04-27 02:48:20.000000000 +0000 @@ -1,77 +1,72 @@ ## grub2 configuration -set default="Boot OS of first partition on first disk" +set default="Boot OS from first partition on first disk" set timeout=20 -set resolution=1024x768 - -if loadfont /boot/grub/ascii.pf2 ; then - insmod png - set gfxmode=640x480 - insmod gfxterm - insmod vbe - terminal_output gfxterm -fi - -if background_image /boot/grub/fai.png ; then - set color_normal=black/black - set color_highlight=red/black - set menu_color_normal=black/black - set menu_color_highlight=black/yellow -else - set menu_color_normal=white/black - set menu_color_highlight=black/yellow -fi # make sure we can access partitions insmod part_msdos insmod part_gpt +insmod all_video +insmod gfxterm -if [ ${iso_path} ] ; then - set loopback="findiso=${iso_path}" -fi +set gfxmode=auto +set color_normal=white/black +set color_highlight=red/black +set menu_color_normal=white/black +set menu_color_highlight=black/yellow menuentry "" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } + menuentry " +------------------------------------------------------+" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } menuentry " | Fully Automatic Installation |" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } menuentry " | _VERSIONSTRING_ |" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } menuentry " | (c) Thomas Lange lange@debian.org |" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } menuentry " +------------------------------------------------------+" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } } menuentry "" --unrestricted { - set gfxpayload=$resolution +set timeout=20 } menuentry "Autodiscover the FAI server" { - set gfxpayload=$resolution - linux /boot/vmlinuz FAI_FLAGS="menu,verbose,createvt" fai.discover aufs rootovl root=/dev/nfs ip=dhcp quiet + search --set=root --file /FAI-CD + linux /boot/vmlinuz FAI_FLAGS="menu,verbose,createvt" fai.discover rootovl root=/dev/nfs ip=dhcp quiet initrd /boot/initrd.img } -menuentry "Boot OS of first partition on first disk" --unrestricted { - if [ -d (cd) ]; then - chainloader (hd0)+1 - fi - - if [ "$root" = "hd1" ]; then - chainloader (hd0)+1 - fi - - if [ "$root" = "hd0" ]; then +menuentry "Boot OS from first partition on first disk" { + if [ "$grub_platform" = "efi" ]; then + if [ -f (hd0,gpt1)/efi/debian/grub.cfg ]; then + configfile (hd0,gpt1)/efi/debian/grub.cfg + elif [ -f (hd1,gpt1)/efi/debian/grub.cfg ]; then + configfile (hd1,gpt1)/efi/debian/grub.cfg + elif [ -f (hd0,gpt2)/boot/grub/grub.cfg ]; then + configfile (hd0,gpt2)/boot/grub/grub.cfg + elif [ -f (hd1,gpt2)/boot/grub/grub.cfg ]; then + configfile (hd1,gpt2)/boot/grub/grub.cfg + else + echo "cannot find grub.cfg" + sleep 7 + fi + # legacy BIOS booting + elif [ -d (cd) ]; then + set root=(hd0) + chainloader +1 + else set root=(hd1) - chainloader (hd1)+1 + chainloader +1 fi } diff -Nru fai-5.3.6ubuntu1/conf/NFSROOT fai-5.9.4ubuntu1/conf/NFSROOT --- fai-5.3.6ubuntu1/conf/NFSROOT 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/conf/NFSROOT 2020-09-03 02:08:38.000000000 +0000 @@ -1,47 +1,79 @@ # package list for creating the NFSROOT -PACKAGES install +PACKAGES install-norec FULL +nfs-common fai-nfsroot rpcbind +rsync +lshw procinfo +dump reiserfsprogs xfsprogs xfsdump btrfs-progs +hwinfo hdparm smartmontools nvme-cli +rdate +zile +numactl +udns-utils +netcat-traditional nmap +pxelinux syslinux-common # in jessie we need both +ca-certificates # for get-config-dir-https and apt-transport-https +usbutils pciutils +ssh +netselect +mdadm +#git # git consumes a lot of disk space on the FAI CD +#subversion -nfs-common fai-nfsroot ssh rdate lshw rpcbind -rsync lftp less dump reiserfsprogs e2fsprogs usbutils -hwinfo psmisc pciutils hdparm smartmontools parted mdadm lvm2 -dnsutils ntpdate dosfstools xfsprogs xfsdump btrfs-tools -procinfo numactl dialog +PACKAGES install-norec +# dracut replaces live-boot and initramfs-tools +dracut live-boot- initramfs-tools- +dracut-config-generic +dracut-network +sysvinit-core systemd-sysv- +wget- curl lftp +less +moreutils +ntpdate +dosfstools +lvm2 +psmisc +dialog console-common kbd -iproute2 netselect moreutils udev subversion -xz-utils -pxelinux syslinux-common # in jessie we need both -curl wget- netcat-traditional -ca-certificates # for get-config-dir-https -nmap -emacs24-nox +xz-utils pigz + # some network cards needs firmware +PACKAGES install-norec NONFREE firmware-bnx2 firmware-bnx2x firmware-realtek -#firmware-linux-nonfree - -# dracut replaces live-boot and initramfs-tools -dracut-network dracut live-boot- initramfs-tools- -dracut-config-generic # for jessie add "deb http://fai-project.org/download jessie koeln" - -#git # git consumes a lot of disk space on the FAI CD +firmware-misc-nonfree -sysvinit-core systemd-sysv- # you should not edit the lines below # architecture dependend list of packages that are installed -PACKAGES install I386 +PACKAGES install-norec I386 grub-pc -linux-image-server +efibootmgr +linux-image-generic -# packages for Ubuntu natty/oneiric/precise: -# linux-image-generic live-boot - -PACKAGES install AMD64 +PACKAGES install-norec AMD64 grub-pc -linux-image-server +grub-efi-amd64-bin +efibootmgr +linux-image-generic +#linux-image-amd64/buster-backports # if you want to use a newer kernel + +PACKAGES install-norec ARM64 +grub-efi-arm64 +efibootmgr +linux-image-generic + +PACKAGES install-norec ARMHF +grub-efi-arm +efibootmgr +linux-image-generic + +PACKAGES install-norec DEBIAN_9 +apt-transport-https + +PACKAGES install-norec DEBIAN_10 +fdisk gpg -# packages for Ubuntu vivid -PACKAGES install UBUNTU -upstart-sysv +PACKAGES install-norec DEBIAN_11 DEBIAN_ +fdisk gpg diff -Nru fai-5.3.6ubuntu1/conf/nfsroot.conf fai-5.9.4ubuntu1/conf/nfsroot.conf --- fai-5.3.6ubuntu1/conf/nfsroot.conf 2017-04-22 10:24:26.000000000 +0000 +++ fai-5.9.4ubuntu1/conf/nfsroot.conf 2020-09-03 02:09:53.000000000 +0000 @@ -1,13 +1,13 @@ # For a detailed description see nfsroot.conf(5) # " " for debootstrap -FAI_DEBOOTSTRAP="artful http://archive.ubuntu.com/ubuntu" +FAI_DEBOOTSTRAP="focal http://archive.ubuntu.com/ubuntu" FAI_ROOTPW='$1$kBnWcO.E$djxB128U7dMkrltJHPf6d1' NFSROOT=/srv/fai/nfsroot TFTPROOT=/srv/tftp/fai NFSROOT_HOOKS=/etc/fai/nfsroot-hooks/ -FAI_DEBOOTSTRAP_OPTS="--exclude=info,wget,dhcp-client --include=aptitude" +FAI_DEBOOTSTRAP_OPTS="--exclude=info,wget,dhcp-client" # Configuration space FAI_CONFIGDIR=/srv/fai/config diff -Nru fai-5.3.6ubuntu1/conf/sources.list fai-5.9.4ubuntu1/conf/sources.list --- fai-5.3.6ubuntu1/conf/sources.list 2017-04-22 10:23:41.000000000 +0000 +++ fai-5.9.4ubuntu1/conf/sources.list 2020-09-03 02:10:26.000000000 +0000 @@ -1,8 +1,8 @@ # These lines should work for many sites -deb http://archive.ubuntu.com/ubuntu artful main restricted universe multiverse -deb http://archive.ubuntu.com/ubuntu artful-security main restricted universe multiverse -deb http://archive.ubuntu.com/ubuntu artful-updates main restricted universe multiverse +deb http://archive.ubuntu.com/ubuntu focal main restricted universe multiverse +deb http://archive.ubuntu.com/ubuntu focal-security main restricted universe multiverse +deb http://archive.ubuntu.com/ubuntu focal-updates main restricted universe multiverse -# repository that may contain newer fai packages for stretch -#deb [trusted=yes] http://fai-project.org/download stretch koeln +# repository that may contain newer fai packages for buster +#deb http://fai-project.org/download buster koeln diff -Nru fai-5.3.6ubuntu1/conf/upstart-fai.conf fai-5.9.4ubuntu1/conf/upstart-fai.conf --- fai-5.3.6ubuntu1/conf/upstart-fai.conf 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/conf/upstart-fai.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -# fai - start the fully automatic installation - -description "start fully automatic installation" - -start on local-filesystems - -console output - -task -exec /usr/sbin/fai diff -Nru fai-5.3.6ubuntu1/debian/changelog fai-5.9.4ubuntu1/debian/changelog --- fai-5.3.6ubuntu1/debian/changelog 2017-04-22 10:25:52.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/changelog 2020-09-03 02:12:33.000000000 +0000 @@ -1,3 +1,564 @@ +fai (5.9.4ubuntu1) groovy; urgency=low + + * Merge from Debian unstable. Remaining changes: + - conf/NFSROOT + + Replace debian linux-image-* with linux-image-generic (not + linux-image-server, which no longer exists). + - conf/{sources.list, nfsroot.conf}: + + Adjust to Ubuntu sources. + - conf/nfsroot.conf: + + Add "dhcp-client" to "--exclude" to FAI_DEBOOTSTRAP_OPTS. + * Dropped changes, no longer needed: + - bin/fai-cd: + + Add missing grub-common package. + - examples/simple/scripts/GRUB_PC/10-setup: + + Add command to regenerate grub.cfg. + * Update to focal as the default instead of the long-obsolete artful. + + -- Steve Langasek Wed, 02 Sep 2020 19:12:33 -0700 + +fai (5.9.4) unstable; urgency=low + + [ Emmanuel Kasper ] + * control: add dependency procps + + [ Andrew Bezella ] + * fai: initialize final_exit_code variable + + [ Thomas Lange ] + * etc/NFSROOT: add class DEBIAN_, Closes: #956364 + * add support for Ubuntu focal 20.04 + * fai-make-nfsroot: fix dracut warning + * mk-basefile: add bullseye, focal + * 30-interface: also try altname of network interface + * add ubuuntu focal support + + -- Thomas Lange Sun, 26 Apr 2020 22:08:56 +0200 + +fai (5.9.3) unstable; urgency=medium + + [ Thomas Lange ] + * updatebase.UBUNTU,UBUNTU/90-apt: use hook for setting locale instead + of debconf preseeding + * FAIBASE/10-misc: only add /tmp entry to fstab if not in disk_config, + first restore hosts.orig, then append my own IP + + [ Andrew Bezella ] + * fai-divert: use which instead of command -v + + -- Thomas Lange Fri, 20 Mar 2020 15:40:53 +0100 + +fai (5.9.2) unstable; urgency=low + + [ Thomas Lange ] + * upgrade standards version to 4.5.0, no changes + * use debhelper-compat instead of debian/compat + * fai-make-nfsroot: handle new packages dracut-live and dracut-squash, + make sure initrd will only be generated once + * fai-nfsroot.preinst: rename file to insserv does not complain + * NFSROOT: add pigz, used by dracut, add nmve tool + * task_sysinfo: list nvme devices + * task_inventory: list nvme devices and virtual disks + * 20-removable_media: no more entry for floppy in fstab + * setup-storage: fix preserve with btrfs fs, Closes: #945239 + do not sync md devices after they are created, + this only applies during an installation from nfsroot + replaces mountdisks.DEFAULT + * Init.pm: print debug info also at the end + + [ Donovan Keohane ] + * fai-mirror: check if list is empty before calling reprepro + * man pages: lots of proof reading + * get-config-dir, fai-divert: Migrate which to command -v + * Prefer 'grep -E' over 'egrep' + + [ Carsten Aulbert ] + * fai-monitor: Add two more options to allow for custom strftime strings + + -- Thomas Lange Thu, 20 Feb 2020 21:37:26 +0100 + +fai (5.9.1) unstable; urgency=low + + * remove support for old CentOS 5/6/7 releases + * examples: update class CENTOS for CentOS 8, use dnf instead of yum + * grub.cfg: add search + * check-cross-arch: check binary 'more' instead of 'ls' + * scripts/DEBIAN/40-misc: add missing $target + * mk-basefile: add --numeric-owner, add CentOS 8 + + -- Thomas Lange Fri, 24 Jan 2020 22:15:32 +0100 + +fai (5.9) unstable; urgency=low + + [ Thomas Lange ] + * Parser.pm: allow more spaces, closes: #945164 + * new scripts fai-link, fai-sed + * fai-cd: add support for UEFI + * grub.cfg, grub.cfg.autodiscover: add UEFI support, fix legacy boot + config + * fai-kvm: add option -E, support for UEFI + * NFSROOT: do not install subversion, add grub-efi-amd64-bin, move some + packages to default section + * get-boot-info: remove loop, fix wrong IP settings in boot.log + * check-cross-arch: add support if /bin/ls is a symlink + * fai-make-nfroot: delete tmp dir before using it + * task_inventroy, task_sysinfo: print UEFI boot infos if available + * 85-efi-classes: script that defined classes for disk configs when + booting with UEFI + + [ Vinzenz Vietzke ] + * Extending zypper install commands for patterns and products + + [ corbolais ] + * fix several typos + + -- Thomas Lange Tue, 07 Jan 2020 09:20:52 +0100 + +fai (5.8.9) unstable; urgency=medium + + * install_packages: fix bug that created package lists with additional + packages + + -- Thomas Lange Fri, 04 Oct 2019 23:31:14 +0200 + +fai (5.8.8) unstable; urgency=medium + + * no source changes, new version needed because of wrong upload before + + -- Thomas Lange Thu, 03 Oct 2019 23:26:05 +0200 + +fai (5.8.7) unstable; urgency=low + + [ Thomas Lange ] + * subroutines: support apt keys like package_config/CLASS.gpg + * install_packages: handle shell variables in a package name + * fai-mirror: add option -V, Closes: #909576 + avoid variable name clashes + * fcopy: do not fail if File::lchown module is not available, + Closes: #925590 + * fai-guide.txt: better explain first server installation, + add section about nfsroot and NFS v4 + * fai-chboot: remove redundant message + * savelog.LAST.sh: add ignore patterns + * use command -v instead of type and which + + -- Thomas Lange Thu, 19 Sep 2019 09:54:10 +0200 + +fai (5.8.6) unstable; urgency=high + + * DEMO/10-misc: fix variable name + + -- Thomas Lange Fri, 30 Aug 2019 10:55:47 +0200 + +fai (5.8.5) unstable; urgency=high + + [ Thomas Lange ] + * fai-make-nfsroot, add conf/fai-project.gpg: + add key for fai-project.org repository, Closes: #933185 + * fai-make-nfsroot: use long key ID + * subroutines: remove wait_for_jobs() and jobrunning(), prevent + undefined variable + umount /run/dev in target, Closes: #928981 + * fai-mirror: allow packages without .deb suffix + * fai-chboot: better info messages + * fai-kvm: allow kvm options after --, Closes: #929679 + * fai-cd: make first partition bootable, Closes: #926693 + * Makefile: use sed instead of perl + * add fai-server.maintscript + * compat: use debhelper compat level 11 + * rules: use dh instead of dh_ tools + * setup-storage: use internal variable name when in debug mode + * Commands.pm: always set boot flag for /boot/efi, Closes: #931451 + * fai-cd.8: add option -V + * fai-guide.txt: fix a lot of small typos + * task_sysinfo: remove init.d call which does not exists any more + * fai-mk-network: detect default network device + * fai-guide.txt: update kernel version and some newer output examples + * grub.cfg.autodiscover: drop unused option + * check-cross-arch: add test if qemu static is needed in target + + [ Donovan Keohane ] + * Commands.pm: fixes creating btrfs subvolumes + https://github.com/faiproject/fai/pull/81 + + [ mroelandts ] + * fai-cd: add option -V + + -- Thomas Lange Thu, 29 Aug 2019 17:08:49 +0200 + +fai (5.8.4) unstable; urgency=low + + [ Thomas Lange ] + * updatebase: mount /run/udev into /target, Closes: #925247 + * fai-cd.8: improve -d description + * fix several typos + + [ Björn Torkelsson ] + * fai-make-nfsroot: foreign architecture may not be defined + Closes: #925246 + + [ Nicolas Souedet ] + * Commands.pm: fix wrong Perl dereferencing, Closes: #925469 + + -- Thomas Lange Wed, 27 Mar 2019 22:44:02 +0100 + +fai (5.8.3) unstable; urgency=medium + + * fai-server.prerm: add test, Closes: #924227 + * NFSROOT: add gpg for buster and beyond + + -- Thomas Lange Tue, 12 Mar 2019 17:03:56 +0100 + +fai (5.8.2) unstable; urgency=low + + * NFSROOT,nfsroot.conf,sources.list,mkdebmirror: change defaults + to buster + * fai-mirror: better regex for matching the backports name, + do not use hardcoded release name + * conf/NFSROOT: replace big packages with smaller replacements + * README.build-sources: fix git command + * README: major rewrite + + -- Thomas Lange Thu, 07 Mar 2019 22:29:46 +0100 + +fai (5.8.1) unstable; urgency=low + + * 30-interfaces: add support for Ubuntu's netplan + * package_config/{UBUNTU,XORG}: add ubuntu-server except when installing + desktop + + -- Thomas Lange Thu, 14 Feb 2019 15:44:08 +0100 + +fai (5.8) unstable; urgency=low + + * fcopy: change precedence of mode handling, Closes: #918185 + * fai-make-nfsroot: copy files needed for UEFI + * NFSROOT: add efibootmgr + * fai-doc.txt: add info about FAIme + * dhcpd.conf: rename grubnetx64.efi to syslinux.efi + * control: new standards version + + -- Thomas Lange Wed, 13 Feb 2019 00:29:14 +0100 + +fai (5.7.4) unstable; urgency=low + + [ Thomas Lange ] + * fai-make-nfsroot: fix dracut module net-genrules.sh + * get-boot-info: kill dhclient after use + * control: remove dummy package + * add network-manager-gnome to class XFCE + * 30-interfaces: do not add network device to interfaces if + NetworkManager is installed + + -- Thomas Lange Wed, 30 Jan 2019 13:33:11 +0100 + +fai (5.7.3) unstable; urgency=low + + [ Thomas Lange ] + * setup-storage: instead of setting the cipher and size, use the + defaults of cryptsetup which is currently aes-xts-plain64 + do not set cipher to old aes-cbc-essiv:sha256, Closes: #911372 + add discard option when using luks, Closes: #911675 + write EFI partition to disk_var.*, Closes: #911374 + support raid device names like /dev/md/nv-root + use fixed units when getting LVM info, Closes: #909318 + * when using nfs:// in FAI_CONFIG_SRC use server name from nfsroot if + not specified + * fai: allow setting of $romountopt from outside fai, Closes: #910083 + + [ Michael Schaller ] + * doc/Makefile: Fix parallel package builds with dpkg-buildpackage -j2. + + -- Thomas Lange Thu, 03 Jan 2019 12:44:10 +0100 + +fai (5.7.2) unstable; urgency=low + + [ Thomas Lange ] + * setup-storage: add option -y + * control: remove Mika from uploaders + + [ Jelmer Vernooij ] + * Use secure URI in Vcs control header. + + -- Thomas Lange Tue, 18 Sep 2018 21:05:20 +0200 + +fai (5.7.1) unstable; urgency=low + + [ Thomas Lange ] + * fai-make-nfsroot, fai, examples/simple: use Perl regex with grep + * scripts/DEBIAN/30-interface: add interfaces.d, use ethX name when + getting CIDR + * fai-diskimage: add suport for sparse images using img2simg, suffix + .simg + * fai-diskimage.8: add info about formats + * fai-disk-info: allow more than 10 nvme and mmcblk devices + * fai-do-scripts: if file type is unknown, just execute script or + executable, Closes: #907799 + * fai.8: better explanation, Closes: #845529 + * do not use netselect for Ubuntu mirror, use new variable ubuntumirror + in class/UBUNTU.var + * control: update standards version + + [ Achim Bohnet ] + * packages_config: treat UBUNTU + XORG same way as DEBIAN + XORG + + [ Andrew Bezella ] + * updatebase: use private mounts for /dev and /dev/pts + + [ Martin Krämer ] + * mk-basefile: support empty EXCLUDE_ variable, + Closes: #907556 + + -- Thomas Lange Mon, 10 Sep 2018 13:29:00 +0200 + +fai (5.7) unstable; urgency=low + + [ Thomas Lange ] + * move subdir examples/simple into submodule + * setup-storage.8: describe NFS diskless client support + * replace xenial with bionic + * add german setting for Bionic + * install_packages: remove unused code, add variable + FAI_DISABLE_PACKAGE_NAME_CHECK which does the same as -N, + Closes: #894561 + * NFSROOT: add packages for armhf + * fai-make-nfsroot: also match --arch ARCH, Closes: #895204, + also copy *.gpg keys into nfsroot + * subroutines: do not use array variable when defining $cmdline, use + just a plain string, remove some unused code, create resolv.conf + before starting rsyslogd + * fai-mirror: add AllowInsecureRepositories, catch errors of + install_packages + * mkdebmirror: add --keyring + * task_inventory: add bios date + * README: add info about git submodule + * control: update standards version + * GRUB*/10-setup: add code for detecting /boot in lvm-on-md, + Closes: #892279, special handling is not needed for legacy bios, + for UEFI Bios, test for /dev/loop instead of hostdisk, Closes: #900363 + * class/60-misc: fix tests for GRUB_EFI and GRUB_PC + * dhcpd.conf: add test for UEFI clients + * 10-rootpw: enable sudo for $username if no root pw was set + + * fai-cd: use trusted=yes instead of allow-insecure=yes for local + repository, better error messages when internal ext3 image is to small + + [ Ian Kelling ] + * fai-cd: fix empty expansion causing superflous 1 exit + + [ Riku Voipio ] + * subroutines, check-cross-arch: fix --print-foreign-architectures + parsing + + [ Andreas Heinlein ] + * subroutines: also install apt keys in binary (.gpg) format in + /etc/apt/trusted.gpg.d + + [ Markus Lindberg ] + * fai-make-nfsroot, subroutines: add AllowInsecureRepositories to + suppress errors for newer versions of APT + + [ Henrique de Moraes Holschuh ] + * fai-guide.txt: clarify how PACKAGE override works + + [ Frank Steinberg ] + * setup-storage: add support for NFS diskless clients + + [ Derek Poon ] + * subroutines: run gpg in FAI to convert .asc files to .gpg files + + -- Thomas Lange Mon, 04 Jun 2018 11:51:15 +0200 + +fai (5.6) unstable; urgency=medium + + * conf/sources.list: enable project repository by default + * LAST/50-misc: if faiserver was installed, use project repository + * nfsroot.conf.5: add SERVERINTERFACE + * fai-new-mac: use iproute instead of arp command + * fai-make-nfsroot: support ED25519 instead of DSA keys + * fcopy: remove needless code + * mk-basefile: add bionic + + -- Thomas Lange Wed, 28 Feb 2018 13:34:44 +0100 + +fai (5.5.5) unstable; urgency=low + + * fai-make-nfsroot: fix syntax error when not using -p or -P + + -- Thomas Lange Fri, 23 Feb 2018 14:20:39 +0100 + +fai (5.5.4) unstable; urgency=low + + [ Thomas Lange ] + * remove initramfs-tools from package_config, so we can also use dracut + * fai-diskimage: add support for raw.xz and raw.zst, enable multiple + threads support for xz and zstd + * mk-basefile: do not exclude tasksel + * fai-make-nfsroot: add -P, fix syntax error + * 41-warning.sh: abort if ESC is pressed + + [ Markus Lindberg ] + * mountdisks.DEFAULT: use sync_action functionality instead of setting + limits + + -- Thomas Lange Fri, 23 Feb 2018 13:19:49 +0100 + +fai (5.5.3) unstable; urgency=low + + [ Thomas Lange ] + * fai-make-nfsroot: do not activate soft RAID arrays + * task_inventory, task_sysinfo: activate soft RAID + * subroutines: update process name + + [ Jean-Mathieu Chantrein ] + fai-guide.txt: add link to french version + + -- Thomas Lange Fri, 02 Feb 2018 14:06:52 +0100 + +fai (5.5.2) unstable; urgency=low + + * fai-mirror: fix some minor warning + * mkdebmirror: add backports, use http + * Makefile: fix minor error, use filter-out + + -- Thomas Lange Sat, 20 Jan 2018 20:42:52 +0100 + +fai (5.5.1) unstable; urgency=low + + [ Thomas Lange ] + * control: add depends to e2fsprogs, Closes: #887208, #887287 + * fcopy: after variable substitution execute preinst, Closes: #882485 + * always use --xattrs --acls when operation on base files, + Closes: #881829 + * fai-mirror: add support for backports + * fai: new variable FAI_RUNDIR + * LAST/50-misc: for architecture ARM copy kernel and initrd to + $FAI_RUNDIR + * fai-cd: support ISO images >4GB + * savelog.LAST.sh: add ignore patterns + * package_config/XORG: update package name + * scripts/: add user only if $username is defined + * 10-rootpw: if $ROOTPW is empty, lock password for root account, + instead of setting empty password + * Commands.pm: add -f to wipefs, currently not used for all calls + * fai-mk-network: add -i + * fai-kvm: use printf instead of dc + * mountdisks.DEFAULT: new hook that stops sync of soft raid during + installation + * don't use 'apt-key add', just copy the *.asc files + * fai-mk-configspace.1: add man page, Closes: #886918 + * DEMO/10-misc: disable the which xfce panel question for the new user + * Makefile: use filter-out + + -- Thomas Lange Thu, 18 Jan 2018 16:42:44 +0100 + +fai (5.5) unstable; urgency=low + + [ Thomas Lange ] + * fcopy: add option -S, substitute {%varname%} by value of the variable, + Closes: #874188 + * subroutines: fix call of debootstrap, Closes: #878405 + * fai-cd: add -c, -n, code cleanup, do not use memtest from host + the local mirror is insecure, since it's not signed + * fai-mirror: add -s, remove suite from reprepro config + * mk-basefile: add sid + * fai-make-nfsroot: request a certain key instead of grep, Closes: #878447 + add options -N, -s + * fai-diskimage,subroutines: add support for zerofree + * fai-setup: do not add a line for nfsv4 with fsid=0 any more + * fai-chboot: force nfs v3 for the nfsroot + * get rid of aptitude + * remove class GCE + * fai-kvm: use virtio for better network performance also for user mode + network, boot order disk then CD + * move NEWS.Debian to NEWS + * fai: use debian as hostname if no IP is set + * get-boot-info: major cleanup, move some code from subroutines to here + * NFSROOT: use install-norec, add classes NONFREE and FULL + * 41-warning: use red background + * config space: instead of fixed name demo, the variable $username and + $USERPW is used, use tmpfs for /tmp + * disk_config: no separate partition for /tmp, better sizes + * grub.cfg: new order of menu entries, use unicode font + * install_packages: fix -l and -L output when using install and + install-norec at the same time + * 30-interface: add test if NIC1 is defined + * fai-scan.sh: force nfs v3 for the nfsroot + + [ Eli Taft ] + * fai-cd.8: Adding a note about the grub config + + [ Juri Grabowski ] + * subroutines: call fai-chboot on remote also with MAC address + + [ Andrew Ruthven ] + * fcopy: Add -S to help output + + -- Thomas Lange Wed, 08 Nov 2017 17:09:00 +0100 + +fai (5.4) unstable; urgency=low + + [ Thomas Lange ] + * support foreign (cross) architectures in fai-make-nfsroot, subroutines + * new script fai-mk-configspace, used by fai-setup + * move from httpredir to deb.debian.org, also replace + security.debian.org + * GRUB*/10-setup: device.map is not needed any more + * fetch-basefile: use simple array instead of eval and indirect + variables, Closes: #868267 + * fai-cd: add option -s to fai-cd, calculate size after hiding + directories, adjust image size, some builds with option -H fail + because of to few space in the image + * fai-mirror: use the trusted keys from the host when downloading the + packages, remove hardcoded architectures + * subroutines: obfuscate all variable definitions ending with PW, like + LUKSPW, MYOWNPW,... in fai.log + do not print message about keys not loaded to apt-key + task_faiend: many changes for better handling fai-diskimage, + disable vg and write name of vg into /var/run/fai/vgremove.$PPID + remove sync call + task_savelog: do not exit that early for dirinstall and fai-diskimage + * fai-diskimage: remove debug option, exit with code from fai call + Closes: #866331, remove vg used inside a loop device + * mk-basefile: add buster, add support for cross architectures (-f) + * fai-make-nfsroot: omit more dracut modules, Closes: #857635 + * move grep call into awk + * fai-cd: check all mandatory commands at once + * fai-disk-info: remove the USB boot stick from $disklist + * check-cross-arch: new script, that compares the host architecture and + the architecture inside the target + * control: change priority, update standards version + * remove upstart support + * use invoke-rc.d instead of calling /etc/init.d/ scripts + * setup-storage, fai-diskimage: add variable SS_IGNORE_VG + which contains the list of volume groups to be ignored Closes: #860141 + * fai-kvm: add format if raw is used, add test for -u + * sources.list: add apt_cdn for template expansion for sources.list + * fai: check if task_error was set and exit with proper value + * subroutines: do not overwrite $task_error for every new task, add new + local variable, write task_error to a file, Closes: #866331 + print location of log files + * updatebase: use apt-get instead of aptitude + * fai-chboot: add option -q + * disk_config/XENIAL: new config with metadata_csum disabled + * package_config/FAIBASE: add apt-transport-https + * LAST/50-misc: set error if no kernel was installed + + [ Henning Glawe ] + * Parser.pm: resolve /dev/disk/by-id/ symlinks for lvm/raid configs + + [ Marcus Fenner ] + * Add support for eMMC storages, Closes: #863893 + + [ Juri Grabowski ] + * control,conf/NFSROOT: add fdisk dependency for Buster and Bullseye, + Closes: #872109 + + [ Noah Meyerhans ] + * Disable systemd's network interface name management, see #863385 + + -- Thomas Lange Thu, 05 Oct 2017 18:44:03 +0200 + fai (5.3.6ubuntu1) artful; urgency=medium * Merge from Debian unstable. Remaining changes: @@ -1865,7 +2426,7 @@ [ Thomas Lange ] * menu.lst: remove year * fai-cd: add option -B, that creates a boot-only CD (without containing - the nfsroot, the partitial mirror and the config space) + the nfsroot, the partial mirror and the config space) * conf/menu.lst.boot-only: new config file for the boot only CD * fai-cd.8: add option -B * fai-abort: add missing lsb header diff -Nru fai-5.3.6ubuntu1/debian/compat fai-5.9.4ubuntu1/debian/compat --- fai-5.3.6ubuntu1/debian/compat 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -9 diff -Nru fai-5.3.6ubuntu1/debian/control fai-5.9.4ubuntu1/debian/control --- fai-5.3.6ubuntu1/debian/control 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/control 2020-09-03 02:12:33.000000000 +0000 @@ -1,20 +1,19 @@ Source: fai Section: admin -Priority: extra +Priority: optional Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Thomas Lange -Uploaders: Michael Prokop -Standards-Version: 3.9.8 +Standards-Version: 4.5.0 Build-Depends-Indep: asciidoc-dblatex, w3m, dblatex, docbook-xsl, libparse-recdescent-perl -Build-Depends: debhelper (>= 7), libgraph-perl -Vcs-Git: git://github.com/faiproject/fai.git +Build-Depends: debhelper-compat (= 12), debhelper (>= 11), libgraph-perl +Vcs-Git: https://github.com/faiproject/fai.git Vcs-Browser: https://github.com/faiproject/fai -Homepage: http://fai-project.org +Homepage: https://fai-project.org Package: fai-client Architecture: all -Depends: perl, file, libapt-pkg-perl, libfile-lchown-perl, iproute2 | iproute, debconf-utils, ${misc:Depends} -Recommends: libgraph-perl +Depends: perl, file, libapt-pkg-perl, libfile-lchown-perl, iproute2, debconf-utils, procps, ${misc:Depends} +Recommends: libgraph-perl, fdisk | util-linux (<< 2.29.2-3~) Suggests: logtail Breaks: fai-nfsroot (<< 5.2) Replaces: fai-nfsroot (<< 5.2) @@ -42,9 +41,9 @@ Package: fai-server Architecture: all -Depends: fai-client, debootstrap, xz-utils, ${misc:Depends} -Recommends: nfs-kernel-server, isc-dhcp-server, tftpd-hpa | atftpd, openssh-server, openssh-client, openbsd-inetd | inet-superserver, libproc-daemon-perl -Suggests: debmirror, reprepro, xorriso, squashfs-tools, binutils, grub2, aptitude, perl-tk, qemu-utils, fai-setup-storage +Depends: fai-client, e2fsprogs, debootstrap, xz-utils, ${misc:Depends} +Recommends: nfs-kernel-server, isc-dhcp-server, tftpd-hpa | atftpd, openssh-server, openssh-client, openbsd-inetd | inet-superserver, libproc-daemon-perl, dosfstools, mtools +Suggests: debmirror, reprepro, xorriso, squashfs-tools, binutils, grub2, perl-tk, qemu-utils, fai-setup-storage Description: Fully Automatic Installation server package FAI is a non-interactive system to install, customize and manage Linux systems and software configurations on computers as well as @@ -76,7 +75,7 @@ Package: fai-nfsroot Architecture: all -Depends: fai-client (>=5.2), fai-setup-storage, pxelinux| syslinux-common, ${misc:Depends} +Depends: fai-client (>=5.2), fai-setup-storage, pxelinux| syslinux-common, syslinux-efi, ${misc:Depends} Description: Fully Automatic Installation nfsroot package FAI is a non-interactive system to install, customize and manage Linux systems and software configurations on computers as well as @@ -88,7 +87,7 @@ Package: fai-setup-storage Architecture: all -Depends: perl, libparse-recdescent-perl, liblinux-lvm-perl, parted, ${misc:Depends} +Depends: perl, e2fsprogs, libparse-recdescent-perl, liblinux-lvm-perl, parted, ${misc:Depends} Recommends: lvm2, mdadm Suggests: dmsetup, cryptsetup, dosfstools, jfsutils, ntfs-3g, reiserfsprogs, xfsprogs Description: automatically prepare storage devices diff -Nru fai-5.3.6ubuntu1/debian/copyright fai-5.9.4ubuntu1/debian/copyright --- fai-5.3.6ubuntu1/debian/copyright 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/copyright 2020-04-27 02:48:19.000000000 +0000 @@ -1,14 +1,14 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Files: * -Copyright: 1999-2014 Thomas Lange +Copyright: 1999-2017 Thomas Lange License: GPL-2+ Comment: Other contributions copyright by Thomas Gebhardt Henning Glawe Michael Goetze - Kerim Güney + Kerim Güney Jonas Hoffmann Christian Kern Holger Levsen diff -Nru fai-5.3.6ubuntu1/debian/docs fai-5.9.4ubuntu1/debian/docs --- fai-5.3.6ubuntu1/debian/docs 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/docs 2020-04-27 02:48:19.000000000 +0000 @@ -1,3 +1,4 @@ +NEWS README THANKS doc/QUESTIONNAIRE diff -Nru fai-5.3.6ubuntu1/debian/fai-client.install fai-5.9.4ubuntu1/debian/fai-client.install --- fai-5.3.6ubuntu1/debian/fai-client.install 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-client.install 2020-04-27 02:48:19.000000000 +0000 @@ -12,11 +12,14 @@ usr/lib/fai/fetch-basefile usr/lib/fai/task_inventory usr/lib/fai/mount2dir +usr/lib/fai/check-cross-arch usr/bin/device2grub usr/bin/fai-class usr/bin/fai-debconf usr/bin/fai-do-scripts usr/bin/ainsl +usr/bin/fai-link +usr/bin/fai-sed usr/bin/fai-deps usr/bin/fai-kvm usr/sbin/fai diff -Nru fai-5.3.6ubuntu1/debian/fai-client.manpages fai-5.9.4ubuntu1/debian/fai-client.manpages --- fai-5.3.6ubuntu1/debian/fai-client.manpages 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-client.manpages 2020-04-27 02:48:19.000000000 +0000 @@ -1,11 +1,13 @@ -debian/tmp/man/fai.8 -debian/tmp/man/fcopy.8 -debian/tmp/man/ftar.8 -debian/tmp/man/install_packages.8 -debian/tmp/man/fai-class.1 -debian/tmp/man/fai-debconf.1 -debian/tmp/man/fai-do-scripts.1 -debian/tmp/man/ainsl.1 -debian/tmp/man/fai-statoverride.8 -debian/tmp/man/fai-deps.8 -debian/tmp/man/fai.conf.5 +man/fai.8 +man/fcopy.8 +man/ftar.8 +man/install_packages.8 +man/fai-class.1 +man/fai-debconf.1 +man/fai-do-scripts.1 +man/ainsl.1 +man/fai-link.1 +man/fai-sed.1 +man/fai-statoverride.8 +man/fai-deps.8 +man/fai.conf.5 diff -Nru fai-5.3.6ubuntu1/debian/fai-nfsroot.install fai-5.9.4ubuntu1/debian/fai-nfsroot.install --- fai-5.3.6ubuntu1/debian/fai-nfsroot.install 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-nfsroot.install 2020-04-27 02:48:19.000000000 +0000 @@ -9,5 +9,4 @@ usr/share/fai/dhclient-fai.conf etc/apt/apt.conf.d/90fai etc/init.d/fai-abort -etc/init/fai.conf usr/lib/dracut/modules.d diff -Nru fai-5.3.6ubuntu1/debian/fai-nfsroot.preinst fai-5.9.4ubuntu1/debian/fai-nfsroot.preinst --- fai-5.3.6ubuntu1/debian/fai-nfsroot.preinst 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-nfsroot.preinst 2020-04-27 02:48:19.000000000 +0000 @@ -5,7 +5,7 @@ exit 1 fi -dpkg-divert --package fai-nfsroot --add --rename /etc/init.d/rcS +dpkg-divert --package fai-nfsroot --add --divert /etc/init.d/rcS.orig --rename /etc/init.d/rcS #DEBHELPER# diff -Nru fai-5.3.6ubuntu1/debian/fai-server.install fai-5.9.4ubuntu1/debian/fai-server.install --- fai-5.3.6ubuntu1/debian/fai-server.install 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-server.install 2020-04-27 02:48:19.000000000 +0000 @@ -9,9 +9,11 @@ usr/sbin/fai-new-mac usr/sbin/dhcp-edit usr/bin/fai-mirror +usr/bin/fai-mk-configspace usr/share/fai/pixmaps/* etc/fai/grub.cfg etc/fai/grub.cfg.autodiscover etc/fai/NFSROOT etc/fai/apt/sources.list +etc/fai/apt/trusted.gpg.d/fai-project.gpg etc/fai/nfsroot.conf diff -Nru fai-5.3.6ubuntu1/debian/fai-server.maintscript fai-5.9.4ubuntu1/debian/fai-server.maintscript --- fai-5.3.6ubuntu1/debian/fai-server.maintscript 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-server.maintscript 2019-10-17 01:08:18.000000000 +0000 @@ -0,0 +1 @@ +mv_conffile /etc/fai/make-fai-nfsroot.conf /etc/fai/nfsroot.conf 3.4.8 diff -Nru fai-5.3.6ubuntu1/debian/fai-server.manpages fai-5.9.4ubuntu1/debian/fai-server.manpages --- fai-5.3.6ubuntu1/debian/fai-server.manpages 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-server.manpages 2020-04-27 02:48:19.000000000 +0000 @@ -1,10 +1,11 @@ -debian/tmp/man/fai-cd.8 -debian/tmp/man/fai-chboot.8 -debian/tmp/man/fai-mirror.1 -debian/tmp/man/fai-setup.8 -debian/tmp/man/fai-monitor.8 -debian/tmp/man/fai-monitor-gui.1 -debian/tmp/man/fai-make-nfsroot.8 -debian/tmp/man/fai-diskimage.8 -debian/tmp/man/dhcp-edit.8 -debian/tmp/man/nfsroot.conf.5 +man/fai-cd.8 +man/fai-chboot.8 +man/fai-mirror.1 +man/fai-setup.8 +man/fai-monitor.8 +man/fai-monitor-gui.1 +man/fai-mk-configspace.1 +man/fai-make-nfsroot.8 +man/fai-diskimage.8 +man/dhcp-edit.8 +man/nfsroot.conf.5 diff -Nru fai-5.3.6ubuntu1/debian/fai-server.postinst fai-5.9.4ubuntu1/debian/fai-server.postinst --- fai-5.3.6ubuntu1/debian/fai-server.postinst 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-server.postinst 2020-04-27 02:48:19.000000000 +0000 @@ -29,10 +29,6 @@ # installation fails and the `postinst' is called with `abort-upgrade', # `abort-remove' or `abort-deconfigure'. -if dpkg-maintscript-helper supports mv_conffile 2>/dev/null; then - dpkg-maintscript-helper mv_conffile /etc/fai/make-fai-nfsroot.conf /etc/fai/nfsroot.conf 3.4.8 -- "$@" -fi - case "$1" in configure) diff -Nru fai-5.3.6ubuntu1/debian/fai-server.postrm fai-5.9.4ubuntu1/debian/fai-server.postrm --- fai-5.3.6ubuntu1/debian/fai-server.postrm 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-server.postrm 2020-04-27 02:48:19.000000000 +0000 @@ -5,10 +5,6 @@ set -e -if dpkg-maintscript-helper supports mv_conffile 2>/dev/null; then - dpkg-maintscript-helper mv_conffile /etc/fai/make-fai-nfsroot.conf /etc/fai/nfsroot.conf 3.4.8 -- "$@" -fi - case "$1" in purge) rm -rf /var/run/fai/fai-make-nfsroot diff -Nru fai-5.3.6ubuntu1/debian/fai-server.preinst fai-5.9.4ubuntu1/debian/fai-server.preinst --- fai-5.3.6ubuntu1/debian/fai-server.preinst 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-server.preinst 2020-04-27 02:48:19.000000000 +0000 @@ -13,10 +13,6 @@ # # For details see /usr/share/doc/packaging-manual/ -if dpkg-maintscript-helper supports mv_conffile 2>/dev/null; then - dpkg-maintscript-helper mv_conffile /etc/fai/make-fai-nfsroot.conf /etc/fai/nfsroot.conf 3.4.8 -- "$@" -fi - case "$1" in upgrade) if egrep -q ^FAI_CONFIGDIR= /etc/fai/fai.conf; then diff -Nru fai-5.3.6ubuntu1/debian/fai-server.prerm fai-5.9.4ubuntu1/debian/fai-server.prerm --- fai-5.3.6ubuntu1/debian/fai-server.prerm 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-server.prerm 2020-04-27 02:48:19.000000000 +0000 @@ -31,8 +31,6 @@ . /etc/fai/fai.conf . /etc/fai/nfsroot.conf -test -f /etc/init.d/nfs-kernel-server && nfsserver=nfs-kernel-server - case "$1" in upgrade) exit 0 ;; @@ -44,7 +42,9 @@ fi perl -ni.bak -e "print unless m#^$FAI_CONFIGDIR\s|^$NFSROOT\s#" /etc/exports - [ -n "$nfsserver" ] && /etc/init.d/$nfsserver reload || true + if [ -f /etc/init.d/nfs-kernel-server ]; then + invoke-rc.d nfs-kernel-server reload + fi rmdir $FAI_CONFIGDIR || true diff -Nru fai-5.3.6ubuntu1/debian/fai-setup-storage.manpages fai-5.9.4ubuntu1/debian/fai-setup-storage.manpages --- fai-5.3.6ubuntu1/debian/fai-setup-storage.manpages 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/fai-setup-storage.manpages 2020-04-27 02:48:19.000000000 +0000 @@ -1 +1 @@ -debian/tmp/man/setup-storage.8 +man/setup-storage.8 diff -Nru fai-5.3.6ubuntu1/debian/NEWS fai-5.9.4ubuntu1/debian/NEWS --- fai-5.3.6ubuntu1/debian/NEWS 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/NEWS 1970-01-01 00:00:00.000000000 +0000 @@ -1,785 +0,0 @@ -fai (5.2) unstable; urgency=low - - * new command fai-diskimage creates bootable disk images for your VM - - -- Thomas Lange Fri, 30 Sep 2016 19:33:47 +0200 - -fai (5.0) unstable; urgency=low - - * major rewrite of the FAI guide - * new autodiscover function, the client is searching the network - for a FAI server - * FAI profiles extend the FAI class concept - * FAI shows a curses based menu for selecting a profile on demand - * ready-to-go setup of the FAI server using the FAI CD or USB stick - * ready-to-go FAI profile for CentOS 7 and Ubuntu 14.04 - * Cloning machines using an image (hook debconf.IMAGE) - * action sysinfo now also mounts lvm and RAID devices - * use httpredir.debian.org as default - * fai-cd now uses dracut instead of live-boot, - use of squashfs creates smaller CD images, - fai-cd replaces fai-nfsroot2image - * files *.source are renamed to .sh - * dnf support for rpm based distributions - * improved btrfs support - * new command fai-kvm for starting a virtual machine - * new command fai-mk-network for setting up different test networks - * fai-cd: no networking for the rescue boot entry by default - - -- Thomas Lange Fri, 30 Sep 2016 15:16:31 +0200 - -fai (4.3) unstable; urgency=low - - * add btrfs support to setup-storage - - -- Thomas Lange Mon, 06 Oct 2014 10:33:21 +0200 - -fai (4.2) unstable; urgency=low - - - fai-cd now builds a hybrid ISO image - - -- Thomas Lange Fri, 23 May 2014 13:46:47 +0200 - -fai (4.0) unstable; urgency=low - - - New script names: - faimond -> fai-monitor - faimond-gui -> fai-monitor-gui - make-fai-nfsroot -> fai-make-nfsroot - disk-info -> fai-disk-info - - make-fai-nfsroot.conf renamed to nfsroot.conf - - task prepareapt renamed to repository - - task mirror was removed and is now part of task repository - - add task tests to action dirinstall and softupdate - - old tool setup_harddisks removed. Use setup-storage instead - - new script fai-nfsroot2image - - new script fai-new-mac - - new variables $FAI_BASEFILEURL adds support for receiving basefile via - ftp and http - - multicore support in fai-make-nfsroot (rm and xz compression is done - in the background - - huge speedup in fai-make-nfsroot using ramdisk (package installation - is twice as fast) - - ifclass new options -a and -o - - fai-make-nfsroot new option -a, -g, -l, remove -U, -r - - fai-make-nfsroot dracut is now the default initramfs creator inside - the nfsroot which replaces live-boot and initramfs-tools - - fai-monitor-gui: add option -s - - *.asc files are loaded by class names - - the variable $FAI does not need to be set in fai.conf, since all - scripts use the default value of /var/lib/fai/config - - add support for python, ruby and zsh scripts to fai-do-scripts - - fai-chboot must specify the config space URL - - fai-chboot: new option -E - - FAI supports NFS v4 using dracut - - install apt keys from /etc/fai/apt/keys into nfsroot - - fcopy can copy symlinks using -H - - FAI can work without any NFS access - - action softupdates now calls task repository - - add dracut support - - new FAI_FLAG halt - - add variable AINSL_TARGET - - new log file fai-monitor.log on the install client - - -- Thomas Lange Tue, 10 Apr 2012 11:48:33 +0200 - -fai (3.4.4) unstable; urgency=low - - - This stable release is targeted towards Debian/squeeze but continues - to provide support for older Debian releases as well. - If you want to deploy the Debian lenny release please see - /usr/share/doc/fai-doc/lenny-instructions.txt for instructions. - - - Please note that due to Debian's switch from /bin/bash to /bin/dash - as default /bin/sh shell your scripts/hooks/... should use - /bin/bash in the shebang line if you're using the environment of FAI. - Otherwise you might notice problems like "ifclass" not being defined. - - - FAI project homepage moved to its own domain http://fai-project.org/ - Along with the new web home also the wiki moved. - If your sources.list configuration includes something like: - - deb http://www.informatik.uni-koeln.de/fai/download lenny koeln - - please change it to the new URL accordingly, like: - - deb http://fai-project.org/download lenny koeln - - -- Michael Prokop Thu, 14 Oct 2010 17:29:35 +0200 - -fai (3.3) unstable; urgency=low - - - variable FAI_CONFIGDIR moved from fai.conf to make-fai-nfsroot.conf - - automatic tests are now supported - - dirinstall now uses FAI_CONFIG_SRC instead of FAI_CONFIGDIR - - files named package_config/*.asc are added to the list of apt keys - - cvs, bootpc, expect and mdetect are not installed by default into the - nfsroot - - -- Thomas Lange Tue, 03 Nov 2009 09:35:06 +0100 - -fai (3.2.8) unstable; urgency=low - - - new partition tool setup-storage added - - -- Thomas Lange Sun, 15 Jun 2008 12:47:16 +0200 - -fai (3.2.2) unstable; urgency=low - - - LOGDIR is now /var/log/fai/$HOSTNAME/$FAI_ACTION_date+time - - LOGDIR is /tmp/fai during an installation (not dirinstall), and - will be copied to the path above at the end of an installation - - -- Thomas Lange Fri, 16 Nov 2007 17:46:49 +0100 - -fai (3.2) unstable; urgency=low - - - replace special fai-kernels with plain Debian kernel and an initrd - build by initramfs ($KERNELPACKAGE removed) - - FAI uses live-initramfs for booting, the whole nfsroot is now - writeable for the clients (by using unionfs) - - fai-cd can create bootable USB sticks - - major update to the fai guide - - scp/ssh are now the default methods instead of rcp/rsh when - contacting the install server - - faimond can now call fai-chboot (instead of rsh/ssh call) - - Task extrbase can also extract files from directory ../basefiles/ - - /tmp/target is now /target - - -- Thomas Lange Tue, 21 Aug 2007 17:43:30 +0200 - -fai (3.1) unstable; urgency=medium - - - rename action dirinst to dirinstall - - fai: add option -u,--hostname - - -- Thomas Lange Wed, 18 Oct 2006 16:18:36 +0200 - -fai (3.0) unstable; urgency=low - - - WARNING: the fai-guide does not yet reflect the changes from FAI 2 to FAI 3 - - rename NEWS to NEWS.Debian - - /etc/fai/sources.list moved to /etc/fai/apt/sources.list - - lots of new pathes: - use /srv/tftp/fai instead of /boot/fai - use /srv/tftp/fai/pxelinux.cfg instead of /boot/fai/pxelinux.cfg - use /srv/fai/config instead of /usr/local/share/fai - use /srv/fai/nfsroot instead of /usr/lib/fai/nfsroot - use /var/lib/fai/config instead of /fai - use /var/lib/fai/mirror instead of /mnt - - changed file names - variables.sh is now variables.log - - new config file /etc/fai/NFSROOT which contains the package list - for the nfsroot - - changes in variables - remove FAI_REMOTESH and FAI_REMOTECP from fai.conf, - use FAI_LOGPROTO instead - remove $installserver and $mirrorhost in fai.conf - replace FAI_LOCATION by FAI_CONFIG_SRC, use default if undefined: - "nfs://`hostname`$FAI_CONFIGDIR" - LOGSERVER, LOGREMOTEDIR, LOGPASSWD removed from fai.conf, set - them in the config space - MNTPOINT now set to /media/mirror - SERVERINTERFACE not needed by default in make-fai-nfsroot.conf - NFSROOT moved to make-fai-nfsroot.conf - FAICLIENTS, NFSROOT_PACKAGES removed from make-fai-nfsroot.conf - $terror renamed to $task_error - all flags from FAI_FLAGS are now defined as $flag_xxx - $time_zone renamed to $TIMEZONE - $videodrv renamed to $VIDEODRIVER - $FAI_CONSOLEFONT renamed to $CONSOLEFONT - $FAI_KEYMAP renamed to $KEYMAP - $rootpw renamed to $ROOTPW - $moduleslist renamed to $MODULESLIST - new variable FAI_ALLOW_UNSIGNED - - task_updatebase does not use updatebase.log any more - - task_updatebase now logs to fai.log - - all IP addresses of the install server are added to $NFSROOT/etc/hosts - - automatic reboot if no errors are found (if error.log is empty) - - new task dirinst for creating a chroot environment - - try ftar $FAI/basefiles before extracting base.tgz - - install_packages: new option -p (see man install_packages) - - make-fai-nfsroot: add option -V (see man make-fai-nfsroot) - - fai-chboot: change in options, -d is now -D, -r is now -d, -r is - not used any more - - add policy-rc.d support - - move some -c to -C, so now all scripts use -C for cfdir, setting - $FAI_ETC_DIR does the same - - fai-cd can now eject the CD after installation - - fai-mirror remove option -a (now default), add -B - - default is kernel 2.6.17 - - convert cfengine (version 1) scripts to cfengine2 - - rename class XFREE to XORG - - new script ainsl, implements AppendIfNoSuchLine from cfeninge in Perl - - config space can be checked out from a subversion repository - - -- Thomas Lange Wed, 27 Sep 2006 14:41:11 +0200 - -fai (2.10.1) unstable; urgency=low - - - minor fix in fai-chboot - - packages in /files/packages are not supported any more - - fai-mirror: add option -C - - fai-cd: add option -C, grub menu now shows FAI version - - after the installation you can leave the FAI-CD in the drive, - since it now boot from local disk by default - - FAI_FLAG syslogd was removed, syslogd is now started by default - - -- Thomas Lange Thu, 20 Apr 2006 11:46:12 +0200 - -fai (2.10) unstable; urgency=low - - - add option -n to fcopy - - several new listing options for fai-chboot, add option -c for - copying PXE configurations - - verbose output when defining variables - - add urpmi and yum support to install_packages - - add new subroutine mkrw(), which makes read-only directories - writeable. Very cool and usefull thing until we can use unionfs - - When booting from fai-cd the config space /fai is now writeable - - class FAISERVER sets up an apt-proxy - - -- Thomas Lange Mon, 3 Apr 2006 15:11:30 +0200 - -fai (2.9.1) unstable; urgency=low - - - new class FAISERVER can install the fai install server from CD - - new command fai-statoverride - - some bug fixes - - -- Thomas Lange Sun, 5 Mar 2006 22:37:31 +0100 - -fai (2.9) unstable; urgency=low - - - lots of bug fixes - - splitting the FAI package into more packages: - fai-server, fai-client, fai-nfsroot, fai-doc, fai-quickstart - - use a 2.6 kernel by default - - Config scripts named S[0-9][0-9]* are not executed any - more. Rename them to match [0-9][0-9]*. - - fcopy now supports a preinst script, add option -U, ignore .svn - directories - - new option -I for make-fai-bootfloppy can specify default - interface, new option -B creates 2.88M floppy - - use md5 hash for passwords - - backticks and variables can't be used in package_config any more - - root-path does not need to be defined in dhcpd.conf any more - (fai-chboot does it for you) - - fai-cd's El Torito boot image is not limited to 2.88M any more - - -- Thomas Lange Tue, 13 Dec 2005 15:53:00 +0100 - -fai (2.8.4) unstable; urgency=high - - - small but important bug fix: remove non-US entry - - -- Thomas Lange Wed, 25 May 2005 13:59:39 +0200 - -fai (2.8.3) unstable; urgency=high - - - remove debconf support for package itself, debconf support for - the installation was not removed - - -- Thomas Lange Thu, 19 May 2005 15:54:18 +0200 - -fai (2.8.2) unstable; urgency=high - - - close some bugs, which occured when using softupdates - - -- Thomas Lange Fri, 6 May 2005 09:23:34 +0200 - -fai (2.8.1) unstable; urgency=low - - - minor bug fixes - - added $COLOR_FAI_LOGO which is off unless doing initial - installations - - added german and french translation of the debconf templates - - task sysinfo mounts the local partitions read only - - move some classes from 10-base-classes to the new script - 50-host-classes - - fixed a lot of typos in the fai guide - - -- Thomas Lange Sat, 30 Apr 2005 21:20:53 +0200 - -fai (2.8) unstable; urgency=high - - - rename rcS_fai to fai, add manual page fai.8 - - new simple examples using class FAIBASE - - add debconf support for the package itself - - new action softupdates, update a system without reinstallation - - fai-do-scripts now executes scripts matching [0-9][0-9]* - - rcS.log is now fai.log - - major updates in fai-guide (softupdate, fai on other archs) - - add task prepareapt - - variable $addpackages removed from examples scripts - - -- Thomas Lange Sat, 9 Apr 2005 23:43:27 +0200 - -fai (2.7) unstable; urgency=high - - - closes grave and important bugs - - add fai-cd(8) script for creating a bootable FAI CD image - - add option -a to fai-mirror - - add option -d to install_packages - - -- Thomas Lange Fri, 25 Mar 2005 23:51:34 +0100 - -fai (2.6.7) unstable; urgency=low - - - add task debconf and new script fai-debconf for preseeding - - minor updates in the fai guide - - -- Thomas Lange Thu, 10 Mar 2005 11:00:05 +0100 - -fai (2.6.6) unstable; urgency=medium - - - new command fai-mirror(1) to create a partial Debian mirror - - setup_harddisks: bug fix: error redefined mountpoint is wrongly - reported, allow space before keywords primary and logical - - install_packages: add option -f - - task_sysinfo calls hwinfo if available (very nice hardware info) - - 06hwdetect.source: SCSI detect code for 2.6 kernel - - new variable FAICLIENTS in make-fai-nfsroot.conf. Used by - fai-setup for exporting the nfsroot and the config space via NFS - - create a list of all packages in base.tgz (for fai CD) - - ftar: test if directory is / before removing files recursively - - enable shadow passwords for passwd and group in examples - - save files FAI_CLASSES, variables.sh and disk_var.sh to - /var/log/fai not to /etc/fai - - add supprt for booting from CD - - other bug fixes - - -- Thomas Lange Fri, 21 Jan 2005 04:24:26 +0100 - -fai (2.6.5) unstable; urgency=medium - - - fcopy now handles svn and arch subdirectories, added option -I - - install_packages does not remove unknown package names when - using aptitude, so aptitude's search patterns can be used - - -- Thomas Lange Thu, 11 Nov 2004 15:14:08 +0100 - -fai (2.6.4) unstable; urgency=medium - - - bug fixes - - install_packages and files in package_config/ have now support - for aptitude - - -- Thomas Lange Mon, 8 Nov 2004 14:38:58 +0100 - -fai (2.6.3) unstable; urgency=high - - - make $rootpw not readable for users - - use default kernel 2.4.27 - - fai-setup: add option -e - - make-fai-nfsroot: add option -K - - add xfs support into the nfsroot - - define kernel parameters using $kappend - - -- Thomas Lange Mon, 13 Sep 2004 18:40:36 +0200 - -fai (2.6.2) unstable; urgency=high - - - Workaround to support new tasksel behaviour - - fix broken grub entry when using class FAI_BOOTPART - - fai-chboot: add option -e - - -- Thomas Lange Thu, 26 Aug 2004 20:09:15 +0200 - -fai (2.6.1) unstable; urgency=medium - - - new option -k for make-fai-nfroot only installs a new kernel - - catnc() greps now through multiple files - - when logging in with ssh all variables for FAI are defined by - sourcing /tmp/fai/variables.sh - - faireboot sends message to fai monitor daemon - - install_packages now supports taskrm (which calls tasksel - remove), default number of packages that are install with one - command is set to 99 - - better support for installing a client with a different hostname - than during installaion - - -- Thomas Lange Mon, 9 Aug 2004 14:02:13 +0200 - -fai (2.6) unstable; urgency=low - - - make FAI ready-to-use for sarge - - make the examples much easier, remove a lot of unused stuff - - fai.conf is split into two files, make-fai-nfsroot specific - variables are moved to /etc/fai/make-fai-nfsroot.conf - - make-fai-nfsroot: more packages for hardware detection included, - write a warning if $FAI_SOURCES_LIST is used - - rcS_fai: if a file /.nocolorlogo exists, do not enable colored - logo and let scroll region unchanged - - 06hwdetect.source: better hardware detection uses discover2, - load all pci IDE drivers, enables DMA mode for disks, include - code of 11modules.source - - task_sysinfo: show serial numbers of hard disks, show usb - information - - tasks can set return code ($terror) so faimond receives it - - faimond receives more messages - - fai-chboot: new options -d, can use localboot, so we need not - copy the kernel image and initrd to the install server - - grub-install does not probe floppy drive (which can hang the system - for a long time) - - install_packages: add option -L, new code for detecting unknown - package names which uses perl module AptPkg - - mkdebmirror: mirrors now woody and sarge in one directory - - -- Thomas Lange Mon, 26 Jul 2004 17:22:44 +0200 - -fai (2.5.4) unstable; urgency=low - - - fix bug in make-fai-bootfloppy when using -f - - make-fai-bootfloppy: added option -i that creates a bootable - ISO9960 cdrom image - - some sparc and PowerPC adjustments - - -- Thomas Lange Thu, 26 Feb 2004 17:07:31 +0100 - -fai (2.5.3) unstable; urgency=low - - - default kernel is 2.4.24 - - add option -c to make-fai-{nfsroot,bootfloppy} to define a - different configuration directory than /etc/fai - - make-fai-bootfloppy: add option -c and -F, now DHCP is the - default protocol when -d is not used - - fai.conf: exclude more packages from debootstrap - adjust KERNELPACKAGE to new name (since fai-kernels_1.6) - put important variables to the top - remove some comments - - fai-chboot: new option -S sets FAI_ACTION=sysinfo - - The variable FAI_SOURCES_LIST is now obsolete, - use /etc/fai/sources.list or /etc/apt/sources.list instead - - new examples for sources.list in - /usr/share/doc/fai/examples/etc/sources.list - - remove some packages that are not needed and not available in - sarge - - utility chkdebnames mostly rewritten - - package recommends mknbi, and does not work with netboot package - when using BOOTP - - -- Thomas Lange Wed, 4 Feb 2004 14:42:40 +0100 - -fai (2.5.2) unstable; urgency=low - - - fai monitor daemon added, see faimond(8) - - colored copyright message on console - - variable hdparm included again; can be used if the kernel does - not enables DMA for brand new IDE controllers by default - - package names can contain pinning information - - preferences file is copied from /etc/fai if it exists - - default kernel version is 2.4.22 - - bug fixes - - -- Thomas Lange Tue, 6 Jan 2004 15:20:10 +0100 - -fai (2.5.1) unstable; urgency=low - - - minor bug fixes - - added chapter to the fai guide how to receive the configuration - space using CVS - - initrd support when booting new kernel via network - - -- Thomas Lange Fri, 10 Oct 2003 14:58:16 +0200 - -fai (2.5) unstable; urgency=low - - - a new section in the manual which describes a simple - installation example. Read the chapter 'For the impatient user' - - old templates now split into simple and advanced examples. They - are located in /usr/share/doc/fai/examples/{simple,advanced} - - added script fai-chboot which manages the network boot - configuration files for PXE boot - - the installation time is printed in seconds - - menu entries for grub now works also if /boot is a separate - partition - - number of packages installed at a time can be limited (use - $MAXPACKAGES) - - log files can be saved using FTP protocol - - the files in /fai/class that are list of classes can contain - comment lines. All lines starting with a hash are ignored - - syslogd now works during installation - - add an grub entry for memtest86 if installed - - do not fsck ext3 partitions - - add -M option to fcopy - - make-fai-nfsroot: new option -f; print error message if it fails - - a new example configuration for a demo host using GNOME, DHCP - - added XFS support to setup_harddisks - - files class/*.mod and modules.log removed, use 11modules.source - instead - - packages for xfree server now in file/class XFREE - - added SunOS support; you can install Solaris using FAI - - bug fixes as always - - -- Thomas Lange Wed, 6 Aug 2003 16:02:26 +0200 - -fai (2.4.1) unstable; urgency=low - - - use dhcp3, dhcp support was broken in FAI 2.4 - - disk_config examples are using ext3 file systems - - add SERVERINTERFACE to fai.conf - - add FAI_BOOT to fai.conf; the list of boot protocols to set - up (boot or dhcp or both) - - DHCP install kernel file /boot/fai/installkernel renamed to - vmlinuz-install - - new script fai-do-scripts; include the functions from do_script - and task_configure, this makes the Solaris port easier - - some bug fixes - - -- Thomas Lange Thu, 3 Apr 2003 16:57:12 +0200 - -fai (2.4) unstable; urgency=low - - - Era Erikson did some great work on proofreading all manuals and - script comments. Great work Era! - - lots of updates in the fai guide - - use the script fai-class for defining classes; scripts in class/ - must not have prefix S; the following command renames your - existing scripts so they will work with the new command: - rename 's/S(\d\d.+)(\.sh|\.pl)/$1/' S* - the order of scripts executed has slightly changed; all classes - from the file $HOSTNAME are defined after the scripts in class/ - are executed; the suffix .sh or .pl is not needed any more, - fai-class has a manual page - - kernel 2.4.20 is the default kernel during installation - - USB keyboard support during installation - - make-fai-bootfloppy creates a more generic boot floppy which - uses grub or lilo as boot loader, it supports more than one boot - protocol, more disk space is available on the floppy - - the exit status of every hook and script is written to - status.log - - the hook faiend.LAST parses all log files for warnings and - errors and writes them to error.log - - variable.sh lists all variables defined after task defvar has finished - - FAI_LOCATION is now defined in fai.conf, FAI_ACTION is defined - in LAST.var, do not use T170 and T171 via a BOOTP or DHCP server - (but it is still possible) - - hooks can make their tasks to be skipped (as in fai 2.2) - - templates scripts and config files has been rewritten and added - (eg. WWWKIOSK, a notebook with Windows and Linux) - - a new default location for the Debian mirror (in mkdebmirror and - fai.conf) - - much of reorganizing the code, but this does not change the user - visible behavior - - some functions that were defined as shell subroutines are now - separate scripts in /usr/lib/fai (fai-class, create_ramdisk, - prepare_apt, fai-divert, fai-savelog, task_sysinfo, ...), they - are not standalone script, most of them only work in the fai - environment, this should solve the problems with a too big - environment (when using xargs) - - PATH always starts with /usr/local/{sbin,bin} - - new FAI_FLAG syslogd starts log daemons (syslogd and klogd) only - on demand - - save log files to host $LOGSERVER if defined, otherwise use - $SERVER - - make-fai-nfsroot always does setup for dhcp and bootp, and uses - following sources to create the file sources.list for the - nfsroot: the variable $FAI_SOURCES_LIST or the files - /etc/fai/sources.list or /etc/apt/sources.list - - you can add a list of classes after the PACKAGE command in files - in package_config, so the following packages will only be - installed for this class (Please only use this in the file - package_config/DEFAULT) - - fcopy has new option -i and -B - - the variable addpackages can contain a list of packages without - their version number, therefore /fai/files/packages should be a - simple repository - - a lot of bug fixes - - -- Thomas Lange Thu, 13 Feb 2003 11:45:29 +0100 - -fai (2.3.4) unstable; urgency=low - - - the default name for fai kernel-image package has changed to - kernel-image-2.2.20_fai1_i386.deb, since the package fai-kernel - >=1.4 contains install kernels which support both the BOOTP and - DHCP protocol - - -- Thomas Lange Thu, 16 May 2002 14:42:00 +0200 - -fai (2.3.3) unstable; urgency=medium - - - important bug fix (wrong symlink for rcS_fai) - - copy id_dsa* and id_rsa* files in make-fai-nfsroot - - use strict enabled in perl scripts - - add "append ip=dhcp" in pxelinux.cfg/default - - minor changes in package_config files - - setup_harddisks default fs type changed from auto to ext2 - - -- Thomas Lange Thu, 16 May 2002 09:27:15 +0200 - -fai (2.3.2) unstable; urgency=low - - - minor bug fixes - - minor changes in package_config files - - use discover command for hardware detection and loading of scsi - kernel modules in class/S03hwdetect.source - - use swap partitions during installation if available - - -- Thomas Lange Mon, 29 Apr 2002 19:47:39 +0200 - -fai (2.3.1) unstable; urgency=low - - - some minor bug fixes - - add variable $addpackages to DEFAULT.var - - $FAI_SUBDIR renamed to $FAI_SHAREDIR (fai.conf) - - changes in package_config files - - additional method to determine all ethernet devices - - manual updates for woody - - added a lot of comments into shell script - - add option -m to make-fai-bootfloppy - - -- Thomas Lange Tue, 16 Apr 2002 13:30:04 +0200 - -fai (2.3) unstable; urgency=low - - - all default configurations are for Debian 3.0 aka woody - - /etc/fai.conf moved to /etc/fai/fai.conf - - moved some variables from fai.conf to class/*.var - - add FAI_DEBOOTSTRAP_OPTS to fai.conf - - temporary files are stored to $LOGDIR (default to /tmp/fai/), - can be set in fai.conf using mktemp if desired - - log files for every new run are stored in a separate directory, - last-$FAI_ACTION is pointing to the last log directory - - if a task is skipped, also all its hooks are skipped - - uname -s in uppercase is also a default class - - all class/S[0-9]*.source scripts are sourced - - hooks that end in .source are sourced (formerly .sh), so they - can define variables - - new adddivert routine; make a diversion for a file and add it to - the list of all diversions; you need not care about removing the - diversion; the finish task will do this for you - - class/*.mod files can now define variables - - new examples class/S30menu.source (was hook/install.MENU) - - /fai can be a different location using $FAI in fai.conf - - /fai can be retrieved from a CVS repository: (see variables - FAI_LOCATION, FAI_CVSROOT, FAI_CVSMODULE) and create a - /etc/fai/.cvspass - - /etc/apt/preferences will be copied to nfsroot - - additional manual pages for fai-setup, make-fai-nfsroot, - make-fai-bootfloppy, install_packages - - setup_harddisks: called with option -d (DOS alignment) - support for ext3 and disk controllers using /dev/ida/, /dev/rd/ - and /dev/cciss (Compaq SMART2 raid array and Mylex DAC960 PCI - RAID controller) - - make-fai-bootfloppy can write to a file, creates environment for - DHCP using pxelinux, does not copy System.map to floppy (now - more space left for the kernel image), new option -s - - bootpc and dhcp request will use only active network devices - ($netdevices_up determined by netdevice_info()) by default, - which can be overwritten with $netdevices - - add a hint how to set up the kernel automounter for scratch - partitions - - fcopy skips CVS directories, executes postinst script if file - was copied, new options -L and -P - - added prtnetgr script which prints a flat list of all hosts - belonging to a netgroup - - execute all /fai/scripts/$class/S[0-9]* scripts if this - directory exists, so it's possible to execute multiple scripts - for one class; see examples in scripts/NETWORK/ and scripts/DEFAULT/ - - use shm (was tmpfs) for ramdisk if available - - mkdebmirror uses passive ftp mode - - task sysinfo calls kudzu - - added THANKS file - - -- Thomas Lange Tue, 9 Apr 2002 18:29:15 +0200 - -fai (2.2.3) unstable; urgency=low - - - woody support improved, but the default configuration is still - for potato - - added disk configuration for Beowulf nodes - - Wake on LAN section added to FAI guide - - reiserfs support in setup_harddisks (thanks to Diane Trout) - - make-fai-nfsroot -v output can be redirected to a file - - sysinfo also uses detect and discover to probe for hardware - - utilities moved to /usr/share/fai/utils - - install_packages checks all package names. If a package name is - misspelled, it will be removed from the installation list - - added class NOGETTY - - package_config: new action "hold", PRELOAD can use a file: url - - -- Thomas Lange Thu, 8 Nov 2001 17:01:02 +0100 - -fai (2.2.2) unstable; urgency=low - - - bug fix: getting dhcp information - - added jmon to BEOWULF - - -- Thomas Lange Wed, 10 Oct 2001 10:52:35 +0200 - -fai (2.2.1) unstable; urgency=low - - - FAI_FLAGS can be space or comma separated. They must be space - separated in bootptab. Use a comma to separate them as - additional kernel parameters. - - bootp requests on multiple ethernet devices show device name - (Thanks to Geert Stappers) - - script all_hosts doesn't use hardcoded list of hosts any more; - now it uses the netgroup allhosts - - -- Thomas Lange Fri, 5 Oct 2001 17:19:14 +0200 - -fai (2.2) unstable; urgency=low - - - the fai guide has a new chapter about building a Beowulf cluster - - new utilities for Beowulf cluster: all_hosts and rshall - - new utility softupdate for updating packages on a running system - - improved example for diskless hook - - major reorganization of the rcS_fai code; most parts are moved - to the subroutines file - - source /fai/hooks/subroutines if file exists; here you can define - your own subroutines or redefine FAIs subroutines - - most tasks are now executed via task() and the name of the task - as option. This subroutine looks for a hook with the given name - and executes it. Hooks can skip the default task of FAI (called - task_) by using skiptask(). So, hooks can replace the - default behavior, and not only add functions to the - installation process - - hooks can define classes by writing class names to - /tmp/additional-classes and variable by writing line to - /tmp/additional.var - - new hooks/tasks added - - classes and variables are now defined in the very beginning - before task_action is called and $FAI_ACTION is evaluated - - FAI_ACTION can be any user defined value. FAI is looking for a - command in /fai/hooks/$FAI_ACTION and executes it. - - log file prepare-apt.log renamed to updatebase.log - - debian-non-US in local mirror script (mkdebmirror) has new location - - new type "PACKAGE taskinst" in package_config can install new - task packages (for Debian 3.0 and later releases) - - get_bootp_inf() and get_dhcp_info() support multiple ethernet - devices via $netdevices - - $netdevices can be set or automaticly determined to the list of - ethernet devices - - make-fai-bootfloppy: handle symlinks of lilo 21.5 and newer - - tlink can show symlink of a host or all file in /boot/fai - - new classes NOSECURETTY, BEOWULF, NOTCPD - - -- Thomas Lange Fri, 14 Sep 2001 14:35:49 +0200 - -fai (2.1) unstable; urgency=low - - - NEWS file added (you found it already ;-), which contains the - user visible changes; changelog file is for developers - - woody support - - define $FAI_DEBOOTSTRAP for using debootstrap - - you can add your own functions using hooks (read the manual) - - /fai/fai_config not used anymore, replaced by a hook - - setup_harddisk does not complain when root partition is not in - the first 8GB, do not complain if not a primary partition - - no more problems when using other locales - - support for diskless clients - - grub support, new class LILO and GRUB - - new flag createvt; add this to FAI_FLAGS to get two additional - terminals and ctrl-c will interrupt the installation - process. Otherwise ctrl-c will reboot and no terminals are - available. In the past, this function was enabled by default. - Add createvt to FAI_FLAGS to get the old behavior. - - before any classes are defined using the scripts in /fai/class, - the classes DEFAULT, $HOSTNAME and LAST are defined - - new utility chkdebnames can check package names for a certain - distribution - - -- Thomas Lange Fri, 20 Jul 2001 11:55:29 +0200 diff -Nru fai-5.3.6ubuntu1/debian/rules fai-5.9.4ubuntu1/debian/rules --- fai-5.3.6ubuntu1/debian/rules 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/debian/rules 2020-04-27 02:48:19.000000000 +0000 @@ -1,64 +1,16 @@ #!/usr/bin/make -f -DESTDIR=`pwd`/debian/tmp -DOCDIR=`pwd`/debian/fai-doc/usr/share/doc/fai-doc +-include VERSION -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 +%: + dh $@ -include VERSION - -build: build-arch build-indep -build-arch: build-stamp -build-indep: build-stamp -build-stamp: - dh_testdir - -# Add here commands to compile the package. - $(MAKE) all - - touch build-stamp - -clean: - dh_testdir -# dh_testroot -# Add here commands to clean up after the build process. - $(MAKE) clean - dh_clean - -install: build - dh_testdir - dh_testroot - dh_prep - dh_installdirs -# Add here commands to install the package into debian/fai. - $(MAKE) install - -# Build architecture-independent files here. -binary-indep: build install - dh_testdir - dh_testroot -# dh_installdebconf +override_dh_installdocs: dh_installdocs -Nfai-server -Nfai-quickstart -# dh_installexamples -# dh_installmenu - dh_installman - dh_install --sourcedir=debian/tmp -# dh_installinfo - dh_link - dh_installchangelogs - dh_compress -Xexamples -X.pdf - dh_fixperms -X nfsroot.conf - perl -pi -e 's/FAIVERSIONSTRING/$(VERSIONSTRING)/' $(shell pwd)/debian/fai-client/usr/share/doc/fai-client/README - dh_lintian -# You may want to make some executables suid here. - dh_installdeb - dh_gencontrol - dh_md5sums - dh_builddeb + sed -i 's/FAIVERSIONSTRING/$(VERSIONSTRING)/' debian/fai-client/usr/share/doc/fai-client/README -# Build architecture-dependent files here. -binary-arch: build install +override_dh_installchangelogs: + dh_installchangelogs -Nfai-server -Nfai-quickstart -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install +override_dh_compress: + dh_compress -Xexamples -X.pdf diff -Nru fai-5.3.6ubuntu1/dev-utils/fai-kvm fai-5.9.4ubuntu1/dev-utils/fai-kvm --- fai-5.3.6ubuntu1/dev-utils/fai-kvm 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/dev-utils/fai-kvm 2020-04-27 02:48:19.000000000 +0000 @@ -2,14 +2,12 @@ # fai-kvm, start kvm host for testing FAI software # -# Author: Thomas Lange, Uni Koeln, 2011-2015 +# Author: Thomas Lange, Uni Koeln, 2011-2020 # License: GPL v2 or any later version -fix="-k en-us -cpu host -global isa-fdc.driveA= " # if loading cirrusfb (via pcimodules and modprobe cirrusfb) causes errors in kvm +fix="-k en-us -smp 2 -cpu host -global isa-fdc.driveA= " # if loading cirrusfb (via pcimodules and modprobe cirrusfb) causes errors in kvm # without it centos initrd is not created properly and results in kernel panic -# for booting form CD first, then hard disk: -boot order=dc - vga="-vga std" user=1 size=10 # default size of the disk image @@ -19,29 +17,36 @@ diskdir=/tmp # directory where the disk images will be created, a RAM disk is recommended usernet=0 newdisk=0 +daemonize=0 +efi=0 macprefix=52:54:00:11:23 # - - - - - - - - - - - - - - - - - - - - - - - - - boot_disk() { # boot from disk [ -n "$1" ] && disk=$1 + shift + case "$disk" in + *.raw) f=",format=raw" ;; + esac set -x - kvm $gopt -boot order=c $net $disk + kvm $gopt -boot order=c $net -drive file=$disk,if=virtio$f $* } # - - - - - - - - - - - - - - - - - - - - - - - - - boot_pxe() { # PXE boot set -x - kvm $gopt -boot order=nc $net $disk + kvm $gopt -boot order=nc $net $disk $* } # - - - - - - - - - - - - - - - - - - - - - - - - - boot_cd() { [ -n "$1" ] && cdimage=$1 + shift # boot fai-cd set -x - kvm $gopt -boot order=dc $net $disk -cdrom $cdimage + kvm $gopt -boot order=cd $net $disk -cdrom $cdimage $* } # - - - - - - - - - - - - - - - - - - - - - - - - - die() { @@ -54,30 +59,39 @@ cat < size of the local disk in GB (default is ${size}GB) -d number of local disks (default is 1) -D directory, where the disk image files are created (default: $diskdir) - -m RAM size inMB (defaults is ${ram}MB) + -m RAM size in MB (defaults is ${ram}MB) -u user number. This will become part of the MAC address of the interface of the VM and is the number of the tap device number. It is also used for the file name of the disk files. Each VM must have a unique number. If you have created 9 tap devies you can use the numbers 1 to 9. -V do not use vga std with Bochs extensions, use the kvm default -U Use kvm user networking instead of tap devices - -t Set title of the Qemu windows + -t Set title of the Qemu window + +You can add more options for kvm after -- +The MAC prefix is set inside the script to $macprefix:XX EOF exit 0 } # - - - - - - - - - - - - - - - - - - - - - - - - - -while getopts "UhnNu:s:m:d:VD:t:" opt ; do +while getopts "EbUhnNu:s:m:d:VD:t:" opt ; do case "$opt" in + b) daemonize=1 ;; + E) efi=1 ;; n) newdisk=1 ;; N) newdisk=2 ;; U) usernet=1 ;; @@ -101,9 +115,16 @@ fi : ${title:=FAI-kvm-$user} -hex=$(echo $user 16o p | dc) +if ! [[ $user =~ ^[0-9]+$ ]] ; then + die 2 "Error: Option -u needs a number" +fi +hex=$(printf %X $user) diskfile=$diskdir/faitest-disk-$user +if [ $daemonize -eq 1 ]; then + vga="-display none -daemonize -vnc :$user" +fi + # not all mac addresses work in kvm (or the bridge), be carefull when changing the first two bytes # If you are generating your own MAC addresses you should use a value that contains 2,6,A or E as the second number as this defines a locally administered MAC address. # x2:xx:xx:xx:xx:xx @@ -114,7 +135,7 @@ mac=$macprefix:$hex if [ $usernet = 1 ]; then - net="" + net="-net nic,name=eth0,model=virtio -net user,name=eth0" else net="-net nic,macaddr=$mac,model=virtio -net tap,ifname=tap$user,script=no,downscript=no" fi @@ -127,7 +148,13 @@ disk="$disk" fi done -gopt="$fix $vga -m $ram -smp 2 -name $title" +gopt="$fix $vga -m $ram -name $title" +if [ $efi = 1 ]; then + if [ ! -f /usr/share/ovmf/OVMF.fd ]; then + die 99 "UEFI firmware not found. Please install package ovmf." + fi + gopt="-bios /usr/share/ovmf/OVMF.fd $gopt" +fi # create new disk images @@ -142,12 +169,33 @@ done fi -case "$1" in - pxe) boot_pxe ;; - cd) boot_cd $2 ;; - disk) boot_disk $2 ;; +# Loop through parameters until '--' to pass the remainder to kvm. +# The preceding parameters are stored in $param1 & $param2 +# param1 = cd|pxe|pxe ; param2 = diskimage | imagename +param1="" +param2="" +while [[ $# -gt 0 ]]; do + if [ "$1" = "--" ]; then + shift + break + fi + param1="$param2" + param2="$1" + shift +done + +# if we only have one parameter before '--' +if [ -z "$param1" ]; then + param1="$param2" + param2="" +fi + +case "$param1" in + pxe) boot_pxe $* ;; + cd) boot_cd $param2 $* ;; + disk) boot_disk $param2 $* ;; *) - echo "Missing argument." >&2 + echo "Wrong argument. Use one of pxe, cd, disk." >&2 usage ;; esac diff -Nru fai-5.3.6ubuntu1/dev-utils/fai-mk-network fai-5.9.4ubuntu1/dev-utils/fai-mk-network --- fai-5.3.6ubuntu1/dev-utils/fai-mk-network 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/dev-utils/fai-mk-network 2020-04-27 02:48:19.000000000 +0000 @@ -15,25 +15,28 @@ tapnum=9 # how many tap devies will be created brip=192.168.33.1 # IP of bridge device brname=br0 -netdev=eth0 # network device used for routing to the outside internet + +# default network device used for routing to the outside internet +netdev=$(ip route | awk '/^default/ {print $5}'|head -1) usage() { cat < Use NIC instead of default network device DESCRIPTION fai-mk-network creates $tapnum tap devices which are added to a software bridge. The tap devices will belong to the user specified. This bridge will be on a private subnet ($brip/24) unless -P is specified. Also a NATing is enabled for -the private subnet. Using -P the bridge will use the network of $netdev instead +the private subnet. Using -P the bridge will use the network of $netdev (or -i) instead of a private subnet. Do not call this command in a network mounted directory when using -P. You can configure different settings by modifying some variables in the script itself. @@ -124,12 +127,13 @@ remove=0 private=1 # private network by default -while getopts Phr opt ; do +while getopts Phri: opt ; do case "$opt" in r) remove=1;; P) private=0 ;; h) usage ;; - esac + i) netdev=$OPTARG ;; + esac done shift $(($OPTIND - 1)) @@ -139,7 +143,7 @@ usage fi -if [ ! -x "$(which brctl)" ]; then +if ! command -v brctl >&/dev/null; then echo "brctl not found. Please install bridge-utils." exit 3 fi diff -Nru fai-5.3.6ubuntu1/doc/fai-guide.txt fai-5.9.4ubuntu1/doc/fai-guide.txt --- fai-5.3.6ubuntu1/doc/fai-guide.txt 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/doc/fai-guide.txt 2020-04-27 02:48:17.000000000 +0000 @@ -5,11 +5,11 @@ FAI Guide (Fully Automatic Installation) ======================================== Thomas Lange -Mon, 16 Jan 2017 +Wed, 18 Sep 2019 :Date: a date -:Revision: 5.3 +:Revision: 5.8 -:nfsrootsize: 690 +:nfsrootsize: 780 :mirrorsize: 56 //// @@ -20,7 +20,7 @@ => _ //// - +French version of this guide is available at http://fai-project.org/fai-guide-fr. Abstract -------- @@ -35,11 +35,11 @@ ---- +-----------------------------------------------------------------------+ - | This manual describes FAI 5.3 but most things are also valid for 4.x. | + | This manual describes FAI 5.5 but most things are also valid for 4.x. | +-----------------------------------------------------------------------+ ---- -(c) 2000-2017 Thomas Lange +(c) 2000-2019 Thomas Lange .Copyright @@ -55,7 +55,7 @@ A copy of the GNU General Public License is available as '/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution -or on the World Wide Web at http://www.gnu.org/copyleft/gpl.html[the +or on the World Wide Web at https://www.gnu.org/copyleft/gpl.html[the GNU website] You can also obtain it by writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA @@ -71,19 +71,19 @@ Homepage:: -http://fai-project.org +https://fai-project.org FAI wiki:: -http://wiki.fai-project.org +https://wiki.fai-project.org Download:: -http://fai-project.org/download +https://fai-project.org/download Entry for 'sources.list':: -`deb http://fai-project.org/download jessie koeln` +`deb https://fai-project.org/download buster koeln` Manual pages:: -http://fai-project.org/doc/man/ +https://fai-project.org/doc/man/ Mailing list:: https://lists.uni-koeln.de/mailman/listinfo/linux-fai @@ -93,15 +93,15 @@ to the mailing list. Bugs:: -Use the Debian bug tracking system (BTS) http://bugs.debian.org +Use the Debian bug tracking system (BTS) https://bugs.debian.org User visible changes:: -http://fai-project.org/NEWS +https://fai-project.org/NEWS Source tree via git:: git clone git://github.com/faiproject/fai.git -View source tree via http:: +View source tree via https:: https://github.com/faiproject/fai @@ -147,7 +147,7 @@ damaged hard disk had been replaced. It took two weeks until I received the new hard disk but only a few minutes after the new disk was installed, the workstation was running as before. And this is why -I chose to adapt this technique to a PC cluster running Linux. +I choose to adapt this technique to a PC cluster running Linux. @@ -187,23 +187,24 @@ * Very quick unattended installation. * Flexible system through easy class concept. * Update of running systems without re-installation. -* Easy creation of a virtualization environment or a chroot +* Cloud images for virtualization environment. * Hosts can boot from network card, CD, USB stick. * Simple creation of an installation CD or USB stick. * PXE with DHCP boot method is supported. * ReiserFS, ext3/ext4, btrfs and XFS file system support. * Software RAID and LVM support. * Automatic hardware detection. -* You can deploy Debian, Ubuntu, CentOS, SuSE, Scientific Linux +* You can deploy Debian, Ubuntu, CentOS, SuSE, Scientific Linux. * Remote login via ssh during installation process possible. * All similar configurations are shared among all install clients. * Log files for all installations are saved to the installation server. * Shell, Perl, Python, Ruby, expect and CFEngine scripts are supported during the customization step. -* Support for many protocols like NFS, FTP, HTTP, git +* Support for many protocols like NFS, FTP, HTTPS, git. * Can be used as a rescue system and for hardware inventory. * Diskless client support. +* Cross-architecture support e.g. for embedded devices. * Easily add your own functions via hooks or change the default behavior. -* Cloning machines using disk images is supported +* Cloning machines using disk images is supported. === Installation times @@ -230,38 +231,41 @@ Without further ado, this section will provide a quick and easy demonstration of a fully automatic installation using the FAI CD and a virtual machine. -Just download the CD ISO image from http://fai-project.org/fai-cd and boot +Just download the CD ISO image from https://fai-project.org/fai-cd and boot your VM using this CD. You will see a grub menu where you can select from different installation types. This installation will run without an install server. The CD installation is the same as when run in a network environment using -the FAI install server. - -=== [[cdserver]]My first server installation - +the FAI install server and can also be used from USB stick on a real +computer. -Please note, if you intend to use QEMU/KVM then you need to have -qemu-kvm qemu-utils bridge-utils installed on the machine to -use fai-mk-network and fai-kvm footnote:[fai-kvm needs a lot of ram -for the vm, because of caching of /var, 2GB are OK]. +You can also create yourself a custom fully automated installation +image on the webpage https://fai-project.org/FAIme without the need of +installing FAI on your computer. -You can do that via +=== [[cdserver]]My first server installation ----- -# apt-get install qemu-kvm qemu-utils bridge-utils ----- +We will create a private network and start two virtual machines. One +will become your own FAI server, the other will be an install client. If you intend to use VMware or VirtualBox, ensure that your client -uses a bridged network connection. Also, It is not possible to use +uses a bridged network connection. A detailed description is in the +FAI wiki +footnote:[https://wiki.fai-project.org/index.php/VirtualBox_for_your_first_FAI_installation]. Also, +it is not possible to use bridged network interfaces over wireless, as most WiFi network cards do not support this feature. -For setting up your first own FAI server, we recommend creating a -test network on your computer and to use KVM. For creating this -private network there's the script `fai-mk-network` (in the package -fai-server). It sets up a software bridge with several tap devices +When using Qemu/KVM and the `fai-kvm` wrapper you can create the +network using the command `fai-mk-network`. First install some packages + +---- +# apt-get install qemu-system-gui qemu-kvm qemu-utils bridge-utils +---- + +The next command sets up a private network with a software bridge with several tap devices that belong to the user ++. ---- fai-mk-network @@ -269,7 +273,7 @@ After that, you can use fai-kvm (-h will give you some help) for starting virtual machines using KVM that are connected to this private -network. Be carefull. By default, fai-kvm will create the disk images +network. Be careful. By default, fai-kvm will create the disk images for the virtual machines in +/tmp+, which is a RAM disk on most systems. It's no problem to create an empty 20G disk image in /tmp (even if this partition is of 4GB size), but while the VM is writing @@ -279,10 +283,10 @@ footnote:[This installation will consume about 2GB of space in +/tmp+.]: ---- -fai-kvm -Vn -s20 -u 1 cd fai-cd.iso +fai-kvm -Vn -s20 -u 1 cd faicd64-small.iso ---- -In the grub menu select +faiserver, fixed IP+. This will install a host called +In the grub menu select +faiserver, using internal DHCP and a fixed IP+. This will install a host called faiserver with IP 192.168.33.250 which contains all software needed for a FAI server. It will also set up a local package cache (using apt-cacher-ng). Once the installation is finished, reboot the @@ -368,7 +372,9 @@ + The package _fai-doc_ includes a sample configuration space including examples for hosts using the XFCE and GNOME environment amongst other -examples. +examples. Calling `fai-mk-configspace` copies these examples to +'/srv/fai/config'. It's recommended to study those config files and +scripts for easier understanding how FAI works. nfsroot, NFS-Root:: @@ -518,8 +524,8 @@ * Install the package 'fai-quickstart' on your install server. ---- -# wget -O - http://fai-project.org/download/074BCDE4.asc | apt-key add - -# echo "deb http://fai-project.org/download jessie koeln" > /etc/apt/sources.list.d/fai.list +# wget -O - https://fai-project.org/download/2BF8D9FE074BCDE4.asc | apt-key add - +# echo "deb http://fai-project.org/download buster koeln" > /etc/apt/sources.list.d/fai.list # apt-get update # aptitude install fai-quickstart ---- @@ -536,7 +542,7 @@ # sed -i -e 's/#LOGUSER/LOGUSER/' /etc/fai/fai.conf ---- -* By default, FAI uses http://httpredir.debian.org as package +* By default, FAI uses http://deb.debian.org as package mirror, which should attempt to find a fast package repository for you. footnote:[If you want to use a faster mirror, adjust the URL in _/etc/fai/apt/sources.list_ and +FAI_DEBOOTSTRAP+ in _/etc/fai/nfsroot.conf_ before calling fai-setup.] Now, we can run `fai-setup(8)` footnote:[This will call `fai-make-nfsroot(8)` internally.] @@ -550,7 +556,7 @@ * These are some of the lines you will see at the end of _fai-setup_. A complete example of 'fai-setup.log' is available on - the FAI web page at http://fai-project.org/logs/fai-setup.log. + the FAI web page at https://fai-project.org/logs/fai-setup.log. ---- FAI packages and related packages inside the nfsroot: @@ -667,7 +673,7 @@ restart the daemon. ---- -# /etc/init.d/isc-dhcp-server restart +# invoke-rc.d isc-dhcp-server restart ---- If you have multiple network interfaces, you @@ -709,7 +715,7 @@ ==== NFS -The command `fai-setup` has already set up the NFS daemon add added +The command `fai-setup` has already set up the NFS daemon and added some lines to the configuration file _/etc/exports_. It exports the directories using NFS v3. @@ -725,10 +731,10 @@ ---- $ fai-chboot -IFv -u nfs://faiserver/srv/fai/config demohost -Booting kernel vmlinuz-3.16.0-4-amd64 - append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp - FAI_FLAGS=verbose,sshd,createvt - FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config + +Booting kernel vmlinuz-4.19.0-5-amd64 + append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp + FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config demohost has 192.168.33.100 in hex C0A82164 Writing file /srv/tftp/fai/pxelinux.cfg/C0A82164 for demohost @@ -773,7 +779,7 @@ it. Installation and administration is a process, not a product. FAI can't do things you don't tell it to do. -But you need not start from scratch. Look at the files and scripts in +You don't need to start from scratch. Look at the files and scripts in the configuration space. There are a lot of things you can use for your own installation. A good paper called "Bootstrapping an Infrastructure" with more aspects of building an infrastructure is @@ -807,14 +813,14 @@ _extrbase_. Use this if you want to install another distribution or version than that running during the installation. + -This basefile can also be received based on FAI classes via HTTP or FTP -by defining the variable FAI_BASEFILEURL. FAI will download a file +This basefile can also be received based on FAI classes via HTTP/HTTPS or FTP +by defining the variable +FAI_BASEFILEURL+. FAI will download a file CLASSNAME.tar.xz (or tgz, or tar.gz,...) from this URL, if CLASSNAME matches a FAI class. + Example: ---- -FAI_BASEFILEURL=http://fai-project.org/download/basefiles +FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ ---- The folder must support directory listing. FAI will not probe for potentially matching files. @@ -822,7 +828,7 @@ _debconf/_:: This directory holds all `debconf(7)` data. The format is the same -that is used by `debconf-set-selections(8)`. +that is used by `debconf-set-selections(1)`. _package_config/_:: Files with class names contain lists of software packages to be @@ -846,7 +852,7 @@ _hooks/_:: Hooks are user defined programs or scripts, which are called during -the installation process. The can extend or replace the default tasks. +the installation process. They can extend or replace the default tasks. The file name must be of format 'taskname.CLASSNAME[.sh]'. A hook called +updatebase.DEBIAN+ is executed prior to the task `updatebase` and only if the install client belongs to the class DEBIAN. @@ -857,11 +863,11 @@ There are different possibilities to define classes: . Some default classes are defined for every host: DEFAULT, LAST and its host name. -. Classes may be listed within a file. +. Classes may be listed within a file (by default in 'class/') . Classes may be dynamically defined by scripts. The last option is a very nice feature, since these scripts will -define classes is a very flexible way. For example, several classes +define classes in a very flexible way. For example, several classes may be defined only if certain hardware is identified or a class is defined depending on the network subnet information. @@ -905,8 +911,8 @@ The task _defvar_ defines the variables for the install client. Variables are defined by scripts in _class/*.var_. All global -variables can be set in 'DEFAULT.var'. For certain groups of hosts use -a class file or for a single host use the file +$HOSTNAME+ _.var_. Also +variables can be set in 'DEFAULT.var'. For groups of hosts use +a class file. For a single host use the file +$HOSTNAME+ _.var_. Also here, it's useful to study all the examples. The following variables are used in the examples and may also be @@ -926,7 +932,7 @@ KEYMAP:: Defines the keyboard map files in '/usr/share/keymaps' and -'$FAI/files'. You need not specify the full path, since this file +'$FAI/files'. You don't need to specify the full path, since this file will be located automatically. ROOTPW:: @@ -935,7 +941,7 @@ `mkpasswd(1)` for creating the hash for a certain password. For example, to generate a md5 hash for the password use ---- -$ echo "yoursecrectpassword" | mkpasswd -Hmd5 -s +$ echo "yoursecrectpassword" | mkpasswd -m md5 -s ---- @@ -946,7 +952,7 @@ TIMEZONE:: Is the file relative to '/usr/share/zoneinfo/' which indicates your time zone. E.g.: _TIMEZONE=Europe/Berlin_. -_ + MODULESLIST:: A list of kernel modules which are loaded during boot of the new system (written to @@ -957,7 +963,7 @@ The tool `setup-storage(8)` reads a file in '$FAI/disk_config' for the disk configuration. This file describes how -all the local disks will be partitioned, which file systems types should be +all the local disks will be partitioned, which file system types should be created (like ext3/4, xfs, btrfs), and where they are mounted to. You can also create software RAID and LVM setups using this config file. It's also possible to preserve the disk layout or to @@ -966,15 +972,24 @@ During the installation process all local file systems are mounted relative to '/target'. For example if you specify the mount point '/home' in a disk configuration file this will be the directory -'/target/home' during the installation process und will become '/home' +'/target/home' during the installation process and will become '/home' for the new installed system. === [[extrbase]]Extract base file +A base file is only needed when installing a distribution which is +different from the one in the nfsroot. + === [[debconf]]Debconf preseeding +You can use the format described in `debconf-set-selections(1)`. + === [[repository]]Access to the package repository +FAI supports http, https and NFS for accessing the package mirror. Set +the variable '$FAI_DEBMIRROR' for using NFS. + + === [[packageconfig]]Software package configuration Before installing packages, FAI will add the content of all files @@ -1060,14 +1075,14 @@ _dpkg --get-selections_. It's not recommended to use this format, since you are also specifying all packages which are only installed because of a dependency or a recommends. It's better just to specify -the pacakge you like to have, and to let FAI (and apt-get) resolv the +the pacakge you like to have, and to let FAI (and apt-get) resolve the dependencies. Multiple lines with lists of space separated names of packages follow the PACKAGES lines. All dependencies are resolved. Packages with suffix _-_ (eg. _lilo-_) will be removed instead of installed. The -order of the packages is of no matter. If you like to install +order of the packages doesn't matter. If you like to install packages from another release than the default, you can append the release name to the package name like in _openoffice.org/etch-backports_. You can also specify a certain @@ -1083,21 +1098,45 @@ the file shouldn't be removed, use the command _PRELOAD_ instead. It's possible to append a list of class names after the command for -apt-get. So this _PACKAGE_ command will only be executed when the -corresponding class is defined. So you can combine many small files +apt-get. So this _PACKAGES_ command will only be executed when at least +one of the corresponding classes is defined (logical OR). So you can +combine many small files into the file DEFAULT. WARNING! Use this feature only in the file DEFAULT to keep everything simple. See this file for some examples. If you want to remove a package name from a certain class was part of this class before, you should not remove the package name from the class file, but instead append a dash (-) to it. This will make sure -that the package is remove during a softupdate on hosts which were +that the package is removed during a softupdate on hosts which were installed using the old class definition which included this package name. If you specify a package that does not exist this package will be removed automatically from the installation list only if the command _install_ is used. +The concept of classes priority allows a higher priority class (one +that comes later in the sequence of classes) to override the selection +of packages of a lower priority class. For this to work correctly, +the higher priority class must use the same _PACKAGES_ command (e.g. +_PACKAGES install-norec_ instead of just _PACKAGES install_) as the one +used by the class it is trying to override. This is useful to suppress +installation of a package, for example, to avoid installing the 'linuxlogo' +package installed by class FAIBASE: + +---- +# example of how to override: +# +# On FAIBASE we have: +# PACKAGES install-norec +# linuxlogo +# +# We want to _not_ install linuxlogo, and it is in a +# install-norec section, so we must also use install-norec. + +PACKAGES install-norec +linuxlogo- +---- + === [[cscripts]] Customization scripts The command `fai-do-scripts(1)` is called to execute all scripts in @@ -1147,7 +1186,7 @@ cfengine script will abort. More information can be found in the manual page `cfengine(8)` or at -the cfengine homepage http://www.cfengine.org. +the cfengine homepage https://www.cfengine.com. === [[hooks]]Hooks @@ -1167,8 +1206,7 @@ The directory '$FAI/hooks/' contains all hooks. A hook is an executable file following the naming scheme 'taskname.CLASSNAME[.sh]' (e.g. -'repository.CENTOS' or 'savelog.LAST.sh), a task name and a -class name separated by a dot, optionally followed by '.sh'. The +'repository.CENTOS' or 'savelog.LAST.sh). The task name specifies which task to precede executing this hook, if the specified class is defined for the installing client. See section <> for a complete list of default tasks that can be used. @@ -1176,7 +1214,7 @@ A hook of the form _hookprefix.classname_ can't define variables for the installation script, because it's a subprocess. But you can use any binary executable or any script you wrote. Hooks that have the -suffix _.sh_ (e.g. 'partition.DEFAULT.sh) must be Bourne +suffix _.sh_ (e.g. 'partition.DEFAULT.sh') must be Bourne shell scripts and are sourced. So it's possible to redefine variables for the installation scripts. @@ -1218,7 +1256,8 @@ === [[faiflags]]FAI flags The variable +$FAI_FLAGS+ contains a space separated list of -flags. The following flags are known: +flags. Flags are normally defined in the pxelinux.cfg file which +should be created by 'fai-chboot(1)'. The following flags are known: verbose:: Create verbose output during installation. This should always be the @@ -1278,8 +1317,6 @@ are preserved unless this flag is set. Often, this flag is set in a file 'class/*.var' by using setting 'flag_initial=1'. - - == [[install]] FAI installs your plan === The early part of an installation @@ -1300,7 +1337,7 @@ === [[bootmesg]]Boot messages -When booting the install client from network card with PXE you will some +When booting the install client from network card with PXE you will see some messages like this: include::includes/bootexample.txt[] @@ -1346,7 +1383,7 @@ After the install client has booted only the script '/usr/sbin/fai' is executed. It will do some minimal initialization. The variable -+$FAI_CONFIG_SRC+ footnote:[It it defined on the kernel command line] ++$FAI_CONFIG_SRC+ footnote:[It is defined on the kernel command line] is used to get access to the FAI configuration space which is then available in the directory +$FAI+ footnote:[/var/lib/fai/config]. FAI will not proceed without the config space. @@ -1372,13 +1409,14 @@ The partitioning tool `setup-storage(8)` performs all commands necessary for creating the disk partition layout, software RAID, LVM -and for creating the file systems. Read the manual page of +and for creating the file systems. Disks and partitions may easily be +referenced by disk1.1, disk2.4 etc. Read the manual page of `setup-storage(8)` for a detailed description and some examples of the format. === [[ipreseed]]Debconf preseeding (task debconf) -Files in '$FAI/debconf' are used for the usual `debconf(7)` presseding +Files in '$FAI/debconf' are used for the usual `debconf(7)` preseeding if the file names match a class name. === [[ipackages]]Installing software packages (task instsoft) @@ -1404,7 +1442,7 @@ The default set of scripts in '$FAI/scripts' include examples for installing Debian and CentOS machines. They set the root password, add -a demo user account, set the timezone, configure the network for DHCP +a user account (set by '$username, default to demo), set the timezone, configure the network for DHCP or using a fixed IP address, setup grub and more. They should do a reasonable job for your installation. You can edit them or add new scripts to match your local needs. @@ -1428,7 +1466,7 @@ Additionally, two symlinks will be created to indicated the last directory written to. The symlink 'last' points to the log directory of the last FAI action performed. The symlinks 'last-install' and -'last-sysinfo' point to the directory with of the last corresponding +'last-sysinfo' point to the directory of the last corresponding action. By default log files will be copied to the log server using scp. You can use the variable +$FAI_LOGPROTO+ in file 'fai.conf(5)' to choose another method for saving logs to the remote @@ -1444,7 +1482,7 @@ drwxr-xr-x 2 fai fai 4096 Dec 4 13:22 install-20141204_131351 ---- -Examples of the log files can be found at http://fai-project.org/logs. +Examples of the log files can be found at https://fai-project.org/logs. === [[ireboot]]Reboot the new installed system @@ -1561,8 +1599,8 @@ default fai-generated label fai-generated -kernel vmlinuz-3.16.0-4-amd64 -append initrd=initrd.img-3.16.0-4-amd64 ip=dhcp root=/srv/fai/nfsroot aufs FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install +kernel vmlinuz-4.19.0-5-amd64 +append initrd=initrd.img-4.19.0-5-amd64 ip=dhcp root=/srv/fai/nfsroot:vers=3 rootovl FAI_FLAGS=verbose,sshd,createvt FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install ---- See '/usr/share/doc/syslinux/pxelinux.doc' for more detailed @@ -1584,7 +1622,7 @@ before calling 'fai-setup' or 'fai-make-nfsroot'. FAI_DEBOOTSTRAP:: -Building the nfsroot uses the command debootstrap(8)`. It needs the location of a Debian mirror and the +Building the nfsroot uses the command `debootstrap(8)`. It needs the location of a Debian mirror and the name of the distribution (wheezy, jessie, stretch, sid) for which the basic Debian system should be built. Do not use different distributions here and in '/etc/fai/apt/sources.list'. This will create a broken nfsroot. @@ -1635,11 +1673,17 @@ You can easily create an installation CD (or USB stick) of your network installation setup. This will perform the same installation and configuration from CD without the need of the install server. -Therefore you need to create a partitial mirror of all Debian packages +Therefore you need to create a partial mirror of all Debian packages needed for your FAI classes (using `fai-mirror(1)`). Then the command `fai-cd(8)` will put this mirror, the nfsroot and the config space onto a bootable CD. That's it! +To easily create the installation CD, you can use the following command +(for more tuning details see `fai-cd(8)`): + +---- + faiserver# fai-cd -m fai-cd.iso +---- This installation CD contains all data needed for the installation. The command `fai-cd(8)` puts the nfsroot, the @@ -1647,7 +1691,7 @@ CD-ROM. A partial package mirror is created using the command `fai-mirror(1)` which contains all packages that are used by the classes used in your configuration space. A sample ISO image is -available at http://fai-project.org/fai-cd. +available at https://fai-project.org/fai-cd. Using the command `dd(1)` you can also create a bootable USB stick by just writing the content of the ISO file to your USB stick @@ -1662,41 +1706,71 @@ === [[diskimage]]Creating VM disk images using FAI -Using the command `fai-diskimage(8)` you can create Linux machine disk +The command `fai-diskimage(8)` creates disk images, which can be used with a virtual machine like KVM, VMware, VirtualBox or a cloud service like OpenStack, GCE, EC2 and others. The installation process performs the normal FAI tasks on a raw disk image. After the installation you can boot the disk image and have a running system. The disk image can also be converted to qcow2 format. +You do not need to setup the FAI nfsroot when only using +fai-diskimage. But you need a basefile in your configuration +space. Setting the variable +$FAI_BASEFILEURL+ will automatically +download an appropriate base file into your config space. + +Here's an example how to create a raw disk image for a host called +cloud3, with a small set of software packages: ---- - faiserver# export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ - faiserver# fai-diskimage -u cloud3 -S 2G -cDEBIAN,JESSIE64,AMD64,FAIBASE,GRUB_PC,CLOUD,GCE disk.raw +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu cloud3 -S2G -cDEBIAN,BUSTER64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST disk.raw ---- -Creates the file disk.raw for a host called cloud3, with a small set -of software packages. +This command will create a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop +with hostname set to foobar. ---- - # export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ - # cl=DEFAULT,DHCPC,DEBIAN,AMD64,FAIBASE,GRUB_PC,UBUNTU,XENIAL,XENIAL64,XORG - # fai-diskimage -v -u foobar -S5G -c$cl ubuntu.qcow2 +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# cl=DHCPC,UBUNTU,XENIAL,XENIAL64,AMD64,XORG,LAST +# fai-diskimage -Nvu foobar -S5G -c$cl ubuntu.qcow2 ---- -Creates a disk image called ubuntu.qcow2 for a Ubuntu 16.04 desktop -with hostname set to foobar. +You can give disk images a try without installing FAI, if you visit +https://fai-project.org/FAIme/cloud -You do not neet to setup the nfsroot when only using -fai-diskimage. But you need a basefile in your configuration -space. You can download a Debian base image from -http://fai-project.org/download/basefile and copy this into your -config space. If you already have set up the nfsroot you can copy the -Debian basefile from the nfsroot into your config space by using this -command: + +=== [[cross-arch]]Building cross-architecture disk images + +Starting FAI 5.4 it's now possible to build a disk image for +different architectures than the host is running. For example you can +build an image for 64-bit ARM architecture (aarch64) on a host running on amd64 +architecture. Here are the steps do to: + +---- +# apt install qemu-system-arm qemu-user-static fai-server fai-setup-storage fai-doc qemu-utils +# fai-mk-configspace + +# export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ +# fai-diskimage -vu armhost -S2G -cDEFAULT,DHCPC,DEBIAN,ARM64,BUSTER_ARM64,FAIBASE,DEMO,CLOUD,LAST arm64.raw +# chown your_user_id arm64.raw +# cp /var/log/fai/armhost/last/vmlinuz* vmlinuz +# cp /var/log/fai/armhost/last/initrd.img* initrd ---- - $ cp /srv/fai/nfsroot/var/tmp/base.tar.xz - $ /srv/fai/config/basefiles/JESSIE64.tar.xz + +Then you can run qemu as a normal user: +---- +> qemu-system-aarch64 -m 1000 -M virt,gic_version=3 -cpu cortex-a57 -drive file=arm64.raw,if=virtio,index=1 -no-reboot -nographic -name ARM64 -net nic,name=eth0,model=virtio -net user,name=eth0,-kernel vmlinuz -initrd initrd -append "console=ttyAMA0 rw ip=dhcp root=/dev/vda1 net.ifnames=0" ---- +This works similar for other architectures. +Keep in mind, that qemu network setup will have poor performance if +not using the virtio driver as above or tap devices. + + + +You can find the base files for many architectures at +https://fai-project.org/download/basefiles/, or use `mk-basefile` to +create your own. + + === [[sysinfo]]FAI rescue system If you set the variable +$FAI_ACTION+ to _sysinfo_ (for e.g. by using @@ -1726,20 +1800,18 @@ ---- demohost:~# df -Filesystem 1K-blocks Used Available Use% Mounted on -rootfs 4099064 414088 3645296 11% / + +Filesystem 1K-blocks Used Available Use% Mounted on +devtmpfs 1950880 0 1950880 0% /dev +tmpfs 1971656 336 1971320 1% /run +overlay 1971656 148 1971508 1% / +tmpfs 1971656 148 1971508 1% /live/cow 192.168.33.250:/srv/fai/nfsroot - 3905600 410976 3454944 11% /live/image -tmpfs 193464 3112 190352 2% /live/cow -aufs 4099064 414088 3645296 11% / - -192.168.33.250:/srv/fai/config - 3905600 410976 3454944 11% /var/lib/fai/config -/dev/sda1 241116 74519 154149 33% /target -/dev/sda9 4364212 139888 4179988 4% /target/home -/dev/sda7 553376 16840 536536 4% /target/tmp -/dev/sda8 2221628 275936 1832840 14% /target/usr -/dev/sda6 577096 172924 374856 32% /target/var + 15416320 12121088 919552 93% /live/image +faiserver:/srv/fai/config 15416320 12121088 919552 93% /var/lib/fai/config +/dev/mapper/vg1-root 7828376 1599880 5811116 22% /target +/dev/vda1 198337 49976 138121 27% /target/boot +/dev/mapper/vg1-home 1503280 4620 1404248 1% /target/home ---- *This method can be used as a rescue environment!* If you need a file @@ -1781,7 +1853,7 @@ You can install all sorts of Linux distributions from a single Debian nfsroot. Therefore you have to create a base.tar.xz of the distribution -you like to install and place it info the `basefiles` directory. Then +you like to install and place it into the `basefiles` directory. Then name it UBUNTU1404.tar.xz for example. An install client which belongs to the class UBUNTU1404 then extracts this base file into its empty file system. Additionally you have to adjust the 'sources.list' or @@ -1791,7 +1863,7 @@ The tool `rinse(8)` is used for creating base files for distribution like CentOS, openSUSE, Scientific Linux Cern or Fedora. Some basefiles can be downloaded from -http://fai-project.org/download/basefiles/. +https://fai-project.org/download/basefiles/. The script +mk-basefile+ in '/usr/share/doc/fai-doc/examples/simple/basefiles/' helps creating @@ -1831,8 +1903,8 @@ $CMD ---- -Then, you will want to set the variable _install=0_ the xen-tools -config for that host. +Then, you should set the variable _install=0_ in the config of +xen-tools for that host. === [[softupdate]]Using FAI for updates FAI can also do updates of already running systems, without a @@ -1882,7 +1954,7 @@ Here are some variable that help writing these scripts: +$target+:: Points to the root directory of the client, which -is_/target_ during installation and _/_ during a softupdate. +is _/target_ during installation and _/_ during a softupdate. +$FAI_ROOT+:: It's the same value as +$target+. For historic reasons we have both these variables in FAI. @@ -1899,10 +1971,10 @@ _install_, _softupdate_, _dirinstall_, _sysinfo_, _inventory_ or your own defined action. -=== [[archcross]]How to install 32bit OS from a 64bit OS +=== [[archcross]]How to install 32-bit OS from a 64-bit OS -To install a computer with a 32bit OS, you need an i386 nfsroot. -Creating this 32bit nfsroot on an install server running amd64 is +To install a computer with a 32-bit OS, you need an i386 nfsroot. +Creating this 32-bit nfsroot on an install server running amd64 is quite simple. Install and set up the FAI packages. Then copy your FAI config files to a new subdirectory. @@ -1920,14 +1992,14 @@ FAI_DEBOOTSTRAP_OPTS="--arch i386 --exclude=info --include=aptitude"" ---- -Now call fai-make-nfsroot which creates the 32bit nfsroot in +Now call fai-make-nfsroot which creates the 32-bit nfsroot in '/srv/fai/nfsroot-i386' ---- faiserver# fai-make-nfsroot -v -C/etc/fai-i386 ---- -Creating a partitial mirror using `fai-mirror(1)` that is needed for +Creating a partial mirror using `fai-mirror(1)` that is needed for a bootable CD or USB stick is also possible on a different architecture. You have to specify the architecture when calling fai-mirror. @@ -1957,9 +2029,8 @@ confdir:: The kernel appended parameters may define variables, the syslog daemon is -started. The list of network devices is stored in -+$netdevices+. Then additional parameters are fetched from a DHCP -server. The DNS resolver configuration file is created. +started. Network parameters are fetched from a DHCP +server and are stored in +boot.log+. The DNS resolver configuration file is created. + The location of the configuration space is defined by the variable +$FAI_CONFIG_SRC+. @@ -2009,7 +2080,7 @@ tasks and to save the output to '/tmp/fai/fai.log'. If you have any problems during installation, look at all files in '/tmp/fai/'. You can find examples of the log files -at http://fai-project.org/logs/. +at https://fai-project.org/logs/. dirinstall:: Install into a directory, not onto a local disk. Use this for creating @@ -2034,13 +2105,13 @@ extrbase:: Extracts a minimal system after that a chroot can be made into it. By default the base tar file '/var/tmp/base.tar.xz' will be -extracted. Also files matching a class name in $FAI/basefiles /` are used for unpacking a +extracted. Also files matching a class name in `$FAI/basefiles/` are used for unpacking a different tar file depending on classes defined. This can be used for installing different Linux distributions than the one used for creating the nfsroot. The default file 'base.tar.xz' is a snapshot of a -basic Debian system created by `debootstrap(8)` +basic Debian system created by `debootstrap(8)`. This task uses the variable +FAI_BASEFILEURL+ for fetching the base -file via FTP or HTTP if it's defined. +file via FTP, HTTPS or HTTP if it's defined. debconf:: Calls `fai-debconf(1)` to set the values for the debconf preseeding database. @@ -2139,12 +2210,32 @@ disk. This is done using `fai-chboot(8)`. +=== [[nfsv4]]How to use NFS v4 with the nfsroot + +The nfsroot is mounted via NFS v3 by default. This is done +by adding the option 'nfsvers=3' to the kernel boot options of the +kernel booted by the install clients. fai-chboot(8) will do this for you. + +If you want to use NFS v4 for the nfsroot, you have to remove this +option the the kernel boot options. Additionally, overlayfs +- the kernel module that is used for making the read-only mounted +nfsroot writeable - can only work with NFS v4 if acl(5) support is +disabled on the filessystem on the NFS server side (as of 2019). If +'/srv/fai/nfsroot' on your FAI server is located on the root partition +mounted to '/', you can disable acl support for the whole file system +on this partition using + +---- +# mount -oremount,noacl / +---- + +Then mounting the nfsroot from a FAI server using NFS v4 will work. + === [[debian-mirror]]How to create a local Debian mirror -The script `mkdebmirror` footnote:[You can find the script in +The utility `mkdebmirror` footnote:[You can find the script in '/usr/share/doc/fai-doc/examples/utils/'] can be used for creating -your own local Debian mirror. This script uses the command -`debmirror(1)`. A partial Debian mirror for i386 and amd64 architecture for +your own local Debian mirror. This script uses `debmirror(1)`. A partial Debian mirror for i386 and amd64 architecture for Debian 8.0 (aka jessie) without the source packages needs about {mirrorsize}GB of disk space. Accessing the mirror via HTTP will be the default way in most cases. To see more output from the script call @@ -2184,7 +2275,7 @@ ---- - A list of variables used by FAI can be found at -http://wiki.fai-project.org/wiki/Variables. +https://wiki.fai-project.org/index.php/Variables. - You can shorten some customization scripts by using one single fcopy command _fcopy -r /_. @@ -2252,10 +2343,10 @@ - How to use the nfsroot as system for diskless clients? + -http://wiki.fai-project.org/wiki/Use_nfsroot_for_diskless_clients +https://wiki.fai-project.org/index.php/Use_nfsroot_for_diskless_clients -- How to server multiple nfsroot directories on one FAI server? +- How to serve multiple nfsroot directories on one FAI server? + If you want to serve multiple nfsroot directories, you need to create specific config directories in '/etc' for FAI, like @@ -2263,7 +2354,7 @@ +$NFSROOT+ variables to different directories and run ---- -faiserver#fai-make-nfsroot -c /etc/fai-jessie +faiserver#fai-make-nfsroot -C /etc/fai-jessie ---- @@ -2293,7 +2384,7 @@ directory. Sample log files from successfully installed computers are -available on http://fai-project.org/logs. +available on https://fai-project.org/logs. These a some log files which are created by FAI. FAI_CLASSES:: diff -Nru fai-5.3.6ubuntu1/doc/includes/bootexample.txt fai-5.9.4ubuntu1/doc/includes/bootexample.txt --- fai-5.3.6ubuntu1/doc/includes/bootexample.txt 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/doc/includes/bootexample.txt 2020-04-27 02:48:17.000000000 +0000 @@ -19,6 +19,6 @@ TFTP prefix: fai/ Trying to load pxelinux.cfg/C0A82164 -Loading vmlinuz-3.16.0-4-amd64.................. -Loading initrd.img-3.16.0-4-amd64......................ready. +Loading vmlinuz-4.9.0-3-amd64.................. +Loading initrd.img-4.9.0-3-amd64......................ready. ---- diff -Nru fai-5.3.6ubuntu1/doc/includes/fai-1st-part.txt fai-5.9.4ubuntu1/doc/includes/fai-1st-part.txt --- fai-5.3.6ubuntu1/doc/includes/fai-1st-part.txt 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/doc/includes/fai-1st-part.txt 2020-04-27 02:48:17.000000000 +0000 @@ -2,28 +2,31 @@ ------------------------------------------------- Fully Automatic Installation - FAI - 5.3.3~bpo8+2 (c) 1999-2017 + 5.5 (c) 1999-2017 Thomas Lange ------------------------------------------------- Calling task_confdir -Kernel currently running: Linux 3.16.0-4-amd64 x86_64 GNU/Linux -Kernel parameters: BOOT_IMAGE=vmlinuz-3.16.0-4-amd64 initrd=initrd.img-3.16.0-4-amd64 \ - rw aufs ip=dhcp root=192.168.33.250:/srv/fai/nfsroot FAI_FLAGS=verbose,sshd,createvt\ - FAI_CONFIG_SRC=nfs://faiserver/srv/fai/cskoeln FAI_ACTION=install quiet\ - BOOTIF=01-00-a2-a3-04-05-06 +Kernel currently running: Linux 4.9.0-3-amd64 x86_64 GNU/Linux +Kernel parameters: BOOT_IMAGE=vmlinuz-4.9.0-3-amd64 initrd=initrd.img-4.9.0-3-amd64 \ + rw rootovl ip=dhcp root=192.168.33.250:/srv/fai/nfsroot FAI_FLAGS=verbose,sshd,createvt \ + FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config FAI_ACTION=install Reading /tmp/fai/boot.log FAI_FLAGS: verbose sshd createvt Setting SERVER=faiserver. Value extracted from FAI_CONFIG_SRC. FAI_CONFIG_SRC is set to nfs://faiserver/srv/fai/config Configuration space faiserver:/srv/fai/config mounted to /var/lib/fai/config +Source hook: setup.DEFAULT.sh +setup.DEFAULT.sh OK. Calling task_setup FAI_FLAGS: verbose sshd createvt -15 Jan 13:22:37 ntpdate[1533]: step time server 192.168.33.250 offset -0.342793 sec +15 Sep 13:22:37 ntpdate[1533]: step time server 192.168.33.250 offset -0.342793 sec Press ctrl-c to interrupt FAI and to get a shell -Starting FAI execution - 20170115_132237 +Starting FAI execution - 20170915_132237 Calling task_defclass fai-class: Defining classes. +Executing /var/lib/fai/config/class/01-short-hostname.sh. +01-short-hostname.sh OK. Executing /var/lib/fai/config/class/10-base-classes. 10-base-classes OK. Executing /var/lib/fai/config/class/20-hwdetect.source. diff -Nru fai-5.3.6ubuntu1/doc/Makefile fai-5.9.4ubuntu1/doc/Makefile --- fai-5.3.6ubuntu1/doc/Makefile 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/doc/Makefile 2020-04-27 02:48:17.000000000 +0000 @@ -16,10 +16,12 @@ html: $(DOC).txt images asciidoc -a toc2 -a toclevels=3 --theme=flask $(DOC).txt +.NOTPARALLEL: pdf pdf: $(DOC).txt images a2x $(OPT) -L --icons -a toc -a toclevels=3 -f pdf $(DOC).txt rm -f $(DOC).xml $(DOC).fo +.NOTPARALLEL: ps ps: $(DOC).txt images a2x $(OPT) -L --icons -a toc -a toclevels=3 -f ps $(DOC).txt rm -f $(DOC).xml $(DOC).fo @@ -43,8 +45,8 @@ cp -p setup-storage-call-graph.txt setup-storage-overview.txt $(DOC2DIR) clean: - rm -rf images .a2x-icons - rm -f $(DOC).text $(DOC).html $(DOC).doc $(DOC).pdf $(DOC).xml $(DOC).ps docbook-xsl.css + rm -rf images .a2x-icons grohtml-*.png + rm -f $(DOC).text $(DOC).html $(DOC).doc $(DOC).pdf $(DOC).xml $(DOC).ps* docbook-xsl.css test: asciidoc --version > /dev/null 2>&1 || exit "Please install the asciidoc package." diff -Nru fai-5.3.6ubuntu1/doc/QUESTIONNAIRE fai-5.9.4ubuntu1/doc/QUESTIONNAIRE --- fai-5.3.6ubuntu1/doc/QUESTIONNAIRE 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/doc/QUESTIONNAIRE 2020-04-27 02:48:17.000000000 +0000 @@ -1,8 +1,8 @@ FAI QUESTIONNAIRE ----------------- -http://fai-project.org/questionnaire -last edited: november 5, 2010 +https://fai-project.org/questionnaire +last edited: november 18, 2019 I'm very interested in your experiences with fai, bug reports, new ideas,... Please send this questionnaire to @@ -10,12 +10,13 @@ fai@fai-project.org All replies to this questionnaire are available at -http://fai-project.org/reports +https://fai-project.org/reports thanks in advance Thomas Lange ---------------------------------------------------------------- +Are you using the FAI.me build service? How many hosts have you installed using fai? Which version of fai are you using? Which version are you using as your install kernel? @@ -38,10 +39,10 @@ How big is your config space (Mbytes, # of files)? cd (/srv/fai/config by default) du -sh --exclude=.svn --exclude=basefiles -find ! -type d | grep -v svn|grep -v cvs|wc -l +find ! -type d | grep -v svn|grep -v cvs|fgrep -v .git|wc -l How many files do you have in ../config/files? -find files ! -type d | grep -v svn|grep -v cvs|wc -l +find files ! -type d | grep -v svn|grep -v cvs|fgrep -v .git|wc -l What types of scripts are you using for local customization? (shell, perl, cfengine, puppet, expect,...) diff -Nru fai-5.3.6ubuntu1/doc/setup-storage-overview.txt fai-5.9.4ubuntu1/doc/setup-storage-overview.txt --- fai-5.3.6ubuntu1/doc/setup-storage-overview.txt 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/doc/setup-storage-overview.txt 2020-04-27 02:48:17.000000000 +0000 @@ -34,8 +34,8 @@ ┌---------------| | | Commands.pm build_disk_commands -| buiild_raid_commands -| buiild_cryptsetup_commands +| build_raid_commands +| build_cryptsetup_commands | order_commands | | └---------------| diff -Nru fai-5.3.6ubuntu1/examples/etc/dhcpd.conf fai-5.9.4ubuntu1/examples/etc/dhcpd.conf --- fai-5.3.6ubuntu1/examples/etc/dhcpd.conf 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/etc/dhcpd.conf 2020-04-27 02:48:18.000000000 +0000 @@ -14,10 +14,16 @@ option ntp-servers faiserver; server-name faiserver; next-server faiserver; - filename "fai/pxelinux.0"; + if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00000" { + filename "fai/pxelinux.0"; + } + if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00007" { + filename "fai/syslinux.efi"; + } } # generate a lot of entries with: -# perl -e 'for (1..10) {printf "host client%02s {hardware ethernet XXX:$_;fixed-address client%02s;}\n",$_,$_;}' -# then replace XXX with the hardware addresses of your clients +# perl -e 'for (1..10) {printf "host client%02s {hardware ethernet 52:54:00:11:23:%02X;fixed-address client%02s;}\n",$_,$_,$_;}' +# then replace 52:54:00:11:23:XX with the hardware addresses of your clients +# 52:54:00:11:23 is a prefix used by fai-kvm host demohost {hardware ethernet 0:2:a3:b5:c5:41;fixed-address demohost;} diff -Nru fai-5.3.6ubuntu1/examples/etc/hosts fai-5.9.4ubuntu1/examples/etc/hosts --- fai-5.3.6ubuntu1/examples/etc/hosts 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/etc/hosts 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ - - -# the master server to the internet network -123.123.123.123 nucleus - -# the master sever, Beowulf internal network -192.168.42.250 atom00 - -# create these entries with the perl one liner -# perl -e 'for (1..25) {printf "192.168.42.%s atom%02s\n",$_,$_;}' -# -# the Beowulf cluster nodes -192.168.42.1 atom01 -192.168.42.2 atom02 -192.168.42.3 atom03 -192.168.42.4 atom04 -192.168.42.5 atom05 -192.168.42.6 atom06 -192.168.42.7 atom07 -192.168.42.8 atom08 -192.168.42.9 atom09 -192.168.42.10 atom10 -192.168.42.11 atom11 -192.168.42.12 atom12 -192.168.42.13 atom13 -192.168.42.14 atom14 -192.168.42.15 atom15 -192.168.42.16 atom16 -192.168.42.17 atom17 -192.168.42.18 atom18 -192.168.42.19 atom19 -192.168.42.20 atom20 -192.168.42.21 atom21 -192.168.42.22 atom22 -192.168.42.23 atom23 -192.168.42.24 atom24 -192.168.42.25 atom25 diff -Nru fai-5.3.6ubuntu1/examples/simple/basefiles/mk-basefile fai-5.9.4ubuntu1/examples/simple/basefiles/mk-basefile --- fai-5.3.6ubuntu1/examples/simple/basefiles/mk-basefile 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/basefiles/mk-basefile 2020-04-27 02:48:17.000000000 +0000 @@ -2,13 +2,16 @@ # mk-basefile, create basefiles for some distributions # -# Thomas Lange, Uni Koeln, 2011-2017 +# Thomas Lange, Uni Koeln, 2011-2020 # 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 # Ubuntu 14.04/16.04 -# CentOS 5/6/7 +# CentOS 5/6/7/8 # Scientific Linux Cern 5/6 # # Packages you might want to install to use this command: @@ -17,19 +20,25 @@ # 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://deb.debian.org/debian/ MIRROR_UBUNTU=http://mirror.netcologne.de/ubuntu/ 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_SQUEEZE=isc-dhcp-client,isc-dhcp-common,info +EXCLUDE_WHEEZY=info +EXCLUDE_JESSIE=info +EXCLUDE_STRETCH=info +EXCLUDE_BUSTER= +EXCLUDE_BULLSEYE= +EXCLUDE_SID= EXCLUDE_TRUSTY=dhcp3-client,dhcp3-common,info -EXCLUDE_XENIAL=tasksel,tasksel-data +EXCLUDE_XENIAL=udhcpc,dibbler-client,info +EXCLUDE_BIONIC=udhcpc,dibbler-client,info +EXCLUDE_FOCAL=udhcpc,dibbler-client,info -INCLUDE_DEBIAN=aptitude +# here you can add packages, that are needed very early +INCLUDE_DEBIAN= setarch() { @@ -66,6 +75,7 @@ mkpost-centos() { + # set local mirror for rinse post script [ -z "$MIRROR_CENTOS" ] && return cat < $xtmp/post #! /bin/sh @@ -79,6 +89,7 @@ mkpost-slc() { + # set local mirror for rinse post script ver=$1 [ -z "$MIRROR_SLC" ] && return cat < $xtmp/post @@ -95,10 +106,11 @@ 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 } @@ -120,7 +132,7 @@ tarit() { - tar $attributes --one-file-system -C $xtmp -cf - . | $zip > $target.$ext + tar $attributes --numeric-owner --one-file-system -C $xtmp -cf - . | $zip > $target.$ext } @@ -159,19 +171,30 @@ 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" + [ -n "${!exc}" ] && exc="--exclude=${!exc}" || unset exc + dist=${dist,,} - local exc="EXCLUDE_$DIST" check - debootstrap --arch $arch --exclude=${!exc} --include=${INCLUDE_DEBIAN} $dist $xtmp $mirror + if [ -n "$INCLUDE_DEBIAN" ]; then + local inc="--include=$INCLUDE_DEBIAN" + fi + + 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 } @@ -183,15 +206,21 @@ 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 + BIONIC64 + FOCAL64 SQUEEZE32 SQUEEZE64 WHEEZY32 WHEEZY64 JESSIE32 JESSIE64 STRETCH32 STRETCH64 + BUSTER32 BUSTER64 + BULLSEYE32 BULLSEYE64 + SID32 SID64 " } @@ -200,12 +229,12 @@ cat <&/dev/null && dpkg --print-architecture | tr a-z A-Z # determin if we are a DHCP client or not # count the : chars in the argument of ip= diff -Nru fai-5.3.6ubuntu1/examples/simple/class/20-hwdetect.sh fai-5.9.4ubuntu1/examples/simple/class/20-hwdetect.sh --- fai-5.3.6ubuntu1/examples/simple/class/20-hwdetect.sh 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/20-hwdetect.sh 2020-04-27 02:48:18.000000000 +0000 @@ -12,8 +12,7 @@ # here, you can load modules depending on the kernel version case $(uname -r) in 2.6*) kernelmodules="$kernelmodules mptspi dm-mod md-mod aes dm-crypt" ;; - 3*) kernelmodules="$kernelmodules mptspi dm-mod md-mod aes dm-crypt" ;; - 4*) kernelmodules="$kernelmodules mptspi dm-mod md-mod aes dm-crypt" ;; + [3456]*) kernelmodules="$kernelmodules mptspi dm-mod md-mod aes dm-crypt" ;; esac for mod in $kernelmodules; do diff -Nru fai-5.3.6ubuntu1/examples/simple/class/40-parse-profiles.sh fai-5.9.4ubuntu1/examples/simple/class/40-parse-profiles.sh --- fai-5.3.6ubuntu1/examples/simple/class/40-parse-profiles.sh 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/40-parse-profiles.sh 2020-04-27 02:48:18.000000000 +0000 @@ -1,4 +1,3 @@ - #! /bin/bash # parse *.profile and build a curses menu, so the user can select a profile diff -Nru fai-5.3.6ubuntu1/examples/simple/class/41-warning.sh fai-5.9.4ubuntu1/examples/simple/class/41-warning.sh --- fai-5.3.6ubuntu1/examples/simple/class/41-warning.sh 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/41-warning.sh 2020-04-27 02:48:18.000000000 +0000 @@ -13,6 +13,16 @@ [ "$flag_menu" ] || return 0 out=$(tty) +red=$(mktemp) +echo 'screen_color = (CYAN,RED,ON)' > $red -dialog --colors --clear --aspect 6 --title "FAI - Fully Automatic Installation" --trim \ +DIALOGRC=$red dialog --colors --clear --aspect 6 --title "FAI - Fully Automatic Installation" --trim \ --msgbox "\n\n If you continue, \n all your data on the disk \n \n|\Zr\Z1 WILL BE DESTROYED \Z0\Zn|\n\n" 0 0 1>$out + +# stop on any error, or if ESC was hit +if [ $? -ne 0 ]; then + task_error 999 +fi + +rm $red +unset red diff -Nru fai-5.3.6ubuntu1/examples/simple/class/50-host-classes fai-5.9.4ubuntu1/examples/simple/class/50-host-classes --- fai-5.3.6ubuntu1/examples/simple/class/50-host-classes 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/50-host-classes 2020-04-27 02:48:18.000000000 +0000 @@ -15,17 +15,18 @@ echo "FAIBASE DEBIAN DEMO XORG XFCE LVM";; gnomehost) echo "FAIBASE DEBIAN DEMO XORG GNOME";; + ubuntuhost) + echo "FAIBASE DEBIAN DEMO UBUNTU FOCAL FOCAL64 XORG";; centos) echo "FAIBASE CENTOS" # you may want to add class XORG here - ifclass I386 && echo CENTOS6_32 # AFAIK there's no 32bit C7 - ifclass AMD64 && echo CENTOS7_64 - exit 0 ;; # CentOS does not use the GRUB class + ifclass AMD64 && echo CENTOS8_64 + ;; slchost) # Scientific Linux Cern, is very similar to CentOS. SLC should alsways use the class CENTOS echo "FAIBASE CENTOS SLC" # you may want to add class XORG here ifclass I386 && echo SLC7_32 ifclass AMD64 && echo SLC7_64 - exit 0 ;; # CentOS/SLC does not use the GRUB class + ;; *) echo "FAIBASE DEBIAN DEMO" ;; esac diff -Nru fai-5.3.6ubuntu1/examples/simple/class/55-classes fai-5.9.4ubuntu1/examples/simple/class/55-classes --- fai-5.3.6ubuntu1/examples/simple/class/55-classes 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/55-classes 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -#! /bin/bash - -ifclass GCE && echo AMD64 CLOUD -exit 0 diff -Nru fai-5.3.6ubuntu1/examples/simple/class/60-misc fai-5.9.4ubuntu1/examples/simple/class/60-misc --- fai-5.3.6ubuntu1/examples/simple/class/60-misc 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/60-misc 2020-04-27 02:48:18.000000000 +0000 @@ -1,6 +1,11 @@ #! /bin/bash ifclass -o CENTOS SLC && exit 0 -if ifclass -o I386 AMD64 ; then - ifclass -o GRUB_PC GRUB_EFI ||echo GRUB_PC + +ifclass -o GRUB_PC GRUB_EFI && exit 0 + +if [ -d /sys/firmware/efi ]; then + echo GRUB_EFI +elif ifclass -o I386 AMD64 ; then + echo GRUB_PC fi diff -Nru fai-5.3.6ubuntu1/examples/simple/class/85-efi-classes fai-5.9.4ubuntu1/examples/simple/class/85-efi-classes --- fai-5.3.6ubuntu1/examples/simple/class/85-efi-classes 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/85-efi-classes 2020-01-02 21:08:46.000000000 +0000 @@ -0,0 +1,17 @@ +#! /bin/bash + +# define classes for disk_config in an EFI enironment + +if [ ! -d /sys/firmware/efi ]; then + exit 0 +fi + +if ifclass FAIBASE; then + echo FAIBASE_EFI +elif ifclass FAISERVER; then + echo FAISERVER_EFI +elif ifclass LVM; then + echo LVM_EFI +elif ifclass XENIAL; then + echo XENIAL_EFI +fi diff -Nru fai-5.3.6ubuntu1/examples/simple/class/CLOUD.var fai-5.9.4ubuntu1/examples/simple/class/CLOUD.var --- fai-5.3.6ubuntu1/examples/simple/class/CLOUD.var 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/CLOUD.var 2018-03-10 20:02:12.000000000 +0000 @@ -0,0 +1 @@ +NIC1=eth0 diff -Nru fai-5.3.6ubuntu1/examples/simple/class/DEBIAN.var fai-5.9.4ubuntu1/examples/simple/class/DEBIAN.var --- fai-5.3.6ubuntu1/examples/simple/class/DEBIAN.var 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/DEBIAN.var 2020-04-27 02:48:18.000000000 +0000 @@ -1,3 +1,7 @@ +release=buster +apt_cdn=http://deb.debian.org +security_cdn=http://security.debian.org + CONSOLEFONT= KEYMAP=us-latin1 diff -Nru fai-5.3.6ubuntu1/examples/simple/class/example.profile fai-5.9.4ubuntu1/examples/simple/class/example.profile --- fai-5.3.6ubuntu1/examples/simple/class/example.profile 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/example.profile 2020-04-27 02:48:18.000000000 +0000 @@ -25,21 +25,21 @@ downloaded from the internet. Classes: INSTALL FAIBASE DEBIAN DEMO XORG GNOME -Name: CentOS 7 -Description: CentOS 7 with Xfce desktop -Short: A normal Xfce desktop, running CentOS 7 -Long: We use the Debian nfsroot for installing the CentOS 7 OS. +Name: CentOS 8 +Description: CentOS 8 with Xfce desktop +Short: A normal Xfce desktop, running CentOS 8 +Long: We use the Debian nfsroot for installing the CentOS 8 OS. You should have a fast network connection, because most packages are downloaded from the internet. -Classes: INSTALL FAIBASE CENTOS CENTOS7_64 XORG +Classes: INSTALL FAIBASE CENTOS CENTOS8_64 XORG Name: Ubuntu -Description: Ubuntu 16.04 desktop installation +Description: Ubuntu 20.04 desktop installation Short: Unity desktop Long: We use the Debian nfsroot for installing the Ubuntu OS. You should have a fast network connection, because most packages are downloaded from the internet. -Classes: INSTALL FAIBASE DEMO DEBIAN UBUNTU XENIAL XENIAL64 XORG +Classes: INSTALL FAIBASE DEMO DEBIAN UBUNTU FOCAL FOCAL64 XORG Name: Inventory Description: Show hardware info diff -Nru fai-5.3.6ubuntu1/examples/simple/class/FAIBASE.var fai-5.9.4ubuntu1/examples/simple/class/FAIBASE.var --- fai-5.3.6ubuntu1/examples/simple/class/FAIBASE.var 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/FAIBASE.var 2020-04-27 02:48:17.000000000 +0000 @@ -14,5 +14,9 @@ # errors in tasks greater than this value will cause the installation to stop STOP_ON_ERROR=700 -# set parameter for install_packges(8) +# set parameter for install_packages(8) MAXPACKAGES=800 + +# a user account will be created +username=demo +USERPW='$1$kBnWcO.E$djxB128U7dMkrltJHPf6d1' diff -Nru fai-5.3.6ubuntu1/examples/simple/class/GCE.var fai-5.9.4ubuntu1/examples/simple/class/GCE.var --- fai-5.3.6ubuntu1/examples/simple/class/GCE.var 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/GCE.var 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -release=stretch -TIMEZONE=UTC -NTPSRVS='metadata.google.internal' -NIC1=eth0 diff -Nru fai-5.3.6ubuntu1/examples/simple/class/UBUNTU.var fai-5.9.4ubuntu1/examples/simple/class/UBUNTU.var --- fai-5.3.6ubuntu1/examples/simple/class/UBUNTU.var 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/class/UBUNTU.var 2020-04-27 02:48:18.000000000 +0000 @@ -1 +1,2 @@ -ubuntudist=xenial +ubuntumirror=http://archive.ubuntu.com +ubuntudist=focal diff -Nru fai-5.3.6ubuntu1/examples/simple/debconf/CLOUD fai-5.9.4ubuntu1/examples/simple/debconf/CLOUD --- fai-5.3.6ubuntu1/examples/simple/debconf/CLOUD 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/debconf/CLOUD 2020-04-27 02:48:17.000000000 +0000 @@ -1,2 +1,2 @@ # Linux command line: -grub-pc grub2/linux_cmdline_default string quiet elevator=noop +grub-pc grub2/linux_cmdline_default string elevator=noop quiet diff -Nru fai-5.3.6ubuntu1/examples/simple/debconf/DEBIAN fai-5.9.4ubuntu1/examples/simple/debconf/DEBIAN --- fai-5.3.6ubuntu1/examples/simple/debconf/DEBIAN 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/debconf/DEBIAN 2020-04-27 02:48:17.000000000 +0000 @@ -1,9 +1,9 @@ exim4-config exim4/dc_eximconfig_configtype select local delivery only; not on a network locales locales/default_environment_locale select en_US.UTF-8 locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8 -keyboard-configuration keyboard-configuration/modelcode string pc105 -keyboard-configuration keyboard-configuration/xkb-keymap select us -keyboard-configuration keyboard-configuration/variant select USA -keyboard-configuration keyboard-configuration/model select Generic 105-key (Intl) PC -keyboard-configuration keyboard-configuration/layoutcode string us -keyboard-configuration keyboard-configuration/optionscode string ctrl:nocaps,terminate:ctrl_alt_bksp +keyboard-configuration keyboard-configuration/modelcode string pc105 +keyboard-configuration keyboard-configuration/xkb-keymap select us +keyboard-configuration keyboard-configuration/variant select USA +keyboard-configuration keyboard-configuration/model select Generic 105-key (Intl) PC +keyboard-configuration keyboard-configuration/layoutcode string us +keyboard-configuration keyboard-configuration/optionscode string ctrl:nocaps,terminate:ctrl_alt_bksp diff -Nru fai-5.3.6ubuntu1/examples/simple/debconf/GCE fai-5.9.4ubuntu1/examples/simple/debconf/GCE --- fai-5.3.6ubuntu1/examples/simple/debconf/GCE 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/debconf/GCE 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -# Linux command line: -grub-pc grub2/linux_cmdline_default string quiet elevator=noop console=ttyS0,38400n8 -# GRUB timeout; for internal use -grub-pc grub-pc/timeout string 0 diff -Nru fai-5.3.6ubuntu1/examples/simple/debconf/GERMAN fai-5.9.4ubuntu1/examples/simple/debconf/GERMAN --- fai-5.3.6ubuntu1/examples/simple/debconf/GERMAN 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/debconf/GERMAN 2020-04-27 02:48:17.000000000 +0000 @@ -1,8 +1,8 @@ locales locales/default_environment_locale select de_DE.UTF-8 locales locales/locales_to_be_generated multiselect de_DE.UTF-8 UTF-8 -keyboard-configuration keyboard-configuration/modelcode string pc105 -keyboard-configuration keyboard-configuration/xkb-keymap select de -keyboard-configuration keyboard-configuration/variant select Germany -keyboard-configuration keyboard-configuration/model select Generic 105-key (Intl) PC -keyboard-configuration keyboard-configuration/layoutcode string de -keyboard-configuration keyboard-configuration/optionscode string ctrl:nocaps,terminate:ctrl_alt_bksp +keyboard-configuration keyboard-configuration/modelcode string pc105 +keyboard-configuration keyboard-configuration/xkb-keymap select de +keyboard-configuration keyboard-configuration/variant select Germany +keyboard-configuration keyboard-configuration/model select Generic 105-key (Intl) PC +keyboard-configuration keyboard-configuration/layoutcode string de +keyboard-configuration keyboard-configuration/optionscode string ctrl:nocaps,terminate:ctrl_alt_bksp diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/CENTOS fai-5.9.4ubuntu1/examples/simple/disk_config/CENTOS --- fai-5.3.6ubuntu1/examples/simple/disk_config/CENTOS 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/CENTOS 2020-04-27 02:48:18.000000000 +0000 @@ -10,8 +10,7 @@ #primary / 350 ext3 rw,noatime,errors=remount-ro createopts="-L ROOT -I 128" # use following line for CentOS 7 -primary / 4G-10G ext4 rw,noatime,errors=remount-ro createopts="-L ROOT" +primary / 4G-50G ext4 rw,noatime,errors=remount-ro createopts="-L ROOT" -logical swap 200-1000 swap sw createopts="-L SWAP" -logical /tmp 100-1G ext4 rw,noatime,nosuid,nodev createopts="-L TMP -m 0" tuneopts="-c 0 -i 0" -logical /home 100-50% ext4 rw,noatime,nosuid,nodev createopts="-L HOME -m 1" tuneopts="-c 0 -i 0" +logical swap 200-10G swap sw createopts="-L SWAP" +logical /home 100- ext4 rw,noatime,nosuid,nodev createopts="-L HOME -m 1" tuneopts="-c 0 -i 0" diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/CLOUD fai-5.9.4ubuntu1/examples/simple/disk_config/CLOUD --- fai-5.3.6ubuntu1/examples/simple/disk_config/CLOUD 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/CLOUD 2020-04-27 02:48:18.000000000 +0000 @@ -4,4 +4,4 @@ disk_config disk1 disklabel:msdos bootable:1 fstabkey:uuid align-at:1M -primary / 300- ext4 rw,nobarrier,noatime,errors=remount-ro tuneopts="-c 0 -i 0" +primary / 300- ext4 rw,discard,barrier=0,noatime,errors=remount-ro tuneopts="-c 0 -i 0" diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/FAIBASE fai-5.9.4ubuntu1/examples/simple/disk_config/FAIBASE --- fai-5.3.6ubuntu1/examples/simple/disk_config/FAIBASE 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/FAIBASE 2020-04-27 02:48:18.000000000 +0000 @@ -4,7 +4,6 @@ disk_config disk1 disklabel:msdos bootable:1 fstabkey:uuid -primary / 2G-15G ext4 rw,noatime,errors=remount-ro -logical swap 200-1G swap sw -logical /tmp 100-1G ext4 rw,noatime,nosuid,nodev createopts="-L tmp -m 0" tuneopts="-c 0 -i 0" -logical /home 100-50% ext4 rw,noatime,nosuid,nodev createopts="-L home -m 1" tuneopts="-c 0 -i 0" +primary / 2G-50G ext4 rw,noatime,errors=remount-ro +logical swap 200-10G swap sw +logical /home 100- ext4 rw,noatime,nosuid,nodev createopts="-L home -m 1" tuneopts="-c 0 -i 0" diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/FAIBASE_EFI fai-5.9.4ubuntu1/examples/simple/disk_config/FAIBASE_EFI --- fai-5.3.6ubuntu1/examples/simple/disk_config/FAIBASE_EFI 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/FAIBASE_EFI 2020-01-02 20:48:49.000000000 +0000 @@ -0,0 +1,10 @@ +# example of new config file for setup-storage +# +# + +disk_config disk1 disklabel:gpt bootable:1 fstabkey:uuid + +primary /boot/efi 512M vfat rw +primary / 2G-50G ext4 rw,noatime,errors=remount-ro +primary swap 200-10G swap sw +primary /home 100- ext4 rw,noatime,nosuid,nodev createopts="-L home -m 1" tuneopts="-c 0 -i 0" diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/FAISERVER_EFI fai-5.9.4ubuntu1/examples/simple/disk_config/FAISERVER_EFI --- fai-5.3.6ubuntu1/examples/simple/disk_config/FAISERVER_EFI 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/FAISERVER_EFI 2020-01-02 20:49:50.000000000 +0000 @@ -0,0 +1,12 @@ +# config file for an FAI install server +# +# + +disk_config disk1 disklabel:gpt fstabkey:uuid + +primary /boot/efi 512M vfat rw +primary / 2G-15G ext4 rw,noatime,errors=remount-ro +primary swap 200-1000 swap sw +primary /tmp 100-1000 ext4 rw,noatime,nosuid,nodev createopts="-m 0" tuneopts="-c 0 -i 0" +primary /home 100-40% ext4 rw,noatime,nosuid,nodev createopts="-m 1" tuneopts="-c 0 -i 0" +primary /srv 1G-50% ext4 rw,noatime createopts="-m 1" tuneopts="-c 0 -i 0" diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/LVM fai-5.9.4ubuntu1/examples/simple/disk_config/LVM --- fai-5.3.6ubuntu1/examples/simple/disk_config/LVM 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/LVM 2020-04-27 02:48:18.000000000 +0000 @@ -10,6 +10,6 @@ disk_config lvm vg vg1 disk1.2 -vg1-root / 3G-15G ext4 noatime,rw +vg1-root / 3G-50G ext4 noatime,rw vg1-swap swap 200-4G swap sw vg1-home /home 600- ext4 noatime,nosuid,nodev,rw diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/LVM_EFI fai-5.9.4ubuntu1/examples/simple/disk_config/LVM_EFI --- fai-5.3.6ubuntu1/examples/simple/disk_config/LVM_EFI 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/LVM_EFI 2020-01-02 20:53:24.000000000 +0000 @@ -0,0 +1,16 @@ +# + +# entire disk with LVM, separate /home + +disk_config disk1 disklabel:gpt fstabkey:uuid align-at:1M + +primary /boot/efi 512M vfat rw +primary /boot 200 ext2 rw,noatime +primary - 4G- - - + +disk_config lvm + +vg vg1 disk1.3 +vg1-root / 3G-50G ext4 noatime,rw +vg1-swap swap 200-4G swap sw +vg1-home /home 600- ext4 noatime,nosuid,nodev,rw diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/XENIAL fai-5.9.4ubuntu1/examples/simple/disk_config/XENIAL --- fai-5.3.6ubuntu1/examples/simple/disk_config/XENIAL 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/XENIAL 2019-03-26 15:32:51.000000000 +0000 @@ -0,0 +1,12 @@ +# example of new config file for setup-storage +# +# + +# this is a copy of FAIBASE, but with metadata_csum disabled. +# Ubuntu XENIAL does not yet suport this option + +disk_config disk1 disklabel:msdos bootable:1 fstabkey:uuid + +primary / 2G-50G ext4 rw,noatime,errors=remount-ro createopts="-O ^metadata_csum" +logical swap 200-1G swap sw +logical /home 100- ext4 rw,noatime,nosuid,nodev createopts="-L home -m 1 -O ^metadata_csum" tuneopts="-c 0 -i 0" diff -Nru fai-5.3.6ubuntu1/examples/simple/disk_config/XENIAL_EFI fai-5.9.4ubuntu1/examples/simple/disk_config/XENIAL_EFI --- fai-5.3.6ubuntu1/examples/simple/disk_config/XENIAL_EFI 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/disk_config/XENIAL_EFI 2020-01-02 20:55:24.000000000 +0000 @@ -0,0 +1,13 @@ +# example of new config file for setup-storage +# +# + +# this is a copy of FAIBASE, but with metadata_csum disabled. +# Ubuntu XENIAL does not yet suport this option + +disk_config disk1 disklabel:gpt bootable:1 fstabkey:uuid + +primary /boot/efi 512M vfat rw +primary / 2G-50G ext4 rw,noatime,errors=remount-ro createopts="-O ^metadata_csum" +primary swap 200-1G swap sw +primary /home 100- ext4 rw,noatime,nosuid,nodev createopts="-L home -m 1 -O ^metadata_csum" tuneopts="-c 0 -i 0" diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/apt/sources.list/GCE fai-5.9.4ubuntu1/examples/simple/files/etc/apt/sources.list/GCE --- fai-5.3.6ubuntu1/examples/simple/files/etc/apt/sources.list/GCE 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/apt/sources.list/GCE 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -deb http://httpredir.debian.org/debian {release} main contrib non-free -deb http://httpredir.debian.org/debian {release}-backports main -deb http://security.debian.org/debian-security {release}/updates main contrib non-free - -deb http://packages.cloud.google.com/apt cloud-sdk-{release} main -deb http://packages.cloud.google.com/apt google-cloud-packages-archive-keyring-{release} main -deb http://packages.cloud.google.com/apt google-cloud-compute-{release} main diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/apt/sources.list/GNOME fai-5.9.4ubuntu1/examples/simple/files/etc/apt/sources.list/GNOME --- fai-5.3.6ubuntu1/examples/simple/files/etc/apt/sources.list/GNOME 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/apt/sources.list/GNOME 2020-04-27 02:48:18.000000000 +0000 @@ -1,2 +1,3 @@ -deb http://httpredir.debian.org/debian stretch main contrib non-free -deb http://httpredir.debian.org/debian-security stretch/updates main contrib non-free +deb {%apt_cdn%}/debian {%release%} main +deb {%security_cdn%}/debian-security {%release%}/updates main +deb {%apt_cdn%}/debian {%release%}-updates main diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/apt/sources.list/preinst fai-5.9.4ubuntu1/examples/simple/files/etc/apt/sources.list/preinst --- fai-5.3.6ubuntu1/examples/simple/files/etc/apt/sources.list/preinst 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/apt/sources.list/preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#! /bin/bash - -# replace {release} in a sources.list template with the value of $release - - -# $1 is the class name used -# $2 is the path to the file copied - -# check if a variable of the form {varname} was used at all -grep -q '{' $2 || exit 0 - -if [ -z "$release" ]; then - echo "\$release is undefined. No substitution performed in $2." - exit 0 -fi - -sed -i -e "s/{release}/$release/g" $2 diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/default/grub.d/10_cloud_disable_net.ifnames.cfg/CLOUD fai-5.9.4ubuntu1/examples/simple/files/etc/default/grub.d/10_cloud_disable_net.ifnames.cfg/CLOUD --- fai-5.3.6ubuntu1/examples/simple/files/etc/default/grub.d/10_cloud_disable_net.ifnames.cfg/CLOUD 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/default/grub.d/10_cloud_disable_net.ifnames.cfg/CLOUD 2018-03-10 20:02:12.000000000 +0000 @@ -0,0 +1,6 @@ +# Disable systemd's network interface name management. +# References: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863385 +# https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ + +GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT net.ifnames=0" diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/dhcp/dhcpd.conf/FAISERVER fai-5.9.4ubuntu1/examples/simple/files/etc/dhcp/dhcpd.conf/FAISERVER --- fai-5.3.6ubuntu1/examples/simple/files/etc/dhcp/dhcpd.conf/FAISERVER 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/dhcp/dhcpd.conf/FAISERVER 2020-04-27 02:48:18.000000000 +0000 @@ -15,7 +15,12 @@ # option ntp-servers faiserver; server-name faiserver; next-server faiserver; - filename "fai/pxelinux.0"; + if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00000" { + filename "fai/pxelinux.0"; + } + if substring(option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00007" { + filename "fai/syslinux.efi"; + } allow unknown-clients; pool { range 192.168.33.100 192.168.33.150; diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/fai/apt/sources.list/FAISERVER fai-5.9.4ubuntu1/examples/simple/files/etc/fai/apt/sources.list/FAISERVER --- fai-5.3.6ubuntu1/examples/simple/files/etc/fai/apt/sources.list/FAISERVER 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/fai/apt/sources.list/FAISERVER 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -deb http://httpredir.debian.org/debian stretch main contrib non-free -deb http://security.debian.org/debian-security stretch/updates main contrib non-free - -# repository that may contain newer fai packages for stretch -deb [trusted=yes] http://fai-project.org/download stretch koeln diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/fai/nfsroot.conf/FAISERVER fai-5.9.4ubuntu1/examples/simple/files/etc/fai/nfsroot.conf/FAISERVER --- fai-5.3.6ubuntu1/examples/simple/files/etc/fai/nfsroot.conf/FAISERVER 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/fai/nfsroot.conf/FAISERVER 2020-04-27 02:48:18.000000000 +0000 @@ -1,13 +1,13 @@ # For a detailed description see nfsroot.conf(5) # " " for debootstrap -FAI_DEBOOTSTRAP="stretch http://httpredir.debian.org/debian" +FAI_DEBOOTSTRAP="buster http://deb.debian.org/debian" FAI_ROOTPW='$1$kBnWcO.E$djxB128U7dMkrltJHPf6d1' NFSROOT=/srv/fai/nfsroot TFTPROOT=/srv/tftp/fai NFSROOT_HOOKS=/etc/fai/nfsroot-hooks/ -FAI_DEBOOTSTRAP_OPTS="--exclude=info --include=aptitude" +FAI_DEBOOTSTRAP_OPTS="--exclude=info" # Configuration space FAI_CONFIGDIR=/srv/fai/config diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/init.d/expand-root/GCE fai-5.9.4ubuntu1/examples/simple/files/etc/init.d/expand-root/GCE --- fai-5.3.6ubuntu1/examples/simple/files/etc/init.d/expand-root/GCE 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/init.d/expand-root/GCE 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -#!/bin/bash -### BEGIN INIT INFO -# Provides: expand-root -# Required-Start: -# Required-Stop: -# Should-Start: -# Should-Stop: -# Default-Start: 2 3 4 5 -# Default-Stop: -# Description: Expand the filesystem of the mounted root volume/partition to its maximum possible size -### END INIT INFO - -prog=$(basename $0) -logger="logger -t $prog" - -growpart="growpart" - -hash $growpart 2> /dev/null || { - $logger "$growpart was not found on PATH. Unable to expand size." - exit 1 -} - -root_device_path="/dev/sda" -root_index="1" - -# Growpart can fail if the partition is already resized. -$growpart $root_device_path $root_index || { - $logger "growpart failed. Unable to expand size." -} - -device_path="${root_device_path}${root_index}" -filesystem=$(blkid -s TYPE -o value ${device_path}) - -case $filesystem in - xfs) xfs_growfs / ;; - ext2) resize2fs $device_path ;; - ext3) resize2fs $device_path ;; - ext4) resize2fs $device_path ;; - *) $logger "The filesystem $filesystem was not recognized. Unable to expand size." ;; -esac diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/rc.local/CLOUD fai-5.9.4ubuntu1/examples/simple/files/etc/rc.local/CLOUD --- fai-5.3.6ubuntu1/examples/simple/files/etc/rc.local/CLOUD 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/rc.local/CLOUD 2020-04-27 02:48:18.000000000 +0000 @@ -1,7 +1,7 @@ #! /bin/bash # regenerate ssh_host keys -ls /etc/ssh/ssh_host_* > /dev/null +ls /etc/ssh/ssh_host_* >/dev/null 2>&1 if [ $? -ne 0 ]; then dpkg-reconfigure -fnoninteractive openssh-server fi diff -Nru fai-5.3.6ubuntu1/examples/simple/files/etc/rc.local/FAISERVER fai-5.9.4ubuntu1/examples/simple/files/etc/rc.local/FAISERVER --- fai-5.3.6ubuntu1/examples/simple/files/etc/rc.local/FAISERVER 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/files/etc/rc.local/FAISERVER 2020-04-27 02:48:18.000000000 +0000 @@ -10,7 +10,7 @@ set -o pipefail # setup network -nic=$(grep iface /etc/network/interfaces| awk '{print $2}'|egrep -v ^lo) +nic=$(awk '/iface/ {print $2}' /etc/network/interfaces |egrep -v ^lo) ifup $nic # regenerate ssh_host keys ls /etc/ssh/ssh_host_* > /dev/null @@ -18,7 +18,7 @@ dpkg-reconfigure -fnoninteractive openssh-server fi sleep 8 -[ -x /etc/init.d/nscd ] && /etc/init.d/nscd restart +[ -x /etc/init.d/nscd ] && invoke-rc.d nscd restart echo "=================================" echo "Setting up the FAI install server" @@ -33,7 +33,7 @@ mkdir -p $FAI_CONFIGDIR cp -a /usr/share/doc/fai-doc/examples/simple/* $FAI_CONFIGDIR ainsl /srv/fai/config/class/FAIBASE.var "^LOGUSER=fai" - myip=$(ip addr show up| grep -w inet | cut -d t -f 2 | cut -d ' ' -f 2 | cut -d / -f 1 | grep -v 127.0.0.1) + myip=$(ip addr show up| grep -P -o '(?<=inet )[^/]+' | grep -v 127.0.0.1) echo "APTPROXY=http://$myip:3142" >> /srv/fai/config/class/DEBIAN.var fi # set the LOGUSER, wo we get all the logs from our install clients @@ -79,7 +79,7 @@ fai-chboot -o default # create a template for booting the installation -fai-chboot -Iv -f verbose,sshd,createvt,menu -u nfs://faiserver/srv/fai/config jessie.tmpl +fai-chboot -Iv -f verbose,sshd,createvt,menu -u nfs://faiserver/srv/fai/config buster.tmpl # Since we do not know the MAC address, our DHCP cannot provide the hostname. # Therefore we do explicitly set the hostname diff -Nru fai-5.3.6ubuntu1/examples/simple/hooks/debconf.IMAGE fai-5.9.4ubuntu1/examples/simple/hooks/debconf.IMAGE --- fai-5.3.6ubuntu1/examples/simple/hooks/debconf.IMAGE 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/hooks/debconf.IMAGE 2020-04-27 02:48:18.000000000 +0000 @@ -8,7 +8,7 @@ # I use this tar command to create the image of an already running and configured machine # tar -cf /tmp/IMAGE.tar --exclude /tmp/\* --exclude /run/\* --exclude /proc/\* --exclude /sys/\* --exclude /dev/\* / -# add --xattrs --selinux --acl if needed (for CentOS 7) +# add --xattrs --selinux --acls if needed (for CentOS 7) # Then copy this image to /srv/fai/config/basefiles/IMAGE.tar and make sure your client belongs to the class IMAGE skiptask extrbase debconf repository updatebase instsoft diff -Nru fai-5.3.6ubuntu1/examples/simple/hooks/instsoft.DEBIAN fai-5.9.4ubuntu1/examples/simple/hooks/instsoft.DEBIAN --- fai-5.3.6ubuntu1/examples/simple/hooks/instsoft.DEBIAN 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/hooks/instsoft.DEBIAN 2020-04-27 02:48:18.000000000 +0000 @@ -11,7 +11,6 @@ # 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 diff -Nru fai-5.3.6ubuntu1/examples/simple/hooks/savelog.LAST.sh fai-5.9.4ubuntu1/examples/simple/hooks/savelog.LAST.sh --- fai-5.3.6ubuntu1/examples/simple/hooks/savelog.LAST.sh 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/hooks/savelog.LAST.sh 2020-04-27 02:48:18.000000000 +0000 @@ -52,9 +52,10 @@ kernel-patch-badram kolab-webadmin kolabadmin -gstreamer0.10-plugins-really-bad +gstreamer.\+-plugins-really-bad liberrors.so liberrors-samba +libsamba-errors gsambad libad libtest-nowarnings-perl @@ -63,6 +64,7 @@ zope-ploneerrorreporting libroxen-errormessage liberror-perl +perl-Error libgpg-error-dev libgpg-error0 Opts:.\+errors=remount @@ -80,7 +82,7 @@ (floppy), sector 0 mount version older than kernel Can't locate module -Warning only 896MB will be used. +Warning only .\+MB will be used. hostname: Host name lookup failure I can't tell the difference. warning, not much extra random data, consider using the -rand option @@ -118,6 +120,7 @@ However, I can not read the target: Warning: The partition table looks like it was made task_error=0 +task_local_error=0 ^info: Trying to set warning: /usr/lib/X11/fonts can't read /etc/udev/rules.d/z25_persistent-net.rules @@ -150,16 +153,43 @@ can't initialize ip6tables table Authentication warning overridden 41-warning.sh +PCCT header not found +Download is performed unsandboxed as root as file update-alternatives: warning: skip creation of loop: module verification failed: signature Warning: apt-key output should not be parsed WARNING: Failed to connect to lvmetad. Falling back to device scanning +Warning: The home dir /var/lib/usbmux you specified +diff: /var/lib/apparmor/profiles/.apparmor.md5sums: No such file or directory +error reporting disabled +Enabling Firmware First mode for corrected errors +errors: 0 + 0 errors +Memory Error Correction: +Memory Controller 0 - Channel . Error +IIO RAS/Control Status/Global Errors +RAS: Correctable Errors collector initialized +__stack_chk_fail +grub.cfg.new: Directory nonexistent +can't derive routing for PCI INT A +failed to load isci/isci_firmware.bin +Direct firmware load for isci/isci_firmware.bin failed with error +Loading user firmware failed, using default values +stunnel4 you specified can't be accessed: No such file or directory +install-docs --verbose --check file_name' may give more details about the above errors +cannot open '/etc/ssl/certs/java/cacerts' for reading: No such file or directory +can't claim BAR +disabling ASPM +data block query control method not found +subprocess.py.\+RuntimeWarning: line buffering +Resource conflict.\+ found update-rc.d: warning: start and stop actions are no longer supported" # add pattern on some conditions if [ -n $FAI_ALLOW_UNSIGNED ] ; then globalignorepatterns="$globalignorepatterns WARNING: untrusted versions +WARNING: The following packages cannot be authenticated Ignoring these trust violations" fi # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru fai-5.3.6ubuntu1/examples/simple/hooks/updatebase.CENTOS fai-5.9.4ubuntu1/examples/simple/hooks/updatebase.CENTOS --- fai-5.3.6ubuntu1/examples/simple/hooks/updatebase.CENTOS 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/hooks/updatebase.CENTOS 2020-04-27 02:48:18.000000000 +0000 @@ -11,4 +11,15 @@ $ROOTCMD yum -y update >> $LOGDIR/software.log fi +$ROOTCMD systemd-machine-id-setup + +cat > $target/etc/sysconfig/kernel < $target/etc/apt/sources.list # external mirror -deb MIRRORURL $ubuntudist main restricted universe multiverse -deb MIRRORURL $ubuntudist-updates main restricted universe multiverse -deb MIRRORURL $ubuntudist-security main restricted universe multiverse +deb $ubuntumirror/ubuntu $ubuntudist main restricted universe multiverse +deb $ubuntumirror/ubuntu $ubuntudist-updates main restricted universe multiverse +deb $ubuntumirror/ubuntu $ubuntudist-security main restricted universe multiverse EOM -# determine a fast mirror for Ubuntu -list=$(curl -s http://mirrors.ubuntu.com/mirrors.txt) -mirror=$(netselect $list | awk '{print $2}') -sed -i -e "s#MIRRORURL#$mirror#" $target/etc/apt/sources.list + +# https://lists.uni-koeln.de/pipermail/linux-fai/2016-July/011398.html +# In Ubuntu 16.04 (but not 14.04), the locales configuration mechanism has +# changed. There is a /var/lib/dpkg/info/locales.config file, which +# overrides /var/lib/dpkg/info/locales.postinst and consults +# /var/lib/locales/supported.d/local instead of the debconf system. (See +# the code in /usr/share/debconf/frontend that prefers locales.config.) This +# hook applies the debconf setting. It must run after FAI's debconf task +# but before dpkg gets a chance to clobber debconf with an empty setting. + +if [ ! -f "$target/var/lib/locales/supported.d/local" ]; then + $ROOTCMD debconf --owner=locales sh -c ' + . /usr/share/debconf/confmodule + db_version 2.0 + db_get locales/locales_to_be_generated && + mkdir -p /var/lib/locales/supported.d && + echo "$RET" > /var/lib/locales/supported.d/local' && + $ROOTCMD dpkg-reconfigure locales +fi diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/CENTOS fai-5.9.4ubuntu1/examples/simple/package_config/CENTOS --- fai-5.3.6ubuntu1/examples/simple/package_config/CENTOS 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/CENTOS 2020-04-27 02:48:18.000000000 +0000 @@ -1,16 +1,20 @@ -PACKAGES yumgroup +PACKAGES dnfgroup core +minimal-environment +#server-product-environment +#headless-management -PACKAGES yumgroup XORG -#gnome-desktop base-x # slc5/CentOS 5 -#basic-desktop x11 fonts #slc6/CentOS 6 -gnome-desktop # CentOS 7 +PACKAGES dnfgroup XORG +graphical-server-environment +workstation-product-environment -PACKAGES yumi -authconfig +PACKAGES dnfi +NetworkManager +chrony kernel -# sysvinit-tools grub # CentOS 5 and 6 -grub2 # CentOS 7 +dracut +grub2-pc +# CentOS 7 less openssh openssh-clients @@ -18,14 +22,9 @@ vim-enhanced man curl -screen unzip which -nfs-utils -pakchois -ncurses-base # currently missing in the base file +ncurses ncurses-base -#sendmail # only for C5 and C6 - -PACKAGES yumi LVM +PACKAGES dnfi LVM lvm2 diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/DEBIAN fai-5.9.4ubuntu1/examples/simple/package_config/DEBIAN --- fai-5.3.6ubuntu1/examples/simple/package_config/DEBIAN 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/DEBIAN 2020-04-27 02:48:18.000000000 +0000 @@ -1,5 +1,27 @@ +PACKAGES install-norec +apt-transport-https # is only needed for stretch +debconf-utils +file +less +linuxlogo +rsync +openssh-client openssh-server +time +procinfo +nullmailer +eject +locales +console-setup kbd +pciutils usbutils +unattended-upgrades + +PACKAGES install NONFREE +# you may want these non-free kernel drivers +firmware-bnx2 firmware-bnx2x firmware-realtek +firmware-linux-nonfree + PACKAGES install I386 -linux-image-686-pae initramfs-tools +linux-image-686-pae memtest86+ PACKAGES install CHROOT @@ -7,11 +29,12 @@ linux-image-amd64- PACKAGES install AMD64 -linux-image-amd64 initramfs-tools +linux-image-amd64 memtest86+ -PACKAGES install DHCPC -isc-dhcp-client +PACKAGES install ARM64 +grub-efi-arm64 +linux-image-arm64 PACKAGES install GRUB_PC grub-pc @@ -23,4 +46,4 @@ lvm2 PACKAGES install CLOUD -locales-all +unattended-upgrades diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/DEBIAN.asc fai-5.9.4ubuntu1/examples/simple/package_config/DEBIAN.asc --- fai-5.3.6ubuntu1/examples/simple/package_config/DEBIAN.asc 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/DEBIAN.asc 1970-01-01 00:00:00.000000000 +0000 @@ -1,687 +0,0 @@ -# gpg key of fai-project.org repository: 4096R/074BCDE4 - ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.12 (GNU/Linux) - -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 -Bjx0CB7rV1AiU3+Nw/9SRlg2peJGhoi9yIhaLcnmNzLP24E48hhZBx3zf050gmcY -Dwsy+mKQI0iE9VMlLYFbng8KzEKOCX+G7Tzs48ItQ6dn9y3SkV5YIaJEAIpYNa+/ -xry1ARSXviZxJCfsx5YH108/DI9aPLThX34n4fUBGpPDR90wxokC8AQTAQoA2gUC -UgoEBsASGmh0dHA6Ly9tYXJ0aW4ta3JhZmZ0Lm5ldC9ncGcvY2VydC1wb2xpY3kv -NTVjOTg4MmQ5OTliYmNjNC8yMDA5MDcxMjE4MzM/c2hhNTEyc3VtPWYzM2IxN2M5 -YWY1MTViZDk4YjI5MjdjYjQ1M2E5OTJkM2Q3NTAwZTlmNjcxOTY2NjE2ZTkwNTEw -Yjk5NDA4OTUxMDhkMjQxNjQ4ZDFhMGViNDZiMzJiY2JmMzI1MWExMzZhNmVlMWUy -Mjc1NzQ1ZTExYmIzMjhjMTRlN2U3MjYzAAoJEFXJiC2Zm7zEE1EP/1QC4Meh6+1N -xVnnr3/DTbEg0kzYCV/BkYr9F7ELyb3j8djzjujKPQDVmrQhqMIVjkJnkpUOnr1A -QHweMDdWwN0XSPyFiiOqVKvzTHg5+DxVUWr8mVqr83nuNcgkSjrYgs7WAAQutpFw -5KOhxMhZocLIXq5wckW3FcrkVCA67hnG8JFovgD2GSCEGbpVM8yDzo4TGIcZt8Vt -SxbEnfjGMZoQZ5IxowPMAWc52sz9VNFK1xU3cO30pcTr15LogZbZLnUb88nfHr88 -fvEAeIFGVMchaP2IWo0LShVSfThf1YhNC35E+RQjfzK1gaLiUkgVaj5+cEfnvcjp -dhFrZNMTCdo8bAllxMxldZkZlaLJPXFxx8LlsDzZPClHSTqfDUA9IUj+q4bsGdq9 -n6dYUGJcTZ83ohhZqE1wHyuSzhCgBClPvpe9Hpvpfxnpm+wDC6xJkdn9rA2CjDmB -3vUH5vKuZQ9jLj7Dp7K/4BTUPcRMn5Gg/eyHR9dNKAF31lydo/nZIGOaqUIXdXkC -ktKlAkPgrW4vUcF3Nxx4kDDNoaw/RK1hekEPVMKMwRiMQ/xw6ltfiAeqRIaYZXod -rVJZLznov22d7Wvv0tSaV6ACc0dKq7xf5qNOakiz5q9JrQUdAV6XctQCfOcup0/+ -gBfGF/4WChaHYzH+7bevnxk7ZkoozhSRiQIcBBABCAAGBQJSChWAAAoJEK7IKHSd -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 -mrrwI2VHtBVOyb18Nb8+o1xOy/4nk5q5JxznNA6e/X5QkUklz9To2gQ1HvbUU24q -hUE5h0JniyTay6zl7CP4I5TT/MMDkZ9jBLuoUT7NL8BHmR9n3hNQyTh401nInVsE -DbHi3DWbiOEBmnFdKA1MkSRu/vFL90trpA7rt8UmXbXbd3ijWKCc1cREX3DmWP13 -xDTL0xVfdtiNINY8f4QuG5JDF61nTaLF4wyPz/no96zFzrjper5zMJ3clcCWiQIc -BBABAgAGBQJSCVHtAAoJEIMBYBQlHR2wd9gP/j3abEoMu1PYsFehQYnwdZcRmY7P -dZYCB7SagmoE4SG3avsIps8eRBfqApP7LwHaT6V+ZtF3u/FCVfFwmGyJaKmH2ZuR -z4sZPnKvhAzzGgL4NTVUnfOFw+fodQyTNeG11xFOFo3XOQz8nKNXh4M404jPde1F -E+4jerOqjM4bDOpZNoywYiJF11cx6/pQPEETUHe5h4TxqRRKrHPuk2OK2znaNzB5 -N/sDG1smkxAUdccRkvbetEOjCeBPKmcpDM2oXZ3lysOILEnNqW1it6Zsudju0rRL -SATFY8nGkG15e+FDUkv+Uw39mkp1aXfbfqfX3Q26DeG0GotF5uFhKYm1pMQws+t3 -UkvfmCVihvxiV6gqwaR8Expc40Oa+7n51DmoKzcq/UHPUEuvtwny+GSVJE9KMl3w -hKtqHGs6bqWdE3Kmr+KnkIrBvBDibk6T8VsBPlVxUwvvNMC8J9uGi1wsRaD6KPkl -+LPcW9U1TM80s7BNzctIO39bSNx6MZBCm0lmNQ4Q0qG9ePca5o/20wJR6y3Vu6/4 -EThESDoyBgEyAKMAxWyomBmxoSS2EuikeE7/tFXoY+CDvqTgZSqYK8W1wrF7sk7L -gecpulvWtadioPoD3ZMo3mdFYwRsdpxdzOx70NzbWtiJ4bx9dnWPG9OBOlpNuFSA -fHd4SnQKR++woHNEiQIcBBABCAAGBQJSCWkzAAoJED9qGiAYq/jD31wQAIub6DCa -pCtHWLru7ytWTmVQ04yBalq10TEs3FwTcjgFVDEC1SO8H8woryPhXPhHB4r8xush -aHLgGjJ2kUqoI/1WTiMzi5L6xQIJQ/hreFNl2LU2bs02Ysncf660S8uYQIxBbcpx -jrFpouNhOM2tLdBenNdzuv5QnSnbiBTOzOXctf2ILWQa4r47KdUXdBpK2U2/pwoq -+GCTPJLymUs2zLlMWXCZhDQUaHQ9/7QVwFpjdi/gcIvJJ2DSEyIB5zjpZ3SQSz6s -GjBLdKJFWw6qHCf//ithAOSZH3YY4To4jGYMVkXD4GgoeZEmHQNYtdv2p5mnmw1T -ORApJRh0iA+vAGg7EMDKFAsqtxRNxPmjGeLRAxc3jqFFPw4rUdpBhaYvcXJE/7Ad -U+O8nzZMXqkbCX+14ICC2JDxR7n+HnP6/KZ7E0aB/xRpYUL2yBUvCqk8aOTiXxGX -Mf85e2GvDk1UdfiAe27qN9eCxpMX/nSfvyH+6M0CQLVeoJjZsqshHMLk4f+lsINw -HKstBM4tMOOEKtYKsCZ4Tnk3+b4xYsF4HftDLEsEYJQaJg3s3Ajfn2p61KDtxTkd -6njl8v+mJldqTvTrzqNIf/VFKgRavLcVOcsMc69TFZeVevwPsJWS/oZuHFPFkx5H -TeLF7fJmOf/ki+uboFYscCK261sb9pJoV2UTiEYEEBEIAAYFAlIJaUUACgkQGc/R -GrFqUYNMlQCffJpk47YGn4L1/U73qi4e6cu0IosAnROJEn49yaRNXejzOsYCgUQf -nAZmiEYEEBEIAAYFAlIJbKQACgkQJwRJTy3zZoEHCgCeMtpU3NJBNg9z3Tq6sz1L -3P8UzIgAn3xkMycT/vhAdQrYwRiodLUalPoSiQIcBBABCAAGBQJSCWypAAoJELog -ZmLR+sd/SiYP/0xmYtSOYSN00cKsyiHSAqvx+n/iGjsi7gvdI0NS3HI/3OWvw1UX -ZfuTerOvzsqo0N8WLWzlGFpuIt+fLoBNcxHwD156CUgC36X5Gex0l5v8qQQuNYsI -qxvrI2gLWPip8bKfeE6jpNxLWeEzhwzTk8Lhs6KWMjjfyw979r/0Vkvob/oqjnYC -xO1oydVwJ7SlXmU1PCC659ogwXzh9DNf60h0AFotgOiURqdswy8ImpOkIEfxJAUb -TBRTXOgELjjar5b9UGRCXJ4gI4UihTpSyPICJEMUxZLwjn6c3F9pWq5T+QGE+8Zf -PCM4ahaMKiwR79bP1O7C4rY1Lhjm0Ydev3NIyA3qWZ+Z+fALWgMEViJl3YnbKG8p -OSlhb7ihPf4KbGHAvCwnd8azJJB3/HeGwfejmaMtS1+W5u4A0Z2TTc7bmjpETATF -92qgdqbW3rMEVO49FwyV1gLtZdxJ1s3j6XUBcSsH9D+pMV0+D0iVmkXMcBerT+Xg -AAGEOJKOZU0TzOn4S/B4IhTXNxZbfXJnEVNp79ezfDqDSgPYnPuG4sctTAfGXHRe -FjPR5fQCAOVkkgQrezpOUwpXP44ozyKlEQs6d698uhJUCKcmnEviY11O8ZMQYpYr -ReWt7orepOhUtJ2WNpDgTjg4bwEjC3jFsTML7H9i5+LzzJ0YD34R7tsRiQLwBBMB -CgDaBQJSCgQGwBIaaHR0cDovL21hcnRpbi1rcmFmZnQubmV0L2dwZy9jZXJ0LXBv -bGljeS81NWM5ODgyZDk5OWJiY2M0LzIwMDkwNzEyMTgzMz9zaGE1MTJzdW09ZjMz -YjE3YzlhZjUxNWJkOThiMjkyN2NiNDUzYTk5MmQzZDc1MDBlOWY2NzE5NjY2MTZl -OTA1MTBiOTk0MDg5NTEwOGQyNDE2NDhkMWEwZWI0NmIzMmJjYmYzMjUxYTEzNmE2 -ZWUxZTIyNzU3NDVlMTFiYjMyOGMxNGU3ZTcyNjMACgkQVcmILZmbvMTaXQ/+JVjn -1Wlt8sm7wTkiKIFVxYwqDa4xTfQKFMAMO+n/LJnvAEcK77X5F121sdXKcNtBSfMQ -QrplNClqVbd9wd1ix4D0auggnGaMUtgfwP5SBOf/zrYB6w5Ej1uhdLZl5YRmqOEt -7yY61TK8fGB6i5osgJE47P6OYep28Q2qK1jOtIt6HaNkKOtmfsq0wWTg7Iq/DXHS -twozq3Wi4QTLl2QAtLhKoNrmzDg4jsPQhbXARJtTnL9eHCZTML+OtJb7aca60thZ -VxEkzSElQNikJCNtlCF5PCWCvZCwGDyAMo8UGlTgjVnIunVeAWBEva4GcJJduC1M -bFpzoQyWJXtwIwD+QC71Dhl+vlmwN3wb7qnwZ5vEb5un/010v+AdMvRXpuDJs6oc -WXOrw00Fmg0AjaD9ly0dTPTYtH8olvpUO9shDd0EXr3uNFtBgJLu+X/QGhNOEzZC -YHZL8/osVgnXNfktczEI+pcnkXa06YhA6CvFgGG7s3BDMUafNsobw2hXCj2zNGbv -8Vve4po6en+pzafTFVUnsGYREv9v3eSc6R6zb4YSYSxMXCAIS4Osq5ZnMwjTHRx3 -32AYDeGlNp3tx6dzPSBCFksCdpVQzwQYh74Z+bVx9wK/10meQYEZwgXxlngy9bb8 -b6yD5pff8hHneLkaiLwwEjQuovuO0nhJGj4PTa2JAhwEEAEIAAYFAlIKFYAACgkQ -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 -=a+eH ------END PGP PUBLIC KEY BLOCK----- Binary files /tmp/tmpOR6ynH/JU1RCkiHod/fai-5.3.6ubuntu1/examples/simple/package_config/DEBIAN.gpg and /tmp/tmpOR6ynH/YzTAW9y24a/fai-5.9.4ubuntu1/examples/simple/package_config/DEBIAN.gpg differ diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/DEMO fai-5.9.4ubuntu1/examples/simple/package_config/DEMO --- fai-5.3.6ubuntu1/examples/simple/package_config/DEMO 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/DEMO 2020-04-27 02:48:18.000000000 +0000 @@ -1,8 +1,7 @@ # some packages we need on a demo machine PACKAGES install-norec -fortune-mod fortunes -rstat-client #rstatd +htop iotop nmon # only when also class XORG is defined PACKAGES install-norec XORG diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/FAIBASE fai-5.9.4ubuntu1/examples/simple/package_config/FAIBASE --- fai-5.3.6ubuntu1/examples/simple/package_config/FAIBASE 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/FAIBASE 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -PACKAGES install-norec DEBIAN -fai-client -debconf-utils -file -less -linuxlogo -rdate -rsync -openssh-client openssh-server -time -procinfo -nullmailer -eject -locales -console-setup kbd -pciutils usbutils diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/FAISERVER fai-5.9.4ubuntu1/examples/simple/package_config/FAISERVER --- fai-5.3.6ubuntu1/examples/simple/package_config/FAISERVER 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/FAISERVER 2020-04-27 02:48:18.000000000 +0000 @@ -1,7 +1,6 @@ PACKAGES install-norec fai-quickstart -isc-dhcp-client debmirror tcpdump xorriso grub-pc lftp curl @@ -11,4 +10,4 @@ nscd psmisc bind9 dnsutils iptables-persistent -emacs24-nox +zile diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/GCE fai-5.9.4ubuntu1/examples/simple/package_config/GCE --- fai-5.3.6ubuntu1/examples/simple/package_config/GCE 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/GCE 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -PACKAGES install -google-cloud-packages-archive-keyring -cloud-initramfs-growroot -cloud-utils/$release-backports -google-cloud-sdk -google-compute-engine-$release -google-compute-engine-init-$release -google-config-$release -python-crcmod/$release-backports -screen -vim - -acpi-support-base -busybox -ca-certificates -curl -ethtool -gdisk -kpartx -isc-dhcp-client -lsb-release -ntp -parted -python -openssh-client -openssh-server -sudo -uuid-runtime diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/GCE.asc fai-5.9.4ubuntu1/examples/simple/package_config/GCE.asc --- fai-5.3.6ubuntu1/examples/simple/package_config/GCE.asc 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/GCE.asc 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -# pub 2048R/A7317B0F 2015-04-03 Google Cloud Packages Automatic Signing Key - ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -mQENBFUd6rIBCAD6mhKRHDn3UrCeLDp7U5IE7AhhrOCPpqGF7mfTemZYHf/5Jdjx -cOxoSFlK7zwmFr3lVqJ+tJ9L1wd1K6P7RrtaNwCiZyeNPf/Y86AJ5NJwBe0VD0xH -TXzPNTqRSByVYtdN94NoltXUYFAAPZYQls0x0nUD1hLMlOlC2HdTPrD1PMCnYq/N -uL/Vk8sWrcUt4DIS+0RDQ8tKKe5PSV0+PnmaJvdF5CKawhh0qGTklS2MXTyKFoqj -XgYDfY2EodI9ogT/LGr9Lm/+u4OFPvmN9VN6UG+s0DgJjWvpbmuHL/ZIRwMEn/tp -uneaLTO7h1dCrXC849PiJ8wSkGzBnuJQUbXnABEBAAG0QEdvb2dsZSBDbG91ZCBQ -YWNrYWdlcyBBdXRvbWF0aWMgU2lnbmluZyBLZXkgPGdjLXRlYW1AZ29vZ2xlLmNv -bT6JAT4EEwECACgFAlUd6rICGy8FCQWjmoAGCwkIBwMCBhUIAgkKCwQWAgMBAh4B -AheAAAoJEDdGwginMXsPcLcIAKi2yNhJMbu4zWQ2tM/rJFovazcY28MF2rDWGOnc -9giHXOH0/BoMBcd8rw0lgjmOosBdM2JT0HWZIxC/Gdt7NSRA0WOlJe04u82/o3OH -WDgTdm9MS42noSP0mvNzNALBbQnlZHU0kvt3sV1YsnrxljoIuvxKWLLwren/GVsh -FLPwONjw3f9Fan6GWxJyn/dkX3OSUGaduzcygw51vksBQiUZLCD2Tlxyr9NvkZYT -qiaWW78L6regvATsLc9L/dQUiSMQZIK6NglmHE+cuSaoK0H4ruNKeTiQUw/EGFaL -ecay6Qy/s3Hk7K0QLd+gl0hZ1w1VzIeXLo2BRlqnjOYFX4A= -=HVTm ------END PGP PUBLIC KEY BLOCK----- diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/GERMAN fai-5.9.4ubuntu1/examples/simple/package_config/GERMAN --- fai-5.3.6ubuntu1/examples/simple/package_config/GERMAN 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/GERMAN 2020-04-27 02:48:18.000000000 +0000 @@ -2,4 +2,4 @@ task-german PACKAGES install GNOME -iceweasel-l10n-de icedove-l10n-de +firefox-esr-l10n-de thunderbird-l10n-de diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/GNOME fai-5.9.4ubuntu1/examples/simple/package_config/GNOME --- fai-5.3.6ubuntu1/examples/simple/package_config/GNOME 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/GNOME 2020-04-27 02:48:18.000000000 +0000 @@ -1,10 +1,9 @@ PACKAGES install-norec -iceweasel -#icedove +firefox-esr +#thunderbird menu gdm3 gnome-core gconf-editor gnome-screensaver gnome-system-monitor gnome-system-tools -libgnomevfs2-bin network-manager-gnome diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/STANDARD fai-5.9.4ubuntu1/examples/simple/package_config/STANDARD --- fai-5.3.6ubuntu1/examples/simple/package_config/STANDARD 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/STANDARD 2019-03-26 15:32:51.000000000 +0000 @@ -0,0 +1,31 @@ +PACKAGES install-norec + +# the list of standard packages, without any libs and a few packages removed +apt-listchanges +bash-completion +bind9-host +dbus +dnsutils +doc-debian +file +gettext-base +groff-base +hdparm +less +locales +lsof +man-db +manpages +mime-support +ncurses-term +netcat-traditional +openssh-client +pciutils +perl +python +python-minimal +reportbug +telnet +traceroute +ucf +xz-utils diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/UBUNTU fai-5.9.4ubuntu1/examples/simple/package_config/UBUNTU --- fai-5.3.6ubuntu1/examples/simple/package_config/UBUNTU 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/UBUNTU 2020-04-27 02:48:18.000000000 +0000 @@ -1,21 +1,20 @@ PACKAGES install I386 -linux-image-generic initramfs-tools +linux-image-generic memtest86+ PACKAGES install CHROOT linux-image-generic- PACKAGES install AMD64 -linux-image-generic initramfs-tools +linux-image-generic memtest86+ -PACKAGES install DHCPC -isc-dhcp-client - PACKAGES install GRUB_PC grub-pc -PACKAGES install XORG -ubuntu-desktop -ubuntu-standard +PACKAGES install ubuntu-minimal +ubuntu-server + +PACKAGES install GERMAN +language-pack-gnome-de diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/XFCE fai-5.9.4ubuntu1/examples/simple/package_config/XFCE --- fai-5.3.6ubuntu1/examples/simple/package_config/XFCE 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/XFCE 2020-04-27 02:48:18.000000000 +0000 @@ -2,4 +2,5 @@ xfce4 # base system xfce4-goodies # additional tools lightdm -iceweasel +firefox-esr +network-manager-gnome diff -Nru fai-5.3.6ubuntu1/examples/simple/package_config/XORG fai-5.9.4ubuntu1/examples/simple/package_config/XORG --- fai-5.3.6ubuntu1/examples/simple/package_config/XORG 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/package_config/XORG 2020-04-27 02:48:18.000000000 +0000 @@ -1,10 +1,12 @@ PACKAGES install-norec DEBIAN xorg xserver-xorg-video-all xserver-xorg-input-all -ttf-freefont +fonts-freefont-ttf xscreensaver xscreensaver-gl xterm desktop-base -# add free and non-free firmware -#firmware-linux +PACKAGES install UBUNTU +ubuntu-server- +ubuntu-standard +ubuntu-desktop diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/10-security fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/10-security --- fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/10-security 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/10-security 2020-04-27 02:48:17.000000000 +0000 @@ -1,12 +1,10 @@ #! /bin/bash # (c) Michael Goetze, 2010-11, mgoetze@mgoetze.net -# Thomas Lange, 2015 +# Thomas Lange, 2015-2020 error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code -$ROOTCMD authconfig --enableshadow --enablemd5 \ - --enablelocauthorize --updateall $ROOTCMD usermod -p $ROOTPW root fcopy -v /etc/selinux/config diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/30-mkinitrd fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/30-mkinitrd --- fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/30-mkinitrd 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/30-mkinitrd 2020-04-27 02:48:17.000000000 +0000 @@ -10,55 +10,16 @@ version=`$ROOTCMD rpm -qv kernel | cut -d- -f2-` -use_mkinitrd() { - - # CentOS 5 uses mkinitrd - $ROOTCMD kudzu -q -k $version - # Unfortunately mkinitrd is horrible at guessing which modules to include, - # especially when the running kernel is different than the kernel for which - # we are creating an initrd... - - drivers="" - for bus in pci virtio; do - for dr in `$ROOTCMD kudzu -p -k $version -b $bus|grep driver:|cut -d' ' -f2|sort -u`; do - found=`find $target/lib/modules/$version/ -name $dr.ko 2>/dev/null` - if [ -n "$found" ]; then - # add driver only if it's available as .ko module in the destination kernel - drivers+=" --with=$dr" - fi - done - done - - $ROOTCMD mkinitrd -f -v $drivers /boot/initrd-$version.img $version - - if [ $? -eq 1 ]; then - echo "WARNING: generating initrd with list of drivers failed. Trying without." - $ROOTCMD mkinitrd -f -v /boot/initrd-$version.img $version - fi -} - -# CentOS 5 uses mkinitrd -if [ -f $target/sbin/mkinitrd ]; then - use_mkinitrd -fi if [ -f $target/etc/lvm/lvm.conf ]; then sed -i -e 's/use_lvmetad = 1/use_lvmetad = 0/' $target/etc/lvm/lvm.conf ainsl -av /etc/dracut.conf.d/fai.conf 'add_dracutmodules+=" lvm "' fi -# call dracut for CentOS 7 -if [ -f $target/usr/sbin/dracut ]; then - # add filesystem driver into initrd - ainsl -av /etc/dracut.conf.d/fai.conf 'filesystems+="ext4"' - $ROOTCMD dracut -v --kver $version --force -fi -# call dracut for CentOS 6 -if [ -f $target/sbin/dracut ]; then - # add filesystem driver into initrd - ainsl -av /etc/dracut.conf.d/fai.conf 'filesystems+="ext4"' - $ROOTCMD dracut -v $version -fi +# add filesystem driver into initrd +ainsl -av /etc/dracut.conf.d/fai.conf 'filesystems+="ext4"' +$ROOTCMD dracut -v --kver $version --force + exit $error diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/60-network-scripts fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/60-network-scripts --- fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/60-network-scripts 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/60-network-scripts 2020-04-27 02:48:17.000000000 +0000 @@ -1,29 +1,37 @@ #! /bin/bash -# (c) Michael Goetze, 2011, mgoetze@mgoetze.net - error=0 ; trap "error=$((error|1))" ERR -# Note: Kudzu will automatically configure eth0 for DHCP -if [ $FAI_ACTION != "softupdate" ] && ! ifclass DHCPC -then - ainsl -v /etc/sysconfig/network "^GATEWAY=$GATEWAYS_1\$" - [ -n "$IPADDR" ] && cat > $target/etc/sysconfig/network-scripts/ifcfg-eth0 <<-EOF + +# determine predictable network names +fields="ID_NET_NAME_FROM_DATABASE ID_NET_NAME_ONBOARD ID_NET_NAME_SLOT ID_NET_NAME_PATH" +for field in $fields; do + name=$(udevadm info /sys/class/net/$NIC1 | sed -rn "s/^E: $field=(.+)/\1/p") + if [[ $name ]]; then + NIC1=$name + break + fi +done +if [[ ! $name ]]; then + echo "$0: error: could not find systemd predictable network name. Using $NIC1." +fi + + +if [ $FAI_ACTION != "softupdate" ] && ifclass DHCPC; then + cat > $target/etc/sysconfig/network-scripts/ifcfg-$NIC1 <<-EOF # generated by FAI - DEVICE=eth0 - BOOTPROTO=static + TYPE=Ethernet + PROXY_METHOD=none + BOOTPROTO=dhcp + DEFROUTE=yes + BROWSER_ONLY=no + IP4_FAILURE_FATAL=no + IPV6INIT=no + IPV6_AUTOCONF=no + NAME=$NIC1 + DEVICE=$NIC1 ONBOOT=yes - HWADDR=`ip l sh dev eth0 | tail -1 | cut -d" " -f6` - IPADDR=$IPADDR - NETMASK=$NETMASK EOF - # Kudzu for some reason won't write eth0 into /etc/sysconfig/hwconf - # from within the chroot. The following hack puts it in there - # so that Kudzu doesn't overwrite our config on first boot. - if [ -f $target/sbin/kudzu ]; then - grep eth0 $target/etc/sysconfig/hwconf || $ROOTCMD kudzu -c NETWORK -p \ - >> $target/etc/sysconfig/hwconf - fi fi fcopy -iv /etc/sysconfig/network /etc/resolv.conf /etc/networks diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/80-misc fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/80-misc --- fai-5.3.6ubuntu1/examples/simple/scripts/CENTOS/80-misc 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/CENTOS/80-misc 2020-04-27 02:48:17.000000000 +0000 @@ -2,10 +2,12 @@ error=0 ; trap "error=$((error|1))" ERR -# add a demo user account -if ! $ROOTCMD getent passwd demo ; then - $ROOTCMD adduser -c "fai demo user" demo - $ROOTCMD usermod -p "$ROOTPW" demo +# add a $username user account +if [ -n "$username" ]; then + if ! $ROOTCMD getent passwd $username ; then + $ROOTCMD adduser -c "$username user" $username + $ROOTCMD usermod -p "$USERPW" $username + fi fi # enable graphical login screen, make run level 5 as default diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/CLOUD/10-network fai-5.9.4ubuntu1/examples/simple/scripts/CLOUD/10-network --- fai-5.3.6ubuntu1/examples/simple/scripts/CLOUD/10-network 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/CLOUD/10-network 2018-03-10 20:02:12.000000000 +0000 @@ -0,0 +1,11 @@ +#!/bin/bash + +error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code + +# Disable systemd's network interface name management. +# References: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863385 +# https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ + +fcopy -M /etc/default/grub.d/10_cloud_disable_net.ifnames.cfg +$ROOTCMD update-grub diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/CLOUD/99-cleanup fai-5.9.4ubuntu1/examples/simple/scripts/CLOUD/99-cleanup --- fai-5.3.6ubuntu1/examples/simple/scripts/CLOUD/99-cleanup 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/CLOUD/99-cleanup 2020-04-27 02:48:17.000000000 +0000 @@ -11,7 +11,14 @@ ainsl -a /etc/modprobe.d/blacklist.conf 'blacklist pcspkr' ainsl -a /etc/modprobe.d/blacklist.conf 'blacklist floppy' -rm -f $target/etc/resolv.conf $target/etc/udev/rules.d/70-persistent-net.rules $target/lib/udev/write_net_rules +rm -f $target/etc/resolv.conf \ + $target/etc/udev/rules.d/70-persistent-net.rules \ + $target/lib/udev/write_net_rules \ + $target/etc/mailname \ + $target/var/lib/dbus/machine-id + +> $target/etc/machine-id + shred --remove $target/etc/ssh/ssh_host_* # FIXME: DHCP RFC3442 is used incorrect in Azure diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/DEBIAN/10-rootpw fai-5.9.4ubuntu1/examples/simple/scripts/DEBIAN/10-rootpw --- fai-5.3.6ubuntu1/examples/simple/scripts/DEBIAN/10-rootpw 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/DEBIAN/10-rootpw 2020-04-27 02:48:17.000000000 +0000 @@ -3,7 +3,13 @@ error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code # set root password -$ROOTCMD usermod -p "$ROOTPW" root +if [ -n "$ROOTPW" ]; then + $ROOTCMD usermod -p "$ROOTPW" root +else + $ROOTCMD usermod -L root + # enable sudo for user + ainsl /etc/sudoers "$username ALL = ALL" +fi exit $error diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/DEBIAN/30-interface fai-5.9.4ubuntu1/examples/simple/scripts/DEBIAN/30-interface --- fai-5.3.6ubuntu1/examples/simple/scripts/DEBIAN/30-interface 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/DEBIAN/30-interface 2020-04-27 02:48:17.000000000 +0000 @@ -1,58 +1,121 @@ #! /bin/bash -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 + local name [ $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 name=$(udevadm info /sys/class/net/$NIC1 | sed -rn "s/^E: $field=(.+)/\1/p") if [[ $name ]]; then NIC1=$name - break + return fi done - if [[ ! $name ]]; then + + # try to get altname net dev + name=$(ip link show $NIC1 | awk '/altname / { print $2 }') + if [[ $name ]]; then + NIC1=$name + return + else echo "$0: error: could not find systemd predictable network name. Using $NIC1." fi } -newnicnames +if [ -z "$NIC1" ]; then + echo "WARNING: \$NIC1 is not defined. Cannot add ethernet to /etc/network/interfaces." +fi CIDR=$(ip -o -f inet addr show $NIC1 | awk '{print $4}') -if ifclass DHCPC && [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ]; then +newnicnames - cat > $target/etc/network/interfaces <<-EOF - # generated by FAI - auto lo $NIC1 - iface lo inet loopback - iface $NIC1 inet dhcp -EOF -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 +case "$FAI_ACTION" in + install|dirinstall) + ifclass DHCPC && METHOD=dhcp || METHOD=static + ifclass XORG && RENDERER=NetworkManager || RENDERER=networkd + + 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 + else + ( + iface_stanza lo loopback + iface_stanza $NIC1 $METHOD + ) > $target/etc/network/interfaces fi -fi + + 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 + ;; +esac # here fcopy is mostly used, when installing a client for running in a # different subnet than during the installation diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/DEBIAN/40-misc fai-5.9.4ubuntu1/examples/simple/scripts/DEBIAN/40-misc --- fai-5.3.6ubuntu1/examples/simple/scripts/DEBIAN/40-misc 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/DEBIAN/40-misc 2020-04-27 02:48:17.000000000 +0000 @@ -28,7 +28,12 @@ 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 $target/bin/systemd-machine-id-setup ]; then $ROOTCMD systemd-machine-id-setup fi @@ -36,13 +41,11 @@ rm -f $target/etc/dpkg/dpkg.cfg.d/fai $target/etc/dpkg/dpkg.cfg.d/unsafe-io -if [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ] ; then - [ -f /etc/fai/fai.conf ] && cp /etc/fai/fai.conf $target/etc/fai/fai.conf +if [ -d /etc/fai ]; then + if ! fcopy -Mv /etc/fai/fai.conf; then + ainsl -a /etc/fai/fai.conf "FAI_CONFIG_SRC=$FAI_CONFIG_SRC" + fi fi - -ainsl -a /etc/fai/fai.conf "FAI_CONFIG_SRC=$FAI_CONFIG_SRC" - -fcopy -Miv /etc/fai/fai.conf fcopy -iv /etc/rc.local exit $error diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/DEMO/10-misc fai-5.9.4ubuntu1/examples/simple/scripts/DEMO/10-misc --- fai-5.3.6ubuntu1/examples/simple/scripts/DEMO/10-misc 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/DEMO/10-misc 2020-04-27 02:48:17.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/bash -# (c) Thomas Lange, 2001-2013, lange@debian.org +# (c) Thomas Lange, 2001-2017, lange@debian.org error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code @@ -14,11 +14,26 @@ $ROOTCMD addgroup --system sambashare || true fi -# add a demo user account -if ! $ROOTCMD getent passwd demo ; then - $ROOTCMD adduser --disabled-login --gecos "fai demo user" demo - $ROOTCMD usermod -p "$ROOTPW" demo - for g in $groups; do - $ROOTCMD adduser demo $g - done +# add additional user account +if [ -n "$username" ]; then + if ! $ROOTCMD getent passwd $username ; then + $ROOTCMD adduser --disabled-login --gecos "$username user" $username + $ROOTCMD usermod -p "$USERPW" $username + userdir=$($ROOTCMD getent passwd "$username" | cut -d: -f6 ) + + # disable xfce question about default or empty panel + if [ -f $target/etc/xdg/xfce4/panel/default.xml ]; then + xfdir=$userdir/.config/xfce4/xfconf/xfce-perchannel-xml + if [ ! -d $target/$xfdir ]; then + $ROOTCMD mkdir -p $xfdir + $ROOTCMD cp /etc/xdg/xfce4/panel/default.xml $xfdir/xfce4-panel.xml + # group name is the same as user name + $ROOTCMD chown -R $username.$username $userdir/.config + fi + fi + + for g in $groups; do + $ROOTCMD adduser $username $g + done + fi fi diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/FAIBASE/10-misc fai-5.9.4ubuntu1/examples/simple/scripts/FAIBASE/10-misc --- fai-5.3.6ubuntu1/examples/simple/scripts/FAIBASE/10-misc 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/FAIBASE/10-misc 2020-04-27 02:48:17.000000000 +0000 @@ -11,15 +11,14 @@ cp -f /usr/share/zoneinfo/${TIMEZONE} $target/etc/localtime fi +if [ -f $target/etc/hosts.orig ]; then + mv $target/etc/hosts.orig $target/etc/hosts +fi if [ -n "$IPADDR" ]; then ifclass DHCPC || ainsl -s /etc/hosts "$IPADDR $HOSTNAME.$DOMAIN $HOSTNAME" else ifclass DHCPC && ainsl -s /etc/hosts "127.0.0.1 $HOSTNAME" fi - -if [ -f $target/etc/hosts.orig ]; then - mv $target/etc/hosts.orig $target/etc/hosts -fi fcopy -iM /etc/hosts /etc/motd # make /root accessible only by root @@ -28,6 +27,10 @@ # copy default dotfiles for root account fcopy -ir /root +# use tmpfs for /tmp if not defined in disk_config +if ! grep -Pq '\s/tmp\s' $target/etc/fstab; then + ainsl /etc/fstab "tmpfs /tmp tmpfs nodev,nosuid,size=50%,mode=1777 0 0" +fi chmod -c 1777 ${target}/tmp chown -c 0:0 ${target}/tmp diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/FAIBASE/20-removable_media fai-5.9.4ubuntu1/examples/simple/scripts/FAIBASE/20-removable_media --- fai-5.3.6ubuntu1/examples/simple/scripts/FAIBASE/20-removable_media 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/FAIBASE/20-removable_media 2020-04-27 02:48:17.000000000 +0000 @@ -3,8 +3,6 @@ # (c) Thomas Lange, 2006,2009, lange@debian.org # create entries for removable media in fstab and directories in /media -[ -b $target/dev/fd0 ] && ainsl /etc/fstab "/dev/fd0 /media/floppy auto users,noauto 0 0" - cdromlist() { [ -f /proc/sys/dev/cdrom/info ] || return devs=$(grep 'drive name:' /proc/sys/dev/cdrom/info | cut -d ":" -f 2) diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/FAISERVER/10-conffiles fai-5.9.4ubuntu1/examples/simple/scripts/FAISERVER/10-conffiles --- fai-5.3.6ubuntu1/examples/simple/scripts/FAISERVER/10-conffiles 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/FAISERVER/10-conffiles 2020-04-27 02:48:17.000000000 +0000 @@ -1,7 +1,7 @@ #! /bin/bash -fcopy -Bvr /etc/fai -fcopy -Bv /etc/fai/apt/sources.list /etc/dhcp/dhcpd.conf +fcopy -BvrS /etc/fai +fcopy -BvS /etc/dhcp/dhcpd.conf if [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ] ; then @@ -18,7 +18,7 @@ ainsl -av /etc/apt/apt.conf.d/02proxy 'Acquire::http::Proxy "http://127.0.0.1:3142";' # create some host entries - myip=$(ip addr show up| grep -w inet | cut -d t -f 2 | cut -d ' ' -f 2 | cut -d / -f 1 | grep -v 127.0.0.1) + myip=$(ip addr show up| grep -P -o '(?<=inet )[^/]+' | grep -v 127.0.0.1) ainsl /etc/hosts "$myip faiserver" # that's me ainsl /etc/hosts "192.168.33.100 demohost" ainsl /etc/hosts "192.168.33.101 xfcehost" diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/GCE/10-misc fai-5.9.4ubuntu1/examples/simple/scripts/GCE/10-misc --- fai-5.3.6ubuntu1/examples/simple/scripts/GCE/10-misc 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/GCE/10-misc 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#! /bin/bash - -error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code - -# currently missing from bootstrap-vz: -# init.d/generate-ssh-hostkeys (currently done in rc.local/CLOUD) - -ainsl -av /etc/sysctl.d/70-disable-ipv6.conf 'net.ipv6.conf.all.disable_ipv6 = 1' -ainsl -av /etc/sysctl.d/70-disable-ipv6.conf 'net.ipv6.conf.lo.disable_ipv6 = 0' -$ROOTCMD shadowconfig on -sed -i -e 's/^#PasswordAuthentication yes/PasswordAuthentication no/' $target/etc/ssh/sshd_config -sed -i -e 's/^PermitRootLogin .*/PermitRootLogin no/' $target/etc/ssh/sshd_config -ainsl $target/etc/ssh/sshd_config 'ClientAliveInterval 420' - -rm -f $target/var/lib/apt/lists/* -rm -f $target/etc/resolv.conf diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/GRUB_EFI/10-setup fai-5.9.4ubuntu1/examples/simple/scripts/GRUB_EFI/10-setup --- fai-5.3.6ubuntu1/examples/simple/scripts/GRUB_EFI/10-setup 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/GRUB_EFI/10-setup 2020-04-27 02:48:17.000000000 +0000 @@ -33,9 +33,13 @@ exit $error fi -$ROOTCMD grub-mkdevicemap --no-floppy 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 @@ -46,15 +50,12 @@ $ROOTCMD grub-install --no-floppy --force-extra-removable "/dev/$device" done -elif [[ $GROOT =~ 'hostdisk' ]]; then - cat > $target/boot/grub/device.map < $target/boot/grub/device.map <&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 -fcopy -iM /etc/apt/sources.list +fcopy -iSM /etc/apt/sources.list setrel() { @@ -70,24 +72,32 @@ return fi - dists="jessie stretch buster xenial trusty" + dists="jessie stretch buster bullseye bookworm focal bionic xenial trusty" for d in $dists; do if grep -iq $d $target/etc/os-release; then release=$d 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 < $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 [trusted=yes] http://fai-project.org/download $release koeln +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 + # if the package fai-server was installed, enable the project's repository + if [ -f $target/var/lib/dpkg/info/fai-server.list ]; then + sed -i -e '/fai-project.org/s/^#//' $target/etc/apt/sources.list + fi +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* $FAI_RUNDIR fi exit $error diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/UBUNTU/90-apt fai-5.9.4ubuntu1/examples/simple/scripts/UBUNTU/90-apt --- fai-5.3.6ubuntu1/examples/simple/scripts/UBUNTU/90-apt 2017-04-20 15:48:56.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/UBUNTU/90-apt 2020-04-27 02:48:17.000000000 +0000 @@ -1,25 +1,11 @@ #! /bin/bash -if ifclass GERMAN; then - $ROOTCMD locale-gen LANG=de_DE.UTF-8 - $ROOTCMD update-locale LANG=de_DE.UTF-8 -else - ainsl -v /etc/locale.gen '^en_US.UTF-8 UTF-8' - $ROOTCMD locale-gen - $ROOTCMD update-locale LANG=en_US.UTF-8 -fi - # check if we already use an external mirror grep -q "external mirror" $target/etc/apt/sources.list && exit 0 cat < $target/etc/apt/sources.list # external mirror -deb MIRRORURL $ubuntudist main restricted universe multiverse -deb MIRRORURL $ubuntudist-updates main restricted universe multiverse -deb MIRRORURL $ubuntudist-security main restricted universe multiverse +deb $ubuntumirror/ubuntu $ubuntudist main restricted universe multiverse +deb $ubuntumirror/ubuntu $ubuntudist-updates main restricted universe multiverse +deb $ubuntumirror/ubuntu $ubuntudist-security main restricted universe multiverse EOM - -# determine a fast mirror for Ubuntu -list=$(curl -s http://mirrors.ubuntu.com/mirrors.txt) -mirror=$(netselect $list | awk '{print $2}') -sed -i -e "s#MIRRORURL#$mirror#" $target/etc/apt/sources.list diff -Nru fai-5.3.6ubuntu1/examples/simple/scripts/UBUNTU/91-misc fai-5.9.4ubuntu1/examples/simple/scripts/UBUNTU/91-misc --- fai-5.3.6ubuntu1/examples/simple/scripts/UBUNTU/91-misc 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/examples/simple/scripts/UBUNTU/91-misc 2019-11-08 10:05:15.000000000 +0000 @@ -0,0 +1,7 @@ +#! /bin/bash + +# disable the first login screen +$ROOTCMD dpkg-divert --local --rename --add /etc/xdg/autostart/gnome-initial-setup-first-login.desktop +$ROOTCMD dpkg-divert --local --rename --add /etc/xdg/autostart/gnome-initial-setup-copy-worker.desktop +$ROOTCMD deluser --system gnome-initial-setup +$ROOTCMD dpkg-reconfigure keyboard-configuration diff -Nru fai-5.3.6ubuntu1/lib/check-cross-arch fai-5.9.4ubuntu1/lib/check-cross-arch --- fai-5.3.6ubuntu1/lib/check-cross-arch 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/check-cross-arch 2020-02-20 21:53:09.000000000 +0000 @@ -0,0 +1,71 @@ +#! /bin/bash + +# check-cross-arch - check if qemu is needed for the target directory +# +# This script is part of FAI (Fully Automatic Installation) +# Copyright (C) 2017-2020 Thomas Lange, lange@informatik.uni-koeln.de + + +target=$1 + +# is there already a qemu-*static binary? +if [ -n "$(ls $target/usr/bin/qemu-*-static* 2>/dev/null)" ]; then + echo qemu user static already available + exit 1 +fi + + +info=$(file /bin/more) +myarch=$(expr "$info" : '.*ld-linux-\([^[:space:]]*\).so.*') +if [ -z "$myarch" ]; then + if [[ "$info" =~ "ELF 32-bit LSB shared object, Intel 80386" ]]; then + myarch=i386 + fi +fi + +# where is the more command +if [ -f $target/bin/more ]; then + _more=$target/bin/more +elif [ -f $target/usr/bin/more ]; then + _more=$target/usr/bin/more +else + echo "Cannot find more command in $target" + exit 3 +fi + +_more=$(realpath -m $_more) # handle symlink +_more=$target/${_more#$target} +info=$(file $_more) +targetarch=$(expr "$info" : '.*ld-linux-\([^[:space:]]*\).so.*') +if [ -z "$targetarch" ]; then + if [[ "$info" =~ "ELF 32-bit LSB shared object, Intel 80386" ]]; then + targetarch=i386 + fi +fi + +cross=1 +# debugging echo myarch: $myarch targetarch: $targetarch +if [ $myarch = $targetarch ]; then + cross=0 +fi + +for arch in $(dpkg --print-foreign-architectures); do + if [ $myarch = $arch ]; then + cross=0 + break + fi +done + + +if [ $cross -eq 1 ]; then + [ X$verbose = X1 ] && echo "Using qemu-$targetarch-static for cross architecture chroot." + + # if the flag F is set, we do not need the static executable inside $target + if grep -E -q --color '^flags: .*F.*' /proc/sys/fs/binfmt_misc/qemu-$targetarch; then + : + else + cp /usr/bin/qemu-$targetarch-static $target/usr/bin + fi +fi + +exit $cross diff -Nru fai-5.3.6ubuntu1/lib/dracut/80fai-autodiscover/fai-scan.sh fai-5.9.4ubuntu1/lib/dracut/80fai-autodiscover/fai-scan.sh --- fai-5.3.6ubuntu1/lib/dracut/80fai-autodiscover/fai-scan.sh 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/dracut/80fai-autodiscover/fai-scan.sh 2020-04-27 02:48:20.000000000 +0000 @@ -2,7 +2,7 @@ # autodiscover of the FAI server -# (c) Thomas Lange 2015 +# (c) Thomas Lange 2015,2017 . /lib/dracut-lib.sh @@ -26,13 +26,13 @@ scan_net() { # scan local network for FAI server - + local iprange=$1 shift local port=$1 local iplist local host - + iplist=$(nmap -n -e $nic --host-timeout 10 --open -oG - -p $port $iprange 2>/dev/null | grep -v '#' | cut -d' ' -f2 | sort -n | uniq) # check all IPs, if a faiserver is listening there @@ -70,7 +70,7 @@ fi } -iprange=$(ip addr show up | grep -w 'inet'|grep -v 127.0.0.1| cut -d t -f 2 | cut -d ' ' -f 2 |head -1) +iprange=$(ip addr show up | grep -P -o '(?<=inet )\S+' | grep -v 127.0.0.1 |head -1) echo "Scanning $iprange for FAI server (port $FAI_MONITOR_PORT)" while [ 1 ]; do @@ -133,11 +133,11 @@ sleep 4 root=$monserver:$NFSROOT -netroot=nfs:$monserver:$NFSROOT: +netroot=nfs:$monserver:$NFSROOT:nfsvers=3 echo "root=$root" echo "FAI_VERSION=$FAI_VERSION" >> $ivar -echo FAI_FLAGS=$FAI_FLAGS >> $ivar +echo "FAI_FLAGS=$FAI_FLAGS" >> $ivar echo "root=$monserver:$NFSROOT" >> $ivar echo "monserver=$monserver" >> $ivar echo "FAI_CONFIG_SRC=$FAI_CONFIG_SRC" >> $ivar diff -Nru fai-5.3.6ubuntu1/lib/fai-disk-info fai-5.9.4ubuntu1/lib/fai-disk-info --- fai-5.3.6ubuntu1/lib/fai-disk-info 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/fai-disk-info 2020-04-27 02:48:19.000000000 +0000 @@ -14,9 +14,20 @@ [ -f /proc/ide/$device/media ] && grep -q cdrom /proc/ide/$device/media && isdisk=0 # old way of detecting disks: [ `cat /sys/block/$device/removable` -eq 1 ] && isdisk=0 [ `stat -c %G /dev/$device` = "disk" ] || isdisk=0 + if [ -n "$stick" ]; then + [ $device = $stick ] && isdisk=0 + fi [ $isdisk -eq 1 ] && echo "$device" done } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +# determine the device of the USB stick we boot from +stick=$(mount | awk '/run\/initramfs\/live/ {print $1}') +stick=${stick#/dev/} +stick=${stick%%[[:digit:]]*} + + # echo a space separated list of devices and their block size -( egrep 'md[0-9]{3,}$' /proc/partitions; egrep ' etherd/e[[:digit:]]+\.[[:digit:]]+\b| i2o/hd.+\b| cciss/c[[:digit:]]+d[[:digit:]]+\b| ida/c[[:digit:]]+d[[:digit:]]+\b| rd/c[[:digit:]]+d[[:digit:]]+\b| fio.\b| hd.\b| sd[a-z]{1,2}\b|/disc\b| vd.\b| xvd.\b| nvme[[:digit:]]n1$' /proc/partitions ) | checkdisk +( grep -E 'md[0-9]{3,}$' /proc/partitions; grep -E ' etherd/e[[:digit:]]+\.[[:digit:]]+\b| i2o/hd.+\b| cciss/c[[:digit:]]+d[[:digit:]]+\b| ida/c[[:digit:]]+d[[:digit:]]+\b| rd/c[[:digit:]]+d[[:digit:]]+\b| fio.\b| hd.\b| sd[a-z]{1,2}\b|/disc\b| vd.\b| xvd.\b| nvme[[:digit:]]+n1$| mmcblk[[:digit:]]+$' /proc/partitions ) | checkdisk diff -Nru fai-5.3.6ubuntu1/lib/fetch-basefile fai-5.9.4ubuntu1/lib/fetch-basefile --- fai-5.3.6ubuntu1/lib/fetch-basefile 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/fetch-basefile 2020-04-27 02:48:20.000000000 +0000 @@ -2,12 +2,13 @@ # fetch-basefile, fetch a basefile via ftp or http using classes # -# (c) Thomas Lange, 2011-2012 +# (c) Thomas Lange, 2011-2017 # # Try to download a file CLASSNAME.tar.gz (or tgz, or tar.xz,...) from an URL # CLASSNAME must match a FAI class -# The URL must provide a listing of all files in there -# e.g.: FAI_BASEFILEURL=http://fai-project.org/download/basefiles +# The URL must provide a (directory) listing of all files available for +# download +# e.g.: FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ # # variables needed: $classes, $FAI, $FAI_BASEFILEURL @@ -28,6 +29,7 @@ error=0 found=0 mount=0 +declare -a baselist while getopts m opt ; do case "$opt" in @@ -38,15 +40,8 @@ # get list of all files at URL flist=$(lftp -e 'cls;exit' $url 2>/dev/null) - -# create a hash like thing -# key (here variable name) is the basename of the file found -# value is the complete filename -for f in $flist; do - # echo file found: $f - base=${f%%.*} # basename is the class name - eval "found_$base=$f" -done +# create an array of all lines +baselist=($flist) # reverse order of classes for c in $classes; do @@ -55,26 +50,26 @@ # now search for each class, if a basename matches for c in $revclasses; do - id="found_$c" # prepare for indirect variable name - if [ X${!id} != X ]; then - # hash lookup succeeded - found=1 - [ $mount = 1 ] && mount_ramdisk - # Create folder in case it is not part of the configuration space - mkdir -p $FAI/basefiles || echo "Could not create folder $FAI/basefiles" >&2 - cd $FAI/basefiles || exit 3 - if [ -f ${!id} ]; then - echo "${!id} already exists" >&2 - error=1 - break - fi - - echo "Downloading $url/${!id}" - # wget -nv $url/${!id} # creates a new file with suffix .1, .2,.. if file already exists. Bad. - lftp -e "get $url/${!id};exit" # fails if file already exists. this is nice. - error=$? - break - fi + for f in ${baselist[@]}; do + base=${f%%.*} + if [ "$c" = "$base" ]; then + found=1 + [ $mount = 1 ] && mount_ramdisk + # Create folder in case it is not part of the configuration space + mkdir -p $FAI/basefiles || echo "Could not create folder $FAI/basefiles" >&2 + cd $FAI/basefiles || exit 3 + if [ -f $f ]; then + echo "$f already exists" >&2 + error=1 + break 2 + fi + + echo "Downloading $url/$f" + lftp -e "get $url/$f;exit" # fails if file already exists. this is nice. + error=$? + break 2 + fi + done done if [ X$found = X0 ]; then diff -Nru fai-5.3.6ubuntu1/lib/get-boot-info fai-5.9.4ubuntu1/lib/get-boot-info --- fai-5.3.6ubuntu1/lib/get-boot-info 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/get-boot-info 2020-04-27 02:48:19.000000000 +0000 @@ -5,7 +5,7 @@ # bootinfo -- get boot information via DHCP protocol # # This script is part of FAI (Fully Automatic Installation) -# (c) 2003-2017 by Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2003-2019 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # #********************************************************************* @@ -29,7 +29,6 @@ # this script writes received information to $LOGDIR/boot.log bootlog=$LOGDIR/boot.log - # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - netdevice_info() { @@ -39,7 +38,7 @@ # if not defined, use boot messages to determine network devices [ -n "$netdevices" ] || netdevices=$netdevices_up - netdevices_all=$(ip link | grep "^[1-9]" | cut -d : -f 2 | cut -d ' ' -f 2 | egrep "^eth|^en") + netdevices_all=$(ip link | grep "^[1-9]" | cut -d : -f 2 | cut -d ' ' -f 2 | grep -E "^eth|^en") netdevices_all=$(for dev in $netdevices_all; do echo $dev; done| sort | uniq| tr '\n' ' ') } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -49,46 +48,50 @@ return fi boot=1 - cat > $bootlog <<-EOF - netdevices_all="$netdevices_all" - netdevices_up="$netdevices_up" - netdevices="$netdevices" -EOF - dhclient -lf /dev/null -cf /usr/share/fai/dhclient-fai.conf -sf /usr/share/fai/dhclient-fai-script $netdevices >>$bootlog 2> $LOGDIR/dhclient.log + + if [ -n "$netdevices_up" ]; then + dhclient -lf /dev/null -cf /usr/share/fai/dhclient-fai.conf -sf /usr/share/fai/dhclient-fai-script $netdevices >>$bootlog 2> $LOGDIR/dhclient.log + setnet + if [ -f /run/dhclient.pid ]; then + kill `cat /run/dhclient.pid` + fi + fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - setnet() { # get network parameters - # first get first active network device - local dev dummy n + local dummy - n=0 - until [ $n = 7 ]; do - dev=$(ip ad show up | awk -F': ' '/^[0-9]/ && ! / lo:/ {print $2;exit}') - if [ -z "$dev" ]; then - sleep 2 # if interface needs some time to come up - else - break - fi - n=$(($n + 1)) + # determine the name of the default network interface + # try several times if dhclient needs some more time + local i=0 + NIC1=$(ip route | awk '/^default/ {print $5}'|head -1) + while [ ! "$NIC1" -a $i -lt 8 ]; do + sleep 2 + NIC1=$(ip route | awk '/^default/ {print $5}'|head -1) + (( i += 1 )) done + if [ -z "$NIC1" ]; then + NIC1=$(ip route | awk '/ dev / {print $3}'|head -1) + fi - read IPADDR NETMASK BROADCAST dummy<<<$(ifdata -p $dev) - CIDR=$(ip -o -f inet addr show| awk '{print $4}'| grep $IPADDR) - GATEWAYS=$(ip route | awk '/^default/ {print $3}') + # only write info if interface is known + if [ -n "$NIC1" ]; then + read IPADDR NETMASK BROADCAST dummy<<<$(ifdata -p $NIC1) + CIDR=$(ip -o -f inet addr show| awk '{print $4}'| grep $IPADDR) + GATEWAYS=$(ip route | awk '/^default/ {print $3}') - cat >> $bootlog <<-EOF - netdevices_all="$netdevices_all" - netdevices_up="$netdevices_up" - netdevices="$netdevices" + cat >> $bootlog <<-EOF IPADDR=$IPADDR SERVER=$SERVER NETMASK=$NETMASK GATEWAYS=$GATEWAYS BROADCAST=$BROADCAST CIDR=$CIDR + NIC1=$NIC1 EOF + fi if [ -n "$DOMAIN" ]; then # DOMAIN was specified on the kernel command line @@ -133,8 +136,18 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - netdevice_info +cat > $bootlog <<-EOF + netdevices_all="$netdevices_all" + netdevices_up="$netdevices_up" + netdevices="$netdevices" +EOF boot=0 +# no network needed +if [ "$ip" == "off" ]; then + boot=1 +fi + # if ip= parameter contains IP address, get fixed IP data, otherwise use DHCP if [[ $ip =~ ^.*:*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]; then get_fixed_info diff -Nru fai-5.3.6ubuntu1/lib/get-config-dir fai-5.9.4ubuntu1/lib/get-config-dir --- fai-5.3.6ubuntu1/lib/get-config-dir 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/get-config-dir 2020-04-27 02:48:19.000000000 +0000 @@ -40,7 +40,7 @@ mkdir -p $FAI # run get-config-dir-$method script if it exists -if which get-config-dir-$method &>/dev/null ; then +if command -v get-config-dir-$method &>/dev/null ; then get-config-dir-$method else sendmon "TASKERROR get_fai_dir 22" diff -Nru fai-5.3.6ubuntu1/lib/get-config-dir-git fai-5.9.4ubuntu1/lib/get-config-dir-git --- fai-5.3.6ubuntu1/lib/get-config-dir-git 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/get-config-dir-git 2020-04-27 02:48:19.000000000 +0000 @@ -41,7 +41,7 @@ } if [ -d "$GIT_DIR" ]; then - if [ `git remote show -n origin | egrep -m1 -o '[^[:space:]]+://.+'` == "$giturl" ]; then + if [ `git remote show -n origin | grep -E -m1 -o '[^[:space:]]+://.+'` == "$giturl" ]; then echo "Updating git copy in $FAI" git fetch task_error 881 $? diff -Nru fai-5.3.6ubuntu1/lib/get-config-dir-nfs fai-5.9.4ubuntu1/lib/get-config-dir-nfs --- fai-5.3.6ubuntu1/lib/get-config-dir-nfs 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/get-config-dir-nfs 2020-04-27 02:48:19.000000000 +0000 @@ -8,6 +8,9 @@ ### END SUBROUTINE INFO server=$(expr match "$FAI_CONFIG_SRC" '.*://\([^/]*\)/.*') +if [ -z "$server" ]; then + server=$(awk '{if($2 == "/live/image") print $1;}' /proc/mounts | cut -d ':' -f 1) +fi nfspath=$(expr match "$FAI_CONFIG_SRC" '.*://[^/]*\(/.*\)') mount $romountopt $server:$nfspath $FAI && diff -Nru fai-5.3.6ubuntu1/lib/get-config-dir-svn fai-5.9.4ubuntu1/lib/get-config-dir-svn --- fai-5.3.6ubuntu1/lib/get-config-dir-svn 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/get-config-dir-svn 2020-04-27 02:48:19.000000000 +0000 @@ -52,7 +52,7 @@ [ -n "$username" ] && user="--username $username" if [ -d "$FAI/.svn" ] ; then - if [ `svn info $FAI | grep '^URL:' | awk '{print $2}'` == "$svnurl" ]; then + if [ `svn info $FAI | awk '/ ^URL:/ {print $2}'` == "$svnurl" ]; then echo "Updating SVN in $FAI" cd $FAI svn up $user $pass | grep -v 'Updated to revision' > $LOGDIR/getconf.log diff -Nru fai-5.3.6ubuntu1/lib/mount2dir fai-5.9.4ubuntu1/lib/mount2dir --- fai-5.3.6ubuntu1/lib/mount2dir 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/mount2dir 2020-04-27 02:48:19.000000000 +0000 @@ -72,7 +72,7 @@ case $device in ""|\#*) continue ;; - /dev/*|LABEL=*|UUID=*) + /dev/*|LABEL=*|UUID=*|*:*) # overwrite mount options mopt="-o $mopt -o noatime" diff -Nru fai-5.3.6ubuntu1/lib/prcopyleft fai-5.9.4ubuntu1/lib/prcopyleft --- fai-5.3.6ubuntu1/lib/prcopyleft 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/prcopyleft 2020-04-27 02:48:19.000000000 +0000 @@ -3,7 +3,7 @@ #********************************************************************* # # This script is part of FAI (Fully Automatic Installation) -# (c) 2003-2017 by Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2003-2018 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # #********************************************************************* @@ -17,7 +17,7 @@ ------------------------------------------------- Fully Automatic Installation - FAI - $FAI_VERSION (c) 1999-2017 + $FAI_VERSION (c) 1999-2019 Thomas Lange ------------------------------------------------- EOF diff -Nru fai-5.3.6ubuntu1/lib/setup-storage/Commands.pm fai-5.9.4ubuntu1/lib/setup-storage/Commands.pm --- fai-5.3.6ubuntu1/lib/setup-storage/Commands.pm 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/setup-storage/Commands.pm 2020-04-27 02:48:20.000000000 +0000 @@ -253,12 +253,7 @@ "", "keyfile_$real_dev" ); my $lukscreateopts = $vol->{lukscreateopts} // ""; - if ($lukscreateopts !~ /(^|\s)-c\s+\S+/) { - $lukscreateopts .= " -c aes-cbc-essiv:sha256"; - } - if ($lukscreateopts !~ /(^|\s)-s\s+\d+/) { - $lukscreateopts .= " -s 256"; - } + # encrypt &FAI::push_command( "yes YES | cryptsetup luksFormat $real_dev $keyfile $lukscreateopts", @@ -282,7 +277,7 @@ } # add entries to crypttab - push @FAI::crypttab, "$enc_dev_short_name\t$real_dev\t$keyfile\tluks"; + push @FAI::crypttab, "$enc_dev_short_name\t$real_dev\t$keyfile\tluks,discard"; } elsif ($mode eq "tmp" || $mode eq "swap") { &FAI::push_command( "cryptsetup --key-file=/dev/urandom create $enc_dev_short_name $real_dev", @@ -323,6 +318,7 @@ next unless defined($this_fs); next unless ($this_fs eq 'btrfs'); $volume = 'single_' . $single_vol_index; + $FAI::configs{$config}{volumes}{$volume}{preserve} = $FAI::configs{$c}{partitions}{$p}{size}{preserve}; $FAI::configs{$config}{volumes}{$volume}{encrypt} = $FAI::configs{$c}{partitions}{$p}{encrypt}; $FAI::configs{$config}{volumes}{$volume}{raidlevel} = 'single'; $FAI::configs{$config}{volumes}{$volume}{filesystem} = $this_fs; @@ -332,7 +328,7 @@ $FAI::configs{$config}{volumes}{$volume}{mount_options} = $FAI::configs{$c}{partitions}{$p}{mount_options}; $FAI::configs{$c}{partitions}{$p}{mount_options} = '-'; $FAI::configs{$config}{volumes}{$volume}{fstabkey} = $FAI::configs{$c}{fstabkey}; - if ($device =~ m:^/dev/nvme|^/dev/loop:) { + if ($device =~ m:^/dev/nvme|^/dev/loop|^/dev/mmcblk:) { $FAI::configs{$config}{volumes}{$volume}{devices}{$device . "p" . $p} = {}; } else { $FAI::configs{$config}{volumes}{$volume}{devices}{$device . $p} = {}; @@ -342,6 +338,8 @@ } } + my %mkfs_done; + foreach my $config (keys %FAI::configs) { # loop through all configs next unless ($config eq "BTRFS"); @@ -360,6 +358,7 @@ my $createopts = $vol->{createopts} // ""; $createopts .= " $forcebtrfs"; my $pre_req = ""; + my $btrfs_tool = ""; # creates the proper prerequisites for later command ordering foreach (@devs) { my $tmp = $_; @@ -369,17 +368,25 @@ if (scalar @devs == 1) { $pre_req = "exist_" . $devs[0]; } + # creates the BTRFS volume/RAID if ($raidlevel eq 'single') { - &FAI::push_command("mkfs.btrfs -d single $createopts ". join(" ",@devs), - "$pre_req", - "btrfs_built_raid_$id"); + if (exists $mkfs_done{join(" ", @devs)}) { + $btrfs_tool = "true"; + } else { + print "Adding mkfs command for '", join(", ", @devs), "'.\n"; + $btrfs_tool = "mkfs.btrfs -d single $createopts ".join(" ",@devs); + $mkfs_done{join(" ", @devs)} = '1'; + } + } else { + $btrfs_tool = "mkfs.btrfs -d raid$raidlevel $createopts ".join(" ",@devs); + } - } else { - &FAI::push_command("mkfs.btrfs -d raid$raidlevel $createopts ". join(" ",@devs), - "$pre_req", - "btrfs_built_raid_$id"); - } + # nothing more to do if we need to proserve this volume. No mkfs, no subvolume + next if ($vol->{preserve}); + + # add mkfs.btrfs if needed (otherwise add true) + &FAI::push_command("$btrfs_tool", "$pre_req", "btrfs_built_raid_$id"); # initial mount, required to create the initial subvolume &FAI::push_command("mount $devs[0] /mnt", @@ -427,7 +434,7 @@ foreach my $config (keys %FAI::configs) { # loop through all configs # no encrypted, tmpfs, LVM or physical devices here - next if ($config eq "BTRFS" || $config eq "CRYPT" || $config eq "TMPFS" || $config =~ /^VG_./ || $config =~ /^PHY_./); + next if ($config eq "BTRFS" || $config eq "CRYPT" || $config eq "TMPFS" || $config eq "NFS" || $config =~ /^VG_./ || $config =~ /^PHY_./); ($config eq "RAID") or &FAI::internal_error("Invalid config $config"); # create all raid devices @@ -511,6 +518,14 @@ . join(" ", @eff_devs) . " " . join(" ", @spares), "$pre_req", "exist_/dev/md$id" ); + # do not sync soft raid during installation + # do not remove ; from echo line. Otherwise it will not work + if ($FAI::do_init_tasks) { # no sync when initial installation + &FAI::push_command( + "echo frozen > /sys/block/md$id/md/sync_action;", + "exist_/dev/md$id", "nosync_md$id" ); + } + # create the filesystem on the volume &FAI::build_mkfs_commands("/dev/md$id", \%{ $FAI::configs{$config}{volumes}{$id} }); @@ -847,7 +862,7 @@ my $post_wipe = "pvremove_$vg"; foreach my $d (split (" ", $devices)) { $post_wipe .= ",pv_sigs_removed_wipe_${d}_$vg"; - &FAI::push_command( "wipefs -a $d", "pvremove_$vg", "pv_sigs_removed_wipe_${d}_$vg"); + &FAI::push_command( "wipefs -af $d", "pvremove_$vg", "pv_sigs_removed_wipe_${d}_$vg"); } &FAI::push_command( "true", $post_wipe, "pv_sigs_removed_$vg" ); return 1; @@ -886,7 +901,7 @@ # prevent error due to different VG name of existing VG if (defined($FAI::configs{$d})) { # don't deactivate preserved VGs to prevent blkid error later on - foreach my $v (keys %{ $FAI::configs->{$d}->{volumes} }) { + foreach my $v (keys %{ $FAI::configs{$d}->{volumes} }) { $preserved = 1 if ($FAI::configs{$d}{volumes}{$v}{size}{preserve}); } } @@ -908,7 +923,7 @@ foreach my $config (keys %FAI::configs) { # no physical devices, RAID, encrypted or tmpfs here - next if ($config eq "BTRFS" || $config =~ /^PHY_./ || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS"); + next if ($config eq "BTRFS" || $config =~ /^PHY_./ || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config eq "NFS"); ($config =~ /^VG_(.+)$/) or &FAI::internal_error("Invalid config $config"); next if ($1 eq "--ANY--"); my $vg = $1; # the volume group @@ -1143,7 +1158,7 @@ scalar(@{ $FAI::current_dev_children{$c} })); my ($i_p_d, $d, $part_no) = &FAI::phys_dev($c); ($i_p_d && $d eq $disk) or &FAI::internal_error("Invalid dev children entry"); - my $wipe_cmd = "wipefs -a $c"; + my $wipe_cmd = "wipefs -af $c"; foreach my $part_id (@to_preserve) { # get the existing id my $mapped_id = $FAI::configs{$config}{partitions}{$part_id}{maps_to_existing}; @@ -1304,6 +1319,10 @@ if (defined $part->{mountpoint} && $part->{mountpoint} eq "/boot") { $boot_disk=$disk; } + # override $boot_disk if /boot/efi exists + if (defined $part->{mountpoint} && $part->{mountpoint} eq "/boot/efi") { + $boot_disk=$disk; + } # the type of the partition defaults to primary my $part_type = "primary"; @@ -1354,9 +1373,10 @@ $prev_id = $part_id; } + # set bootable flag for gpt-bios and gpt &FAI::push_command("parted $boot_disk set 1 boot on", "pt_complete_$disk", "gpt_bios_fake_bootable") - if($FAI::configs{$config}{disklabel} eq "gpt-bios" and $boot_disk); + if($FAI::configs{$config}{disklabel} =~ /^gpt/ and $boot_disk); ($prev_id > -1) or &FAI::internal_error("No partitions created"); $partition_table_deps{$disk} = "cleared2_$disk,exist_" @@ -1375,7 +1395,7 @@ # loop through all configs foreach my $config ( keys %FAI::configs ) { # no RAID, encrypted, tmpfs or LVM devices here - next if ($config eq "BTRFS" || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config =~ /^VG_./ || $FAI::configs{$config}{vg}); + next if ($config eq "BTRFS" || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config eq "NFS" || $config =~ /^VG_./ || $FAI::configs{$config}{vg}); ($config =~ /^PHY_(.+)$/) or &FAI::internal_error("Invalid config $config"); my $disk = $1; # the device to be configured diff -Nru fai-5.3.6ubuntu1/lib/setup-storage/Fstab.pm fai-5.9.4ubuntu1/lib/setup-storage/Fstab.pm --- fai-5.3.6ubuntu1/lib/setup-storage/Fstab.pm 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/setup-storage/Fstab.pm 2020-04-27 02:48:20.000000000 +0000 @@ -74,6 +74,11 @@ $FAI::disk_var{SWAPLIST} .= " " . $dev_name if ($d_ref->{filesystem} eq "swap"); + $FAI::disk_var{ESP_DEVICE} = $dev_name + if ($d_ref->{mountpoint} eq "/boot/efi"); + $FAI::disk_var{ESP_DEVICE} = $dev_name + if ($d_ref->{mountpoint} eq "/boot" && $d_ref->{filesystem} eq "vfat"); + my $ret = "\n$comment_line"; # join the columns of one line with tabs $ret .= join ("\t", @fstab_line); @@ -188,6 +193,9 @@ } elsif ($c eq "TMPFS") { # not usable for /boot next; + } elsif ($c eq "NFS") { + # not usable for /boot + next; } else { &FAI::internal_error("Unexpected key $c"); } @@ -353,6 +361,16 @@ push @fstab, create_fstab_line($c_ref, "tmpfs", "tmpfs"); } + } elsif ($c eq "NFS") { + foreach my $v (keys %{ $config->{$c}->{volumes} }) { + my $c_ref = $config->{$c}->{volumes}->{$v}; + + next if ($c_ref->{mountpoint} eq "-"); + + my $device_name = &FAI::enc_name($c_ref->{device}); + + push @fstab, create_fstab_line($c_ref, $device_name, "nfs"); + } } else { &FAI::internal_error("Unexpected key $c"); } diff -Nru fai-5.3.6ubuntu1/lib/setup-storage/Init.pm fai-5.9.4ubuntu1/lib/setup-storage/Init.pm --- fai-5.3.6ubuntu1/lib/setup-storage/Init.pm 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/setup-storage/Init.pm 2020-04-27 02:48:20.000000000 +0000 @@ -27,7 +27,7 @@ # @brief Initialize all variables and acquire the set of disks of the system. # # The layout of the data structures is documented in the wiki: -# http://wiki.fai-project.org/index.php/Setup-storage +# https://wiki.fai-project.org/index.php/Setup-storage # # @author Christian Kern, Michael Tautschnig # @date Sun Jul 23 16:09:36 CEST 2006 @@ -36,6 +36,9 @@ package FAI; +# are we running an inital installation from nfsroot? +$FAI::do_init_tasks = $ENV{do_init_tasks} // 0; + ################################################################################ # # @brief Enable debugging by setting $debug to a value greater than 0 @@ -205,7 +208,7 @@ return (1, "/dev/$1", $2); } elsif ($dev =~ - m{^/dev/(loop\d+|cciss/c\d+d\d+|ida/c\d+d\d+|md\d{3,}|md/\w+\d*|rd/c\d+d\d+|ataraid/d\d+|etherd/e\d+\.\d+|nvme\d+n1)(p(\d+))?$}) + m{^/dev/(loop\d+|cciss/c\d+d\d+|ida/c\d+d\d+|md\d{3,}|md/\w+\d*|rd/c\d+d\d+|ataraid/d\d+|etherd/e\d+\.\d+|nvme\d+n1|mmcblk\d+)(p(\d+))?$}) { defined($2) or return (1, "/dev/$1", -1); return (1, "/dev/$1", $3); @@ -287,7 +290,7 @@ sub make_device_name { my ($dev, $p) = @_; $dev .= "p" if ($dev =~ - m{^/dev/(loop\d+|cciss/c\d+d\d+|ida/c\d+d\d+|md\d{3,}|md/\w+\d*|rd/c\d+d\d+|ataraid/d\d+|etherd/e\d+\.\d+|nvme\d+n1)$}); + m{^/dev/(loop\d+|cciss/c\d+d\d+|ida/c\d+d\d+|md\d{3,}|md/\w+\d*|rd/c\d+d\d+|ataraid/d\d+|etherd/e\d+\.\d+|nvme\d+n1|mmcblk\d+)$}); $dev .= $p; internal_error("Invalid device $dev") unless (&FAI::phys_dev($dev))[0]; return $dev; diff -Nru fai-5.3.6ubuntu1/lib/setup-storage/Parser.pm fai-5.9.4ubuntu1/lib/setup-storage/Parser.pm --- fai-5.3.6ubuntu1/lib/setup-storage/Parser.pm 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/setup-storage/Parser.pm 2020-04-27 02:48:20.000000000 +0000 @@ -178,7 +178,7 @@ # only supported on msdos disk labels. ($FAI::device =~ /^PHY_(.+)$/ && ($type ne "logical" || $FAI::configs{$FAI::device}{disklabel} eq "msdos")) or - die "Syntax error: invalid partition type"; + die "Syntax error: invalid partition type. A logical partition is only supported with msdos disk labels."; # the disk my $disk = $1; @@ -492,6 +492,12 @@ $FAI::configs{$FAI::device}{fstabkey} = "device"; $FAI::configs{$FAI::device}{volumes} = {}; } + | /^nfs/ + { + $FAI::device = "NFS"; + $FAI::configs{$FAI::device}{fstabkey} = "device"; + $FAI::configs{$FAI::device}{volumes} = {}; + } | /^disk(\d+)/ { # check, whether parted is available @@ -771,7 +777,7 @@ $FAI::partition_pointer_dev_name = "/dev/md$vol_id"; } mountpoint devices filesystem mount_options mdcreateopts - | /^btrfs (single|raid([0156]|10))\s+/ + | /^btrfs\s+(single|raid([0156]|10))\s+/ { ($FAI::device eq "BTRFS") or die "BTRFS entry invalid in this context.\n"; defined $FAI::configs{BTRFS} or $FAI::configs{BTRFS}{volumes} = {}; @@ -836,6 +842,29 @@ $FAI::partition_pointer_dev_name = "TMPFS$vol_id"; } mountpoint tmpfs_size mount_options + | /^nfs\s+([^\s]+)\s+/ + { + ($FAI::device eq "NFS") or die "nfs entry invalid in this context\n"; + defined ($FAI::configs{NFS}) or &FAI::internal_error("NFS entry missing"); + + my $vol_id = 0; + foreach my $ex_vol_id (&FAI::numsort(keys %{ $FAI::configs{NFS}{volumes} })) { + defined ($FAI::configs{NFS}{volumes}{$ex_vol_id}{device}) or last; + $vol_id++; + } + + my $nfssource = $1; + $nfssource =~ s/HOSTNAME/$ENV{'HOSTNAME'}/g; + $FAI::configs{NFS}{volumes}{$vol_id}{device} = $nfssource; + $FAI::configs{NFS}{volumes}{$vol_id}{filesystem} = "nfs"; + + # We don't do preserve for nfs + $FAI::configs{NFS}{volumes}{$vol_id}{preserve} = 0; + + $FAI::partition_pointer = (\%FAI::configs)->{NFS}->{volumes}->{$vol_id}; + $FAI::partition_pointer_dev_name = "NFS$vol_id"; + } + mountpoint mount_options | type mountpoint size filesystem mount_options lv_or_fsopts | @@ -998,7 +1027,23 @@ $dev = "/dev/$dev"; } } - my @candidates = glob($dev); + my @candidates; + + # resolve /dev/disk/by-id symlinks + # those symlinks point to the actual device node + # partitions, which may not exist yet, are addressed + # by /dev/disk/by-id/${disk}-part${partno} + if ($dev =~ m{^(/dev/disk/by-id/.*?)(?:-part(\d+))?$}) { + my $part_no = $2; + my @real_candidates = map { Cwd::abs_path($_) } glob($1); + if (defined $part_no) { + @candidates = map { &FAI::make_device_name($_, $part_no) } @real_candidates; + } else { + @candidates = @real_candidates; + } + } else { + @candidates = glob($dev); + } # options are only valid for RAID defined ($opts) and ($FAI::device ne "RAID") and die "Option $opts invalid in a non-RAID context\n"; @@ -1236,6 +1281,15 @@ foreach my $p (keys %{ $FAI::configs{$config}{volumes} }) { my $this_mp = $FAI::configs{$config}{volumes}{$p}{mountpoint}; next if ($this_mp eq "-"); + defined($all_mount_pts{$this_mp}) and die + "Mount point $this_mp used twice\n"; + ($this_mp eq "none") or $all_mount_pts{$this_mp} = 1; + } + next; + } elsif ($config eq "NFS") { + foreach my $p (keys %{ $FAI::configs{$config}{volumes} }) { + my $this_mp = $FAI::configs{$config}{volumes}{$p}{mountpoint}; + next if ($this_mp eq "-"); defined($all_mount_pts{$this_mp}) and die "Mount point $this_mp used twice\n"; ($this_mp eq "none") or $all_mount_pts{$this_mp} = 1; diff -Nru fai-5.3.6ubuntu1/lib/setup-storage/Sizes.pm fai-5.9.4ubuntu1/lib/setup-storage/Sizes.pm --- fai-5.3.6ubuntu1/lib/setup-storage/Sizes.pm 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/setup-storage/Sizes.pm 2020-04-27 02:48:20.000000000 +0000 @@ -200,7 +200,7 @@ foreach my $config (keys %FAI::configs) { # for RAID, encrypted, tmpfs or physical disks there is nothing to be done here - next if ($config eq "BTRFS" || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config =~ /^PHY_./); + next if ($config eq "BTRFS" || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config eq "NFS" || $config =~ /^PHY_./); ($config =~ /^VG_(.+)$/) or &FAI::internal_error("invalid config entry $config"); next if ($1 eq "--ANY--"); my $vg = $1; # the volume group name @@ -581,7 +581,7 @@ foreach my $config (keys %FAI::configs) { # for RAID, encrypted, tmpfs or LVM, there is nothing to be done here - next if ($config eq "BTRFS" || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config =~ /^VG_./); + next if ($config eq "BTRFS" || $config eq "RAID" || $config eq "CRYPT" || $config eq "TMPFS" || $config eq "NFS" || $config =~ /^VG_./); ($config =~ /^PHY_(.+)$/) or &FAI::internal_error("invalid config entry $config"); # nothing to be done, if this is a configuration for a virtual disk or a # disk without partitions diff -Nru fai-5.3.6ubuntu1/lib/setup-storage/Volumes.pm fai-5.9.4ubuntu1/lib/setup-storage/Volumes.pm --- fai-5.3.6ubuntu1/lib/setup-storage/Volumes.pm 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/setup-storage/Volumes.pm 2020-04-27 02:48:20.000000000 +0000 @@ -73,6 +73,9 @@ } elsif ($config eq "TMPFS") { # no devices next; + } elsif ($config eq "NFS") { + # no devices + next; } else { &FAI::internal_error("Unexpected key $config"); } @@ -394,15 +397,27 @@ ################################################################################ # # @brief Collect the current LVM configuration -# +# use enviroment variable SS_IGNORE_VG to ignore a list of volume groups ################################################################################ sub get_current_lvm { use Linux::LVM; + Linux::LVM->units('H'); use Cwd qw(abs_path); + # create hash of vgs to be ignored + my %vgignore = (); + if (defined $ENV{"SS_IGNORE_VG"}) { + %vgignore = map { $_ , 1} split ' ',$ENV{"SS_IGNORE_VG"}; + } + # get the existing volume groups foreach my $vg (get_volume_group_list()) { + if ($vgignore{$vg}) { + warn "Ignoring volume group: $vg\n"; + next; + } + # initialise the hash entry $FAI::current_lvm_config{$vg}{physical_volumes} = (); @@ -493,7 +508,7 @@ # parse the output line by line foreach my $line (@mdadm_print) { print MDADM_EX "$line"; - if ($line =~ /^ARRAY \/dev\/md[\/]?(\d+)\s+/) { + if ($line =~ /^ARRAY \/dev\/md[\/]?([\w-]+)\s+/) { $id = $1; foreach (split (" ", $line)) { @@ -684,6 +699,9 @@ } elsif ($config eq "TMPFS") { # We don't do preserve for tmpfs next; + } elsif ($config eq "NFS") { + # We don't do preserve for nfs + next; } else { &FAI::internal_error("Unexpected key $config"); } diff -Nru fai-5.3.6ubuntu1/lib/subroutines fai-5.9.4ubuntu1/lib/subroutines --- fai-5.3.6ubuntu1/lib/subroutines 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/subroutines 2020-04-27 02:48:19.000000000 +0000 @@ -5,7 +5,7 @@ # subroutines -- useful subroutines for FAI # # This script is part of FAI (Fully Automatic Installation) -# (c) 2000-2016 by Thomas Lange, lange@informatik.uni-koeln.de +# (c) 2000-2019 by Thomas Lange, lange@informatik.uni-koeln.de # Universitaet zu Koeln # (c) 2001-2005 by Henning Glawe, glaweh@physik.fu-berlin.de # Freie Universitaet Berlin @@ -136,22 +136,55 @@ fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -jobsrunning() { +umount_target() { - # test if jobs are running - ps r | egrep -qv "ps r|TIME COMMAND|rcS" + if [ "$target" != '/' ]; then + # do not umount during softupdate + umount $FAI_ROOT/proc $FAI_ROOT/sys $FAI_ROOT/dev/pts $FAI_ROOT/dev 2>/dev/null + for dir in $(mount | grep $target | grep -E -v "media/mirror|tmpfs"| awk '{print $3}' | sort -r); do + mountpoint -q $dir && umount $dir + done + fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -wait_for_jobs() { +cleanup_devicemapper() { - # can be an extern script - # wait for running (background) jobs to finish (e.g. update-auctex-elisp) - local i=0 - while jobsrunning; do - [ $(($i % 3)) -eq 0 ] && echo "Waiting for background jobs to finish." - (( i += 1 )) - sleep 10 - done + local vgroup v + # remove device mapper devices + grep -q 'Executing: vgcreate' $LOGDIR/format.log 2>/dev/null + if [ $? -eq 0 ]; then + + # write which vg should be removed, PPID is the fai-diskimage process + > /var/run/fai/vgremove.$PPID + vgroup=$(awk '/Executing: vgcreate/ {print $3}' $LOGDIR/format.log) + for v in $vgroup; do + vgchange -an $v + echo vgremove -f $v >> /var/run/fai/vgremove.$PPID + done + fi +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +mk_zerofree_list() { + + # make a list of devices for zerofree which have an ext2/3/4 file system + local source fstype mpoint v + + if [ X$verbose = X1 ]; then + v=-v + fi + while read -r source fstype mpoint ; do + + # skip non ext2/3/4 file systems + case $fstype in + ext*) : ;; + *) continue ;; + esac + + if [[ $mpoint =~ $target ]]; then + echo "zerofree $v $source" >> /var/run/fai/zerofree.$PPID + fi + + done < <(df --output=source,fstype,target) } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - stop_fai_installation() { @@ -174,7 +207,9 @@ [ X$2 = X0 ] && return task_error_func=${FUNCNAME[*]} + task_local_error=$1 [ $1 -gt $task_error ] && task_error=$1 + echo $1 > $LOGDIR/task_error [ $task_error -gt $STOP_ON_ERROR ] && stop_fai_installation } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -194,6 +229,7 @@ local taskname=$1 shift + local task_local_error=0 # the error code set by every task [ -f $LOGDIR/skip.$taskname ] || call_hook $taskname "$@" @@ -205,14 +241,13 @@ else echo "Calling task_$taskname" sendmon "TASKBEGIN $taskname" - task_error=0 # task can set this variable to indicate an error task_error_func='' taskduration[$taskname]=$SECONDS task_$taskname "$@" [ $duration -eq 1 ] && echo "Duration of task $taskname: " $(($SECONDS-${taskduration[$taskname]}))"s" - sendmon "TASKEND $taskname $task_error" - if [ "$task_error" -ne 0 ] ; then - echo "Exit code task_$taskname: $task_error" >&2 + sendmon "TASKEND $taskname $task_local_error" + if [ "$task_local_error" -ne 0 ] ; then + echo "Exit code task_$taskname: $task_local_error" >&2 fi fi } @@ -245,13 +280,6 @@ echo "WARNING: The suffix .source is deprecated. Use .sh instead." >&2 # continue fi - if [ -x $hfile ]; then - echo "Calling hook: $hook.$cl" - sendmon "HOOK $hook.$cl" - # execute the hook - $hfile $dflag "$@" - check_status $hook.$cl $? - fi if [ -x $hfile.sh ]; then echo "Source hook: $hook.$cl.sh" sendmon "HOOK $hook.$cl.sh" @@ -259,6 +287,13 @@ . $hfile.sh $dflag "$@" check_status $hook.$cl.sh $? fi + if [ -x $hfile ]; then + echo "Calling hook: $hook.$cl" + sendmon "HOOK $hook.$cl" + # execute the hook + $hfile $dflag "$@" + check_status $hook.$cl $? + fi # deprecated if [ -x $hfile.source ]; then echo "Source hook: $hook.$cl.source" @@ -317,7 +352,11 @@ # create two virtual terminals; acces via alt-F2 and alt-F3 echo "Press ctrl-c to interrupt FAI and to get a shell" openvt -c2 /bin/bash ; openvt -c3 /bin/bash - trap 'echo "You can reboot with faireboot";bash' INT QUIT + echo "The log files are saved in /tmp/fai" > /dev/tty2 + echo "The log files are saved in /tmp/fai" > /dev/tty3 + trap 'echo "You can reboot with faireboot"; \ + echo "The log files are saved in /tmp/fai"; \ + cd /tmp/fai;bash' INT QUIT } # start secure shell daemon for remote access @@ -365,7 +404,7 @@ return fi echo Performing FAI installation. All data may be overwritten! - if [ $do_init_tasks -eq 1 ] ; then + if [ $do_init_tasks -eq 1 -a X$flag_menu = X ] ; then echo -ne "\a"; sleep 1 echo -ne "\a"; sleep 1 echo -e "\a"; sleep 5 @@ -462,7 +501,7 @@ # show only lines with ++, we cannot use a pipe, since it would call # _devfar in a subprocess. Then, variables are not defined _defvar $class.var > $svar 2>&1 - grep ^++ $svar|sed -e 's/ROOTPW=.*/ROOTPW=XXXXXXXXXXXXX/' + grep ^++ $svar| sed -e 's/\(.*PW\)=.*$/\1=XXXXXXXXXXXXX/' rm $svar fi done @@ -513,18 +552,17 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - task_tests() { - if [ -d $FAI/tests ]; then - fai-do-scripts $FAI/tests # always returns 0 atm - # check if any test failed - if [ -f $LOGDIR/test.log ]; then - if grep -q "FAILED with " $LOGDIR/test.log; then - sendmon "TASKERROR tests 312" - task_error 312 - return 1 - fi + if [ ! -d $FAI/tests ]; then + return + fi + fai-do-scripts $FAI/tests # always returns 0 atm + # check if any test failed + if [ -f $LOGDIR/test.log ]; then + if grep -q "FAILED with " $LOGDIR/test.log; then + sendmon "TASKERROR tests 312" + task_error 312 + return 1 fi - else - echo "WARNING: Subdirectory tests/ not found. No tests run." >&2 fi } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -544,35 +582,32 @@ task_faiend() { local dir cdromdevice - [ $do_init_tasks -eq 0 ] && return 0 - wait_for_jobs : ${flag_reboot:=0} : ${flag_halt:=0} # reboot/halt without prompting if FAI_FLAG reboot or halt is set # wait for keypress if neither flag reboot nor halt is set - if [ "$flag_reboot" -eq 0 -a "$flag_halt" -eq 0 ]; then + if [ $do_init_tasks -eq 1 -a "$flag_reboot" -eq 0 -a "$flag_halt" -eq 0 ]; then echo "Press to reboot (do not remove your removable medium yet)." read - else - sleep 10 fi sendmon "TASKEND faiend 0" - echo "Rebooting $HOSTNAME now" - sendmon "TASKEND reboot 0" - cd / - sync - - killall -q sshd udevd rsyslogd - - for dir in $(mount | grep $target | egrep -v "$target/tmp|media/mirror|proc|tmpfs"| awk '{print $3}' | sort -r); do - mount -o remount,ro $dir - done + cd / + mk_zerofree_list + umount_target + cleanup_devicemapper + if [ $do_init_tasks -eq 0 ]; then + echo "Log files are saved in $LOGDIR" + return 0 + fi + killall -q sshd systemd-udevd rsyslogd umount $FAI_ROOT/proc $FAI_ROOT/sys $FAI_ROOT/dev/pts 2>/dev/null umount -arf 2>/dev/null + echo "Rebooting $HOSTNAME now" + sendmon "TASKEND reboot 0" # reboot or halt? if [ "$flag_halt" -gt "0" ]; then exec halt -dfp @@ -628,6 +663,7 @@ mountpoint -q $FAI_ROOT/proc && umount $FAI_ROOT/proc mountpoint -q $FAI_ROOT/sys && umount $FAI_ROOT/sys mountpoint -q $FAI_ROOT/dev/pts && umount $FAI_ROOT/dev/pts + mountpoint -q $FAI_ROOT/run/udev && umount $FAI_ROOT/run/udev # sometimes umount $FAI_ROOT/dev fails, because a process is # still running in the background and accesses /dev # this occured sometimes when using dirinst and a long package @@ -686,7 +722,6 @@ # use the last disk_var during update if available [ -f /var/lib/fai/disk_var.sh ] && cp -p /var/lib/fai/disk_var.sh $LOGDIR - defnop wait_for_jobs save_dmesg task debconf @@ -715,7 +750,7 @@ catnc() { # cat but no comment lines - egrep -v "^#" $@ + grep -E -v "^#" $@ } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BEGIN SUBROUTINE INFO @@ -733,21 +768,17 @@ eval_cmdline() { # parse kernel parameters and define variables - local word + local word cmdline - echo -n "Kernel currently running: " + echo "Kernel currently running: " uname -rsmo - eval "cmdline=($(/dev/null + if [ $? -eq 0 ]; then + trap "umount_target;cleanup_devicemapper" QUIT EXIT + fi + # partitioning tool must create $LOGDIR/disk_var.sh file if [ ! -s $LOGDIR/disk_var.sh ]; then local conffile=$(grep "Using config file:" $LOGDIR/format.log | cut -d: -f2 ) @@ -895,10 +928,37 @@ call_debootstrap() { - local dversion=$(dpkg -l debootstrap | grep debootstrap | cut -f7 -d' ') + local targetarch + local dversion=$(dpkg-query -Wf '${Version}\n' debootstrap) echo "Creating base system using debootstrap version $dversion" - echo "Calling debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $FAI_ROOT $2" - LC_ALL=C debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $FAI_ROOT $2 + + # Check if we need cross architecture debootstrap + targetarch=$(expr "$FAI_DEBOOTSTRAP_OPTS" : '.*--arch=\([^[:space:]]*\)' || true) + hostarch1=$(dpkg --print-architecture) + + _debootstrap=qemu-debootstrap + if [ -z "$targetarch" ]; then + _debootstrap=debootstrap + targetarch=$hostarch1 + else + if [ $targetarch = $hostarch1 ]; then + _debootstrap=debootstrap + fi + fi + for arch in $(dpkg --print-foreign-architectures); do + if [ $targetarch = $arch ]; then + _debootstrap=debootstrap + break + fi + done + if [ $_debootstrap = "qemu-debootstrap" ]; then + if ! command -v $_debootstrap >&/dev/null; then + die 1 "qemu-debootstrap not found. Please install the package qemu-user-static." + fi + fi + + echo "Calling $_debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $FAI_ROOT $2" + LC_ALL=C $_debootstrap $FAI_DEBOOTSTRAP_OPTS $1 $FAI_ROOT $2 } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BEGIN SUBROUTINE INFO @@ -913,7 +973,6 @@ local fs=$FAI_ROOT/etc/fstab fetch-basefile - echo "Unpacking distro base archive" # remember, ftar extracts into $FAI_ROOT by default, so / means $FAI_ROOT/ # copy the base file class based if it exists [ -d $FAI/basefiles ] && ftar -1v -s $FAI/basefiles / @@ -933,6 +992,9 @@ task_error 801 $? fi fi + + # now check if this is a cross architecture installation, and install qemu user static if needed + check-cross-arch $FAI_ROOT # now we can copy fstab [ -f $LOGDIR/fstab ] && cp -S.old -bp $LOGDIR/fstab $fs # copy crypttab, if setup-storage created one @@ -1017,49 +1079,37 @@ fi # apt specific things - if ! fcopy -BM $v /etc/apt/sources.list; then + if ! fcopy -SBM $v /etc/apt/sources.list; then [ -f $FAI_ETC_DIR/apt/sources.list ] && cp $v $FAI_ETC_DIR/apt/sources.list $FAI_ROOT/etc/apt fi if ! fcopy -BM $v /etc/apt/preferences; then [ -f $FAI_ETC_DIR/apt/preferences ] && cp $v $FAI_ETC_DIR/apt/preferences $FAI_ROOT/etc/apt fi - fcopy -BMir /etc/apt # copy all other apt config files from the config space + fcopy -SBMir /etc/apt # copy all other apt config files from the config space if [ X$FAI_ALLOW_UNSIGNED = X1 ]; then cat < $FAI_ROOT/etc/apt/apt.conf.d/10fai APT::Get::AllowUnauthenticated "true"; +Acquire::AllowInsecureRepositories "true"; Aptitude::CmdLine::Ignore-Trust-Violations yes; EOF else rm -f $FAI_ROOT/etc/apt/apt.conf.d/10fai fi - # add apt keys for signed repositories - - declare -A keys - # remember all available *.asc files - for f in `cd $FAI/package_config; ls *.asc 2>/dev/null`; do - keys["$f"]=1 - done - # add apt keys for all classes for keyfile in ${classes:-}; do + if [ -f $FAI/package_config/$keyfile.gpg ]; then + echo "Copying APT key $keyfile.gpg to target" + cp -v --preserve=timestamp $FAI/package_config/$keyfile.gpg $FAI_ROOT/etc/apt/trusted.gpg.d/ + continue + fi [ ! -f $FAI/package_config/$keyfile.asc ] && continue - echo -n "Loading APT key from $keyfile.asc " - [ -f $FAI_ROOT/etc/apt/trusted.gpg.d/$keyfile.asc.gpg ] || touch $FAI_ROOT/etc/apt/trusted.gpg.d/$keyfile.asc.gpg - cat $FAI/package_config/$keyfile.asc | $ROOTCMD apt-key --keyring /etc/apt/trusted.gpg.d/$keyfile.asc.gpg add - - unset keys["$keyfile.asc"] + echo "Copying APT key from $keyfile.asc to $keyfile.asc.gpg " + rm -f $FAI_ROOT/etc/apt/trusted.gpg.d/$keyfile.asc.gpg + gpg --batch -o $FAI_ROOT/etc/apt/trusted.gpg.d/$keyfile.asc.gpg --dearmor $FAI/package_config/$keyfile.asc done - # print which *.asc files were not loaded - if [ ${#keys[@]} -ne 0 ]; then - echo "Following apt keys are not loaded:" - for i in "${!keys[@]}"; do - echo "$i" - done - echo "You have to rename them to match a class name." - fi - # mount Debian mirror via NFS if needed mount_mirror } @@ -1093,7 +1143,7 @@ task_error 471 $? fi # This almost indicates an error - egrep "^E:" $LOGDIR/software.log && task_error 472 + grep -E "^E:" $LOGDIR/software.log && task_error 472 grep "Couldn't find any package whose name or description matched" $LOGDIR/software.log && task_error 321 grep -q "E: Sub-process /usr/bin/dpkg returned an error code" $LOGDIR/software.log && task_error 620 } @@ -1103,18 +1153,18 @@ mkramdisk -au # umount ramdisk if [ $do_init_tasks -eq 1 ] ; then # show some local information - df -PTh | egrep ':|^/|^Filesystem' + df -PTh | grep -E ':|^/|^Filesystem' # show rx and tx bytes of network device grep . /sys/class/net/*/statistics/*x_bytes | perl -ane 'm#/sys/class/net/(.+)/statistics/(.+):(\d+)# && ($3) && ($1 ne lo) && printf "%s %s %.2f Mbytes\n",$1,$2,$3/1000000 ' swapoff -a else - df -PTh | egrep "^Filesystem|$target" + df -PTh | grep -E "^Filesystem|$target" fi # undo fake of all programs made by fai fai-divert -R rm -f $FAI_ROOT/etc/apt/apt.conf.d/{10,90}fai - date + echo -n "FAI finished at: ";date echo "The $FAI_ACTION took $(($(cut -d . -f 1 /proc/uptime)-$start_seconds)) seconds." } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1129,7 +1179,7 @@ local hostname read hostname < /proc/sys/kernel/hostname local ipaddr=$(grep IPADDR $LOGDIR/boot.log | cut -d= -f2 | sed "s/'//g") - local nexttest=$(egrep -s ^NEXTTEST= $LOGDIR/test.log | cut -d= -f2) + local nexttest=$(grep -E -s ^NEXTTEST= $LOGDIR/test.log | cut -d= -f2) case "$FAI_LOGPROTO" in ftp) remotesh=ssh ;; @@ -1156,10 +1206,10 @@ if [ -n "$nexttest" ]; then # for test sequences, we want the system to reinstall immediately with # with different class setup - $frsh /usr/sbin/fai-chboot -k ADDCLASSES=$nexttest -FIv $ipaddr + $frsh /usr/sbin/fai-chboot -k ADDCLASSES=$nexttest -FIv $ipaddr $MAC else # remove pxe config, so host will use default and boot from local disk - $frsh /usr/sbin/fai-chboot -vd $ipaddr + $frsh /usr/sbin/fai-chboot -vd $ipaddr $MAC fi fi } diff -Nru fai-5.3.6ubuntu1/lib/task_inventory fai-5.9.4ubuntu1/lib/task_inventory --- fai-5.3.6ubuntu1/lib/task_inventory 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/task_inventory 2020-04-27 02:48:19.000000000 +0000 @@ -1,7 +1,7 @@ #! /bin/bash # This script is part of FAI (Fully Automatic Installation) -# Copyright (c) 2013-2014 by Thomas Lange, Universitaet zu Koeln +# Copyright (c) 2013-2018 by Thomas Lange, Universitaet zu Koeln # Inventory function, print hardware inventory, without too much configuration information @@ -10,8 +10,12 @@ inventory() { + # activate all software RAID arrays + echo DEVICE partitions > /etc/mdadm/mdadm.conf + udevadm trigger + cd /sys/class/dmi/id - grep . {board_,bios_,product_}* 2>/dev/null| sed -e 's/:/: /'| egrep -iv 'bios_date|board_version|System Product Name|System Version|System Serial Number|123456789|To Be Filled|: Not |N/A|:[[:blank:]]+$' + grep . {board_,bios_,product_}* 2>/dev/null| sed -e 's/:/: /'| grep -E -iv 'board_version|System Product Name|System Version|System Serial Number|123456789|To Be Filled|: Not |N/A|:[[:blank:]]+$' lscpu | grep 'Hypervisor vendor:' @@ -24,7 +28,7 @@ echo "CPU: $cpuname" echo "Number of CPU/Cores: $ncpu" - nic1=$(ip route | awk '/^default/ {print $5}') + nic1=$(ip route | awk '/^default/ {print $5}'|head -1) mac1=$(< /sys/class/net/$nic1/address) echo "Network interface: $nic1" echo "MAC address: $mac1" @@ -41,8 +45,27 @@ (( n++ )) done < <(lshw -quiet -short -C disk 2>/dev/null) + # print disk infos + # $disklist needs to be set, normally done in fai-disk-info + local d=1 + local dev cap model + for dev in $disklist; do + cap=$(smartctl -i /dev/$dev | grep Capacity: | grep -Po '\[.+?\]') + if [ -z "$cap" ]; then # virtio devices + cap=$(blockdev --getsize64 /dev/$dev | numfmt --to=iec | sed -e 's/\(.\)$/ \1/') + cap="[$cap]" + fi + model=$(smartctl -i /dev/$dev | grep -E 'Product:|Device Model:|Model Number:'|sed -e 's/^.*://' -e 's/^ *//') + echo "disk$d: $dev $cap $model" + (( d++ )) + done + vga=$(lspci|grep ' VGA '| sed -e 's/.*VGA compatible controller://') echo "VGA controller: $vga" + + if [ -d /sys/firmware/efi ]; then + efibootmgr + fi } if [ X$verbose = X1 ]; then diff -Nru fai-5.3.6ubuntu1/lib/task_sysinfo fai-5.9.4ubuntu1/lib/task_sysinfo --- fai-5.3.6ubuntu1/lib/task_sysinfo 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/task_sysinfo 2020-04-27 02:48:19.000000000 +0000 @@ -2,16 +2,19 @@ # display some information about the system and save it to the logserver +# activate all software RAID arrays +echo DEVICE partitions > /etc/mdadm/mdadm.conf +udevadm trigger # first show some hardware info echo Showing system information. # too much details [ -x "$(which dmidecode)" ] && dmidecode cd /sys/class/dmi/id -grep . {board_,bios_,product_}* 2>/dev/null| sed -e 's/:/: /'| egrep -iv '123456789|To Be Filled|: Not |N/A|:[[:blank:]]+$' +grep . {board_,bios_,product_}* 2>/dev/null| sed -e 's/:/: /'| grep -E -iv '123456789|To Be Filled|: Not |N/A|:[[:blank:]]+$' cd - >/dev/null -if [ -x "$(which lshw)" ]; then +if command -v lshw >&/dev/null; then lshwtmp=$(mktemp) lshw -short -quiet -C system,memory,processor,display,storage,disk | tee $lshwtmp echo @@ -26,7 +29,7 @@ numactl -H echo -if [ -x "$(which hwinfo)" ]; then +if command -v hwinfo >&/dev/null; then hwinfo --short --cpu --sys hwinfo --short --smp hwinfo --short --bios @@ -53,19 +56,20 @@ echo '==================================================' lspci -[ -x "$(which sfdisk)" ] && sfdisk -d +command -v sfdisk >&/dev/null && sfdisk -d -#[ -f /proc/scsi/scsi ] && cat /proc/scsi/scsi +if [ -d /sys/firmware/efi ]; then + efibootmgr +fi # start software raid /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf -/etc/init.d/mdadm-raid start /etc/init.d/lvm2 start for device in /dev/sd?; do [ -b "$device" ] || continue # make sure device exists and is valid block device [ `stat -c %G $device` = "disk" ] || continue - hdparm -I $device | egrep -v '^$' | head -5 | sed -e 's/^[[:blank:]]*//' + hdparm -I $device | grep -E -v '^$' | head -5 | sed -e 's/^[[:blank:]]*//' done # pretty print disks by id and device names @@ -74,8 +78,8 @@ echo cat /proc/partitions -[ -x "$(which lsblk)" ] && lsblk -i -[ -x "$(which blkid)" ] && blkid +command -v lsblk >&/dev/null && lsblk -i +command -v blkid >&/dev/null && blkid # very detailed for disk in $disklist; do @@ -86,6 +90,10 @@ LC_ALL=C file -s /dev/$disk?* | grep -v ": empty" done +if command -v nvme >&/dev/null; then + nvme list +fi + fdisk -lu dmsetup ls @@ -98,7 +106,7 @@ fai-mount-disk -f [ -f $target/etc/fstab ] && cp -p $target/etc/fstab $LOGDIR -df -PTh | egrep ':|^/|^Filesystem' +df -PTh | grep -E ':|^/|^Filesystem' # - - - - - - - - - - - save_dmesg fai-savelog -r diff -Nru fai-5.3.6ubuntu1/lib/updatebase fai-5.9.4ubuntu1/lib/updatebase --- fai-5.3.6ubuntu1/lib/updatebase 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/lib/updatebase 2020-04-27 02:48:19.000000000 +0000 @@ -10,8 +10,14 @@ if [ "$FAI_ACTION" = "install" -o "$FAI_ACTION" = "dirinstall" ]; then mount -t proc proc $FAI_ROOT/proc mount -t sysfs sysfs $FAI_ROOT/sys - [ -f /etc/init.d/udev ] && mount --bind /dev $FAI_ROOT/dev + if [ -f /etc/init.d/udev ]; then + mount --bind /dev $FAI_ROOT/dev + mount --make-private $FAI_ROOT/dev + mkdir -p $target/run/udev + mount --bind /run/udev $target/run/udev + fi mount -t devpts devpts $FAI_ROOT/dev/pts + mount --make-private $FAI_ROOT/dev/pts # if libc is upgraded init u is called in chroot environment and # then init will eat up much cpu time @@ -32,11 +38,7 @@ [ $? -ne 0 ] && $ROOTCMD apt-get $aptopt -f install $FAI_ROOT/$tmp diff -Nru fai-5.3.6ubuntu1/Makefile fai-5.9.4ubuntu1/Makefile --- fai-5.3.6ubuntu1/Makefile 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/Makefile 2020-04-27 02:48:16.000000000 +0000 @@ -7,15 +7,16 @@ SHAREDIR = $(DESTDIR)/usr/share/fai USRSBIN_SCRIPTS = fai-make-nfsroot fai-setup fcopy ftar install_packages fai-chboot fai-monitor fai-cd fai faireboot fai-statoverride setup-storage dhcp-edit fai-new-mac fai-diskimage -USRBIN_SCRIPTS = fai-class fai-do-scripts fai-mirror fai-debconf device2grub policy-rc.d.fai ainsl fai-monitor-gui fai-deps +USRBIN_SCRIPTS = fai-class fai-do-scripts fai-mirror fai-debconf device2grub policy-rc.d.fai ainsl fai-link fai-sed fai-monitor-gui fai-deps fai-mk-configspace # for syntax checks -BASH_SCRIPTS = bin/fai bin/fai-cd bin/fai-class bin/fai-debconf bin/fai-do-scripts bin/fai-make-nfsroot bin/fai-mirror bin/fai-setup bin/fai-diskimage bin/fai-statoverride bin/faireboot bin/ftar dev-utils/fai-kvm dev-utils/fai-mk-network examples/simple/basefiles/mk-basefile examples/simple/class/*.sh examples/simple/class/[0-9]* examples/simple/files/etc/rc.local/FAISERVER examples/simple/hooks/* examples/simple/scripts/*/* lib/fai-divert lib/fai-mount-disk lib/fai-savelog lib/fetch-basefile lib/get-boot-info lib/get-config-dir* lib/mkramdisk lib/mount2dir lib/prcopyleft lib/subroutines lib/task_* lib/updatebase lib/dracut/*/* +BASH_SCRIPTS = bin/fai bin/fai-cd bin/fai-class bin/fai-debconf bin/fai-do-scripts bin/fai-make-nfsroot bin/fai-mirror bin/fai-setup bin/fai-diskimage bin/fai-statoverride bin/faireboot bin/ftar bin/fai-link bin/fai-sed dev-utils/fai-kvm dev-utils/fai-mk-network examples/simple/basefiles/mk-basefile examples/simple/class/*.sh examples/simple/class/[0-9]* examples/simple/files/etc/rc.local/FAISERVER examples/simple/hooks/* examples/simple/scripts/*/* lib/fai-divert lib/fai-mount-disk lib/fai-savelog lib/fetch-basefile lib/get-boot-info lib/get-config-dir* lib/mkramdisk lib/mount2dir lib/prcopyleft lib/subroutines lib/task_* lib/updatebase lib/dracut/*/* bin/fai-mk-configspace lib/check-cross-arch SHELL_SCRIPTS = bin/dhclient-fai-script bin/policy-rc.d.fai lib/check_status lib/create_resolv_conf lib/fai-abort lib/fai-disk-info lib/load_keymap_consolechars utils/mkdebmirror PERL_SCRIPTS = lib/setup-storage/*.pm bin/ainsl bin/device2grub bin/dhcp-edit bin/fai-chboot bin/fai-deps bin/fai-monitor bin/fai-monitor-gui bin/fai-new-mac bin/fcopy bin/install_packages bin/setup-storage dev-utils/setup-storage_deps-graph.pl examples/simple/tests/Faitest.pm lib/dhclient-perl lib/fai-savelog-ftp -# do not include .svn dir and setup-storage subdir -libfiles=$(patsubst lib/setup-storage,,$(wildcard lib/[a-z]*)) +# do not include setup-storage and dracut subdir +EXCL=lib/dracut lib/setup-storage +libfiles=$(filter-out $(EXCL),$(wildcard lib/[a-z]*)) all: $(MAKE) syntaxcheck @@ -73,7 +74,7 @@ install: mkdir -p $(DESTDIR)/{sbin,man} $(DESTDIR)/etc/{modutils,apt/apt.conf.d} - mkdir -p $(DESTDIR)/usr/{sbin,bin} $(DESTDIR)/usr/lib/fai $(DESTDIR)/etc/fai/apt + mkdir -p $(DESTDIR)/usr/{sbin,bin} $(DESTDIR)/usr/lib/fai $(DESTDIR)/etc/fai/apt/trusted.gpg.d mkdir -p $(DESTDIR)/etc/{init,init.d} $(DESTDIR)/usr/share/fai/{pixmaps/small,setup-storage} mkdir -p $(DESTDIR)/usr/lib/dracut/modules.d install man/* $(DESTDIR)/man @@ -93,13 +94,14 @@ cd conf ; install -m644 fai.conf grub.cfg grub.cfg.autodiscover $(DESTDIR)/etc/fai/ install -m644 conf/nfsroot.conf $(DESTDIR)/etc/fai/ install -m644 conf/sources.list $(DESTDIR)/etc/fai/apt/ + install -m644 conf/fai-project.gpg $(DESTDIR)/etc/fai/apt/trusted.gpg.d/ install -m644 conf/NFSROOT $(DESTDIR)/etc/fai - install -m644 conf/upstart-fai.conf $(DESTDIR)/etc/init/fai.conf install -m755 lib/fai-abort $(DESTDIR)/etc/init.d cp -a pixmaps/*.gif $(DESTDIR)/usr/share/fai/pixmaps cp -a pixmaps/small/*.gif $(DESTDIR)/usr/share/fai/pixmaps/small - perl -pi -e 's/FAIVERSIONSTRING/$(VERSIONSTRING)/' $(DESTDIR)/usr/sbin/fai + sed -i 's/FAIVERSIONSTRING/$(VERSIONSTRING)/' $(DESTDIR)/usr/sbin/fai cp -a examples $(DOCDIR) + rm -f $(DOCDIR)/examples/simple/.git cp -a utils $(DOCDIR)/examples .PHONY: clean veryclean diff -Nru fai-5.3.6ubuntu1/man/ainsl.1 fai-5.9.4ubuntu1/man/ainsl.1 --- fai-5.3.6ubuntu1/man/ainsl.1 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/ainsl.1 2020-04-27 02:48:18.000000000 +0000 @@ -18,14 +18,14 @@ .B ainsl .RI [ options ] " FILE LINE [PATTERN]" .SH DESCRIPTION -Add LINE to the end of FILE if this file does not contain this line +Add LINE to the end of FILE if the file does not contain the line already. If PATTERN is given, then the LINE is only appended if PATTERN is not found in the file. Since ainsl is written in Perl, you can use Perl's regular expressions -in PATTERN. If PATTERN is not given, LINE is used instead for matching a line in -FILE. Then LINE may also contain the anchors '^' and '$' which -are only treated specialy at the beginning or end of the pattern and +in PATTERN. If PATTERN is not supplied, LINE is used instead for matching a line in +FILE. LINE may also contain the anchors '^' and '$' which +are only treated specially at the beginning or end of the pattern and are used for matching, not when adding the line. Additionally, the following characters are escaped in LINE: ( ) + @@ -71,8 +71,13 @@ .br ainsl \-v /etc/fstab '/dev/fd0 /floppy auto users,noauto 0 0' -Append the entry for the floppy device to /etc/fstab, if this line -isn't already included. +Append the entry for the floppy device to /etc/fstab, if the line +isn't already present. If the line is already in /etc/fstab, but is +commented out it will not be added unless you extend the pattern to +match only at the beginning of the line: + +ainsl \-v /etc/fstab '^/dev/fd0 /floppy auto users,noauto 0 0' + ainsl \-s /etc/exports '/srv/www @linuxhosts(async,rw) backup(async,ro)' @@ -99,7 +104,7 @@ .SH SEE ALSO .br This program is part of FAI (Fully Automatic Installation). See the FAI manual -for more information on how to use ainsl. The FAI homepage is http://fai-project.org. +for more information on how to use ainsl. The FAI homepage is https://fai-project.org. .SH AUTHOR Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai.8 fai-5.9.4ubuntu1/man/fai.8 --- fai-5.3.6ubuntu1/man/fai.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai.8 2020-04-27 02:48:18.000000000 +0000 @@ -20,6 +20,8 @@ .br .B fai .RI [ options ] " dirinstall DIRECTORY" +.br +.B fai .RI [ options ] " install DIRECTORY" .SH DESCRIPTION FAI allows for non-interactive @@ -41,7 +43,9 @@ .BI "\-c|\-\-class " class[,class] Define classes. Multiple classes must be comma separated. If not specified, use the shell environment variable $classes (space -separated). The first class has lowest priority. +separated). The first class has lowest priority. +You need the script class/01-classes in your config space for this to +work, since -c only sets the variable $cmdlineclasses. .TP .B \-h|\-\-help Show help, version and summary of options. @@ -160,7 +164,7 @@ .br This program is the central part of FAI (Fully Automatic Installation). See the FAI manual for more information on how to use FAI. -The FAI homepage is http://fai-project.org. +The FAI homepage is https://fai-project.org. .SH AUTHOR This manual page was written by Henning Glawe diff -Nru fai-5.3.6ubuntu1/man/fai-cd.8 fai-5.9.4ubuntu1/man/fai-cd.8 --- fai-5.3.6ubuntu1/man/fai-cd.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-cd.8 2020-04-27 02:48:18.000000000 +0000 @@ -1,7 +1,7 @@ .\" Hey, EMACS: -*- nroff -*- .if \n(zZ=1 .ig zZ .if \n(zY=1 .ig zY -.TH fai-cd 8 "Nov 2015" "FAI 5" +.TH fai-cd 8 "Oct 2017" "FAI 5" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -51,25 +51,31 @@ .br .SH DESCRIPTION This command creates a bootable ISO CD-ROM image that performs the -fully automatic installation from CD-ROM without an install server. The -ISO image will be written to FILE. To create the image, the -command needs the NFSROOT, the configuration space and optionally a partial -mirror, which is created by fai-mirror. The ISO image will contain a compressed -squashfs filesystem. This hybrid CD image can also +fully automatic installation from the CD-ROM without an install server. The +ISO image will be written to FILE. To create the image the +command requires the NFSROOT, configuration space, and optionally a partial +mirror (which is created by fai-mirror). The ISO image will contain a compressed +squashfs filesystem. This hybrid CD image can be written to an USB stick using dd(1). +NOTE: By default, fai-cd uses the grub file from /etc/fai/grub.cfg, which is +designed for demo purposes. This grub menu passes the "menu" flag to the +FAI_FLAGS parameter, which causes a menu with various installation and +boot options to be displayed on each boot. To avoid this, you must specify +your own grub file using the -g flag, as described below. + .SH OPTIONS .TP .BI \-A Create a boot only CD image (also usable for an USB stick) with -autodiscover function. The CD will scan the subnet for a FAI +autodiscover functionality. The CD will scan the subnet for a FAI server. By default it shows a menu with all profiles available from which you can select a type of installation. This image only needs 25MB. You can add the -J option to make the image smaller. .TP .BI \-B Create a boot only ISO image which does a network installation. It does not include the nfsroot, the -partitial mirror and the config space; however for it to automatically +partial mirror and the config space; however for it to automatically initiate the installation -d has to be set. By default CONFIG_SRC will be empty. .TP @@ -77,17 +83,20 @@ After creating the ISO image burn it by calling wodim(1) (a version of cdrecord). .TP -.BI "\-C " CFDIR -Use CFDIR as the configuration directory. Default is /etc/fai. You can -also set the environment variable FAI_ETC_DIR. +.BI "\-c " DIRECTORY +Override the value of FAI_CONFIGDIR set in nfsroot.conf. +.TP +.BI "\-C " DIRECTORY +Use DIRECTORY as the configuration directory instead of the default +/etc/fai. You can also set the environment variable FAI_ETC_DIR. .TP .BI "\-d " URL -Do not include the config space in the image and set the location of the -config space to URL. This sets FAI_CONFIG_SRC in the grub config, which +Do not include the config space in the image. Instead set the variable +to the location of the config space to URL. This sets FAI_CONFIG_SRC in the grub config, which is obtained from the FAI configuration dir (see -C). Set it to "" to not -set FAI_CONFIG_SRC. If not set, the config space is taken from +set FAI_CONFIG_SRC at all. If not set, the config space is taken from FAI_CONFIGDIR and copied to /var/lib/fai/config in the image. Currently -no file: is allowed here, instead set FAI_CONFIGDIR in fai.conf(5). +no file: is allowed here, instead set FAI_CONFIGDIR in nfsroot.conf(5). .TP .BI \-e Exclude the directory /var/tmp from the nfsroot. You may put the @@ -99,7 +108,7 @@ Force removal of an existing ISO image before creating a new one. .TP .BI "\-g " FILE -Use FILE as grub grub.cfg file. The script will look for FILE +Use FILE as the grub.cfg file. The script will look for FILE in CFDIR. If FILE is located in another directory then a full path must be specified. If not specified, use /etc/fai/grub.cfg. .TP @@ -123,11 +132,23 @@ Use DIRECTORY as partial FAI mirror. This option is mandatory, unless you use -M or -B. .TP +.BI "\-n " DIRECTORY +Override the value of NFSROOT set in nfsroot.conf. +.TP +.BI "\-s " blocks +Add additional disk space to the image. Increases the size by the +number of 1M blocks specified. +.TP .BI \-S Create a squashfs image file instead of a complete iso. The image contains the nfsroot and can be fetched through various ways over the network. For an example, see the section "FAI without NFS" in the FAI Guide. +.TP +.BI \-V +Set the volume id of the ISO. Default id is FAI_CD. You also must +adjust the CDLABEL in /etc/fai/grub.cfg, or use -g and specify +your own grub.cfg. .SH EXAMPLES .br After you've created a mirror with fai-mirror in /media/mirror, you @@ -162,6 +183,16 @@ # fai-cd \-JAg /etc/fai/grub.cfg.autodiscover fai-autod.iso +Create a minimalistic compressed network boot ISO image (~350MB) without the partial mirror and basefiles: + + # fai-cd -BMJe fai-cd.iso + +This ISO image can even be further reduced in size using the -s flag to fai-make-nfsroot(8). + +Specify your own grub file: + + # fai-cd -g /srv/fai/config/my_extras/grub.cfg -m /srv/fai/mirror /srv/fai/iso/fai-cd.iso + .SH NOTES Additional kernel command line options can be found in the man page of dracut.cmdline(7). fai-cd needs enough disk space in TMPDIR (/tmp by @@ -174,6 +205,8 @@ .BR fai\-mirror(1) .BR mksquashfs(1) + +.BR fai-make-nfsroot(8) .SH FILES .PD 0 .TP diff -Nru fai-5.3.6ubuntu1/man/fai-chboot.8 fai-5.9.4ubuntu1/man/fai-chboot.8 --- fai-5.3.6ubuntu1/man/fai-chboot.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-chboot.8 2020-04-27 02:48:18.000000000 +0000 @@ -132,6 +132,10 @@ .ti 19 SYSUUID=00234567-1111-2222-3333-123456789000 .TP +.B \-q +Query the absolute patch and filename of the PXE configuration file for a host or a list +of hosts. +.TP .BI "\-s " SUFFIX Use SUFFIX to determine which kernel and initrd to use. .TP @@ -207,7 +211,7 @@ The pxelinux documentation. .TP -This program is part of FAI (Fully Automatic Installation). See the FAI manual for more information on how to use fai-chboot. The FAI homepage is http://fai-project.org. +This program is part of FAI (Fully Automatic Installation). See the FAI manual for more information on how to use fai-chboot. The FAI homepage is https://fai-project.org. .SH AUTHOR Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai-class.1 fai-5.9.4ubuntu1/man/fai-class.1 --- fai-5.3.6ubuntu1/man/fai-class.1 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-class.1 2020-04-27 02:48:18.000000000 +0000 @@ -21,7 +21,7 @@ This command is only called internally by FAI and not directly by the user. fai\-class executes scripts in DIRECTORY to define classes. All classes -are written to CLASSFILE, each class on a separate line. Use absolute paths +are written to CLASSFILE, each class will be placed on a separate line. Use absolute paths for both arguments. All scripts or executables matching "^[0\-9][0\-9]*" (they start with two digits) are executed in alphabetical order. They can define classes by writing the names of the classes to stdout. Classes can be separated by spaces @@ -43,9 +43,9 @@ The order of the classes is important because it defines the priority of the classes from low to high. First, the class DEFAULT is -defined. Then all scripts are executed to define classes. After that, -the classes from the file $LOGDIR/additional\-classes are added. Then, -all classes in the file with the hostname are added. Then classes +defined, then all scripts are executed to define the classes. After that, +the classes from the file $LOGDIR/additional\-classes are added. Subsequently, +all classes in the file with the hostname are added. Finally classes defined by the variable ADDCLASSES are used. This variable must be a comma separated list of classes. You can define this variable on the kernel command line. @@ -145,7 +145,7 @@ ADDCLASSES=CLASS1,CLASSX,CLASS3 .SH "NOTES" -All class names should be written in uppercase letters (execpt the +All class names should be written in uppercase letters (except the class of the hostname). Do not use a dash, use an underscore. Only executable scripts in DIRECTORY are used. CLASSFILE is removed before writing to it. Scripts should not directly write to CLASSFILE. LOGDIR diff -Nru fai-5.3.6ubuntu1/man/fai.conf.5 fai-5.9.4ubuntu1/man/fai.conf.5 --- fai-5.3.6ubuntu1/man/fai.conf.5 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai.conf.5 2020-04-27 02:48:18.000000000 +0000 @@ -53,7 +53,10 @@ .LP The following protocols and URL schemes are currently supported: .IP \(bu -NFS: nfs:/// +NFS: nfs://[server]/ + +If the server is not specified, FAI tries to extract the server name +from the nfsroot mount. Example: nfs://faiserver/srv/fai/config .IP \(bu @@ -73,6 +76,11 @@ .IP \(bu Git: git[+]:// +You can specify the branch by adding # without a whitspace +before the #. + +Example: git+ssh:://user@servername/srv/git/..../fai.git#branchname + The config space checked out from a git repository, host can be empty. Also supported is git+http. .IP \(bu @@ -149,7 +157,7 @@ .br This file is part of FAI (Fully Automatic Installation). See the FAI -manual for more information. The FAI homepage is http://fai-project.org. +manual for more information. The FAI homepage is https://fai-project.org. .SH AUTHOR This man page was written by Michael Tautschnig . diff -Nru fai-5.3.6ubuntu1/man/fai-debconf.1 fai-5.9.4ubuntu1/man/fai-debconf.1 --- fai-5.3.6ubuntu1/man/fai-debconf.1 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-debconf.1 2020-04-27 02:48:18.000000000 +0000 @@ -21,12 +21,12 @@ This command is only called internally by FAI and not directly by the user. fai\-debconf reads files in DIRECTORY which are also a defined -class. If the name of the class is a directory, all files in this +class. If the name of the class is a directory, all files in the directory are read. The files must have the format of debconf\-get\-selections(1). -All this input is used to call debconf\-set\-selections(1). This is done -in the chroot environment, if the variable $ROOTCMD is set. After +All the input is used to call debconf\-set\-selections(1). This is done +in the chroot environment if the variable $ROOTCMD is set. After setting the debconf values, dpkg\-reconfigure(8) is called for every -package which is installed and for which some debconf data was set. +installed package and for which some debconf data was set. .SH "OPTIONS" .TP diff -Nru fai-5.3.6ubuntu1/man/fai-diskimage.8 fai-5.9.4ubuntu1/man/fai-diskimage.8 --- fai-5.3.6ubuntu1/man/fai-diskimage.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-diskimage.8 2020-04-27 02:48:18.000000000 +0000 @@ -1,5 +1,5 @@ .\" Hey, EMACS: -*- nroff -*- -.TH fai-diskimage 8 "November 2016" "FAI 5.3" +.TH fai-diskimage 8 "September 2018" "FAI 5.7" .SH NAME fai-diskimage \- create a disk image for booting a VM @@ -8,20 +8,15 @@ .SH DESCRIPTION .B fai-diskimage creates a disk image that can be used with Qemu/KVM, VirtualBox, -VMware, Xen or by your cloud infrastructure. It runs the Fully +VMware, Xen, Android device or by your cloud infrastructure. It runs the Fully Automatic Installation using a list of FAI classes. In the end you -have a bootable disk image. +have a bootable disk image. Following formats are +supported: .raw.xz, .raw.zst, .qcow2, .vdi, .vhdx, .vmdk, .simg. .SH OPTIONS .TP .B \-c, --class \fICLASS\fR[,\fICLASS\fR] Define list of FAI classes .TP -.B -D, --debug -Enter debugging after the FAI process has finished. Therefore the -fai-diskimage script is stopped and you may enter the chroot for -debugging purpose. When finished, leave the chroot and send a CONT -signal for resuming the fai-diskimage script. -.TP .B -h, --help Print help .TP @@ -45,39 +40,54 @@ .SH EXAMPLES - # export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ - # fai-diskimage -vNu cloud3 -S2G -cJESSIE64,GCE disk.raw +First, setup the configuration space. You will get an initial +configuration including several examples. + + # fai-mk-configspace + +You can now build your fist disk image. + + # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ + # cl="DEBIAN,STRETCH64,AMD64,FAIBASE,GRUB_PC,DHCPC,DEMO,CLOUD,LAST" + # fai-diskimage -vu cloud3 -S2G -c$cl cloud.raw Creates a Debian system with a small set of software packages without -graphical desktop. The disk image disk.raw will be of size 2 GB and -the host ist called cloud3. +graphical desktop. The disk image cloud.raw will be of size 2 GB and +the host is called cloud3. - # export FAI_BASEFILEURL=http://fai-project.org/download/basefiles/ - # cl=DHCPC,UBUNTU,XENIAL,XENIAL64,XORG - # fai-diskimage -vNu cloudhost -S5G -c$cl ubuntu.qcow2 + # export FAI_BASEFILEURL=https://fai-project.org/download/basefiles/ + # cl=DHCPC,UBUNTU,XENIAL,XENIAL64,AMD64,XORG,LAST + # fai-diskimage -vNu ubuntu -S7G -c$cl ubuntu.qcow2 -Creates a disk image of size 5GB called ubuntu.qcow2 for a Ubuntu 16.04 desktop. +Creates a disk image of size 7GB called ubuntu.qcow2 for a Ubuntu 16.04 desktop. .SH NOTES +fai-diskimage will use zerofree if it's available on the host for +getting better compression of the raw images. + Before creating an image, make sure you have the configuration space available. Create the config space for FAI by using the examples from the fai-doc package. - # mkdir -p /srv/fai/config - # cp -a /usr/share/doc/fai-doc/examples/simple /srv/fai/config + # fai-mk-configspace fai-diskimage is not limited to creating images for virtual -machines. The raw images can also be copies (via dd) onto a real disk +machines. The raw images can also be copied (via dd) onto a real disk for booting bare metal hosts. You can start fai-diskimage in a clean shell environment by calling: - # env -i /usr/sbin/fai-diskimage -vNu cloudhost -S5G -cJESSIE64,GCE disk.raw + # env -i /usr/sbin/fai-diskimage -vNu cloudhost -S5G -cSTRETCH64,GCE disk.raw + + +You can also build cross-architecture disk images using +fai-disimage. See the chapter "Building cross-architecture disk +images" in the FAI guide for details. .SH SEE ALSO .br This program is part of FAI (Fully Automatic Installation). See the FAI manual -for more information on how to use fai-monitor. The FAI homepage is http://fai-project.org. +for more information on how to use fai-monitor. The FAI homepage is https://fai-project.org. .SH AUTHOR Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai-do-scripts.1 fai-5.9.4ubuntu1/man/fai-do-scripts.1 --- fai-5.3.6ubuntu1/man/fai-do-scripts.1 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-do-scripts.1 2020-04-27 02:48:18.000000000 +0000 @@ -23,7 +23,7 @@ fai\-do\-scripts executes all scripts in DIRECTORY which are also a defined class. If the name of the class is a directory, all scripts that match `/^[0\-9][0\-9].*' (starting with two digits) in this -directory are executed. So it is +directory are executed. It is possible to have several scripts of different types (shell, cfengine,...) be executed for one class. diff -Nru fai-5.3.6ubuntu1/man/fai-link.1 fai-5.9.4ubuntu1/man/fai-link.1 --- fai-5.3.6ubuntu1/man/fai-link.1 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-link.1 2020-02-20 21:53:09.000000000 +0000 @@ -0,0 +1,20 @@ +.\" Hey, EMACS: -*- nroff -*- +.TH fai-link 1 "2019" "FAI 5" + +.SH NAME +fai-link \- create symlink idempotent +.SH SYNOPSIS +.B fai-link +.RI "SOURCE TARGET" +.SH DESCRIPTION +Check if a symlink from SOURCE to TARGET already exists and do nothing if it's +already the same symlink. If $target is defined, use it as prefix for SOURCE. +If $verbose is set, the command prints if no change is to be made. The order +of the arguments are different to the ln(1) command. +.br +.SH SEE ALSO +.br +This program is part of FAI (Fully Automatic Installation). See the FAI manual +for more information on how to use fai-monitor. The FAI homepage is https://fai-project.org. +.SH AUTHOR +Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai-make-nfsroot.8 fai-5.9.4ubuntu1/man/fai-make-nfsroot.8 --- fai-5.3.6ubuntu1/man/fai-make-nfsroot.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-make-nfsroot.8 2020-04-27 02:48:18.000000000 +0000 @@ -1,7 +1,7 @@ .\" Hey, EMACS: -*- nroff -*- .if \n(zZ=1 .ig zZ .if \n(zY=1 .ig zY -.TH fai-make-nfsroot 8 "April 2015" "FAI 5" +.TH fai-make-nfsroot 8 "February 2018" "FAI 5.5.4" .de }1 .ds ]X \&\\*(]B\\ .nr )E 0 @@ -38,7 +38,7 @@ .SH OPTIONS .TP .B \-a -Adjust a generic nfsroot. Add resolv.conf, add host entries, set the root password. +Adjust a generic nfsroot. Add resolv.conf, add host entries, and/or set the root password. .TP .B \-B BASETGZ Use specified BASETGZ file as base.tgz (or base.tar.gz, base.tar.xz, base.txz) @@ -61,17 +61,27 @@ nfsroot. See also -a. .TP .B \-K -Remove all kernels from NFSROOT. This is the same as calling aptitude -purge ~nlinux-image inside the nfsroot. +Remove all kernels from NFSROOT. .TP .B \-k Install additional packages defined in /etc/fai/NFSROOT into the nfsroot. Also copies all kernels from the nfsroot to the directory $TFTPROOT. +You can use this option, to upgrade all packages inside the nfsroot. +.TP +.B \-N +Additionally install non-free packages defined in the NONFREE section of /etc/fai/NFSROOT. +.TP +.B \-P +Preserve ssh configs including the keys of the root account and also +the ssh host keys from inside the nfsroot. .TP .B \-p Preserve ssh configs including the keys of the root account. This will not preserve the ssh host keys inside the nfsroot. .TP +.B \-s +Create a smaller nfsroot. Do not install packages defined in /etc/fai/NFSROOT in the FULL section. +.TP .B \-v Create verbose output on stdout. .TP @@ -93,7 +103,7 @@ This program is part of FAI (Fully Automatic Installation). See the FAI manual for more information on how to use fai-make-nfsroot. The FAI homepage is -http://fai-project.org. +https://fai-project.org. .SH FILES .PD 0 .TP diff -Nru fai-5.3.6ubuntu1/man/fai-mirror.1 fai-5.9.4ubuntu1/man/fai-mirror.1 --- fai-5.3.6ubuntu1/man/fai-mirror.1 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-mirror.1 2020-04-27 02:48:18.000000000 +0000 @@ -64,7 +64,7 @@ .BI \-b Create the mirror only from packages names in /srv/fai/config. Do not include packages from /etc/fai/NFSROOT, but also do not remove -packages that are in base.tar.xz. This is useful if your partitial +packages that are in base.tar.xz. This is useful if your partial mirror does not match the Linux distribution of the nfsroot, or if you do not have a nfsroot yet. .TP @@ -86,6 +86,9 @@ Exclude these classes. Do not add the packages of these classes to the mirror. .TP +.B "\-s " DIRECTORY +Override the value of FAI_CONFIGDIR set in nfsroot.conf. +.TP .B "\-P " FILE Copy an APT preferences file into the cache config before creating the mirror. Using this you can set pin priority for packages to a certain release. @@ -93,6 +96,10 @@ .B \-p Preserve existing sources.list. NOT YET IMPLEMENTED. .TP +.B \-V +Read variable definitions from class/*.var if used in +package_config/. +.TP .B \-v Create verbose output. @@ -123,7 +130,7 @@ .SH SEE ALSO .br This program is part of FAI (Fully Automatic Installation). -The FAI homepage is http://fai-project.org. +The FAI homepage is https://fai-project.org. .TP \fBfai-make-nfsroot\fP(8), \fBinstall_packages\fP(8) .PD diff -Nru fai-5.3.6ubuntu1/man/fai-mk-configspace.1 fai-5.9.4ubuntu1/man/fai-mk-configspace.1 --- fai-5.3.6ubuntu1/man/fai-mk-configspace.1 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-mk-configspace.1 2018-03-10 20:42:17.000000000 +0000 @@ -0,0 +1,22 @@ +.\" Hey, EMACS: -*- nroff -*- +.TH fai-mk-configspace 1 "2018" "FAI 5" + +.SH NAME +fai-mk-configspace \- set up the FAI config space +.SH SYNOPSIS +.B fai-mk-configspace +.SH DESCRIPTION +.B fai-mk-configspace +Create the directory defined in $FAI_CONFIGDIR and +copy the examples for the FAI config space into it. +.P +.SH OPTIONS +.TP +.B "-h " +Print short help. +.P +.br +This program is part of FAI (Fully Automatic Installation). See the FAI manual +for more information on how to use fai-monitor. The FAI homepage is https://fai-project.org. +.SH AUTHOR +Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai-monitor.8 fai-5.9.4ubuntu1/man/fai-monitor.8 --- fai-5.3.6ubuntu1/man/fai-monitor.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-monitor.8 2020-04-27 02:48:18.000000000 +0000 @@ -38,6 +38,12 @@ .TP .B "-T" Print timestamps in the log. +.TP +.B "-f FORMAT" +Use strftime(FORMAT) for timestamp formatting. +.TP +.B "-Z" +Use gmtime/UTC instead of local time. .SH NOTES Normally, the output will be piped to fai-monitor-gui, a GUI which displays all information. @@ -51,6 +57,6 @@ .SH SEE ALSO .br This program is part of FAI (Fully Automatic Installation). See the FAI manual -for more information on how to use fai-monitor. The FAI homepage is http://fai-project.org. +for more information on how to use fai-monitor. The FAI homepage is https://fai-project.org. .SH AUTHOR Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai-monitor-gui.1 fai-5.9.4ubuntu1/man/fai-monitor-gui.1 --- fai-5.3.6ubuntu1/man/fai-monitor-gui.1 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-monitor-gui.1 2020-04-27 02:48:18.000000000 +0000 @@ -21,6 +21,6 @@ .P .br This program is part of FAI (Fully Automatic Installation). See the FAI manual -for more information on how to use fai-monitor. The FAI homepage is http://fai-project.org. +for more information on how to use fai-monitor. The FAI homepage is https://fai-project.org. .SH AUTHOR Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai-sed.1 fai-5.9.4ubuntu1/man/fai-sed.1 --- fai-5.3.6ubuntu1/man/fai-sed.1 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-sed.1 2020-02-20 21:53:09.000000000 +0000 @@ -0,0 +1,32 @@ +.\" Hey, EMACS: -*- nroff -*- +.TH fai-sed 1 "2019" "FAI 5" + +.SH NAME +fai-sed \- call sed on a file but check for changes before writing +.SH SYNOPSIS +.B fai-sed +.RI "CMD FILE" +.SH DESCRIPTION +Execute a sed command, CMD, on FILE +but do not overwrite the file if nothing changes. If $target is +defined, use it as prefix for the path to FILE. + +The exit code is 0 if no changes were done, 1 if the file was changed +and exit codes greater 1 indicate errors. +.P +.SH EXAMPLES +.br +$ fai-sed 's/foo/bar/g' /etc/motd + +Replace foo with bar in file /etc/motd. + +$ fai-sed 's/123/ABC/g; /XXX/d' /etc/motd + +Replace 123 with ABC and delete all lines which contain the string XXX. +.br +.SH SEE ALSO +.br +This program is part of FAI (Fully Automatic Installation). See the FAI manual +for more information on how to use fai-monitor. The FAI homepage is https://fai-project.org. +.SH AUTHOR +Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/fai-setup.8 fai-5.9.4ubuntu1/man/fai-setup.8 --- fai-5.3.6ubuntu1/man/fai-setup.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fai-setup.8 2020-04-27 02:48:18.000000000 +0000 @@ -41,11 +41,10 @@ .SH DESCRIPTION Fully Automatic Installation (FAI) is used to provide unattended installation of Debian GNU/Linux operating systems with a very flexible class-based system. -fai-setup is a shell script written for FAI to create the initial NFSROOT -directory, add that directory to the NFS exports configuration file -(/etc/exports), prepare the files as necessary to create the network boot floppy -disk, and create the initial fai user that is used for copying over the installation -logs to a centralized directory on the server. fai-make-nfsroot(8) is called +fai-setup creates the initial NFSROOT directory and the configuration space. +It sets up the NFS exports configuration file (/etc/exports), and +create the initial fai user that is used for copying over the +installation logs to a centralized directory on the server. fai-make-nfsroot(8) is called to create the initial NFS root directory. fai-setup should be called after each change to /etc/fai/fai.conf. @@ -59,12 +58,13 @@ also set the environment variable FAI_ETC_DIR. .TP .B \-e -Expert mode. Do not add entries to /etc/export and do not restart the nfs nserver. +Expert mode. Do not add entries to /etc/export, do not restart the nfs server, +and do not add to /var/log/fai/variables. .SH SEE ALSO .PD 0 This program is part of FAI (Fully Automatic Installation). See the FAI manual for more information on how to use fai-setup. The FAI homepage is -http://fai-project.org. +https://fai-project.org. .TP \fIfai-make-nfsroot\fP(8), \fIexports\fP(5) .PD diff -Nru fai-5.3.6ubuntu1/man/fcopy.8 fai-5.9.4ubuntu1/man/fcopy.8 --- fai-5.3.6ubuntu1/man/fcopy.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/fcopy.8 2020-04-27 02:48:18.000000000 +0000 @@ -1,5 +1,5 @@ .\" Hey, EMACS: -*- nroff -*- -.TH fcopy 8 "18 November 2014" "FAI 4" +.TH fcopy 8 "8 February 2019" "FAI 5.8" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -19,7 +19,7 @@ .RI [ options ] " SOURCE" ... .SH DESCRIPTION Copy a file from SOURCE to its target using classes. -It also sets permission modes, owner and group. +It also sets permission modes for owner and group. Each SOURCE argument is a directory which contains one or more template files for the source file to copy. Depending on the list of defined classes, one file of the source directory is selected and @@ -67,7 +67,8 @@ If source is a symbolic link, make destination a symbolic link too. .TP .B \-i -Ignore warnings about no matching class and always exit with 0. +Ignore warnings about no matching class and non-existing source +directories. These warnings will not set the exit code to 1. .TP .BI "\-I " dir[,dir] Override list of ignored directories when recursing. If not given, it is @@ -106,6 +107,13 @@ Look for SOURCE files relative to \fIsource_dir\fR. Use $FAI/files if not specified. .TP +.BI "\-S " +Enable variable substitution. Every occurence of the pattern {%varname%} +will be substituted by the value of the shell variable $varname which +is mostly set in class/CLASSNAME.var. You can enable it for all calls of +fcopy by setting the environment variable $FCOPY_SUBSTITUTE. Variable +substitution is done before the execution of the preinst script. +.TP .BI "\-t " target_dir Copy files relative to \fItarget_dir\fR. Use $FAI_ROOT if not specified. .TP @@ -177,18 +185,21 @@ .PP In FAI the list of defined classes starts with DEFAULT and the -last class is the hostname. So DEFAULT is only used when no file for +last class is the hostname. DEFAULT is only used when no file for another class exists. If a file is equal to the hostname, this will be used, since hostname should always be the last class. User, group and permissions for the files can be defined in several -ways. Option \-m has the highest priority and will be used for all -files, if specified. The file file-modes in the source directory can +ways. The file file-modes in the source directory has the highest priority, +followed by modes specified by -m/-M. If neither applies, the +modes from the source file are used. + +The file file-modes in the source directory can contain one line for each class. The space separated parameters are: owner group mode class -where owner and group can be specified by numeric id or by name. The +Where owner and group can be specified by numeric id or by name. The file permissions are defined by mode, which must be octal. If class is missing, the data is used for all other classes, for which no data is defined. If neither \-m or file-modes data is available, the user, @@ -199,7 +210,7 @@ source file, the suffix .pre_fcopy is appended to the old version of the target file. If source and target files are equal, no copy is performed. A copied file gets the same access and modification time as the source file, not -the time of the copy. If also the file postinst exists, it will be +the time of the copy. If the file postinst exists, it will be executed after the file was copied. .SH NOTES @@ -215,7 +226,7 @@ .br This program is part of FAI (Fully Automatic Installation). See the FAI manual -for more information on how to use fcopy. The FAI homepage is http://fai-project.org. +for more information on how to use fcopy. The FAI homepage is https://fai-project.org. .SH AUTHOR Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/ftar.8 fai-5.9.4ubuntu1/man/ftar.8 --- fai-5.3.6ubuntu1/man/ftar.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/ftar.8 2020-04-27 02:48:18.000000000 +0000 @@ -103,7 +103,7 @@ .br This program is part of FAI (Fully Automatic Installation). See the FAI manual -for more information on how to use ftar. The FAI homepage is http://fai-project.org. +for more information on how to use ftar. The FAI homepage is https://fai-project.org. .SH AUTHOR Thomas Lange diff -Nru fai-5.3.6ubuntu1/man/install_packages.8 fai-5.9.4ubuntu1/man/install_packages.8 --- fai-5.3.6ubuntu1/man/install_packages.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/install_packages.8 2020-04-27 02:48:18.000000000 +0000 @@ -1,7 +1,7 @@ .\" Hey, EMACS: -*- nroff -*- .if \n(zZ=1 .ig zZ .if \n(zY=1 .ig zY -.TH install_packages 8 "December 2016" "FAI 5.3" +.TH install_packages 8 "April 2018" "FAI 5.6" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -73,7 +73,9 @@ Dry run. Do not execute installation commands, just print them. .TP .B \-N -Do not check package names whether they are valid. +Do not check package names whether they are valid and remove unknown +packages from the list. You can also set the variable +FAI_DISABLE_PACKAGE_NAME_CHECK to 1. .TP .BI "\-p " DIRECTORY Read the configuration files from DIRECTORY instead of $FAI/packages_config. @@ -98,7 +100,7 @@ This program is part of FAI (Fully Automatic Installation). See the FAI manual for more information on how to use install_packages. The FAI homepage is -http://fai-project.org. +https://fai-project.org. .PD .SH FILES .PD 0 diff -Nru fai-5.3.6ubuntu1/man/nfsroot.conf.5 fai-5.9.4ubuntu1/man/nfsroot.conf.5 --- fai-5.3.6ubuntu1/man/nfsroot.conf.5 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/nfsroot.conf.5 2020-04-27 02:48:18.000000000 +0000 @@ -21,7 +21,7 @@ called as the first part of fai-make-nfsroot unless -B is used. This variable defines SUITE and MIRROR for debootstrap. Example: -FAI_DEBOOTSTRAP="wheezy http://httpredir.debian.org/debian" +FAI_DEBOOTSTRAP="stretch http://deb.debian.org/debian" .TP .B NFSROOT_ETC_HOSTS @@ -40,7 +40,7 @@ Use mkpasswd, htpasswd or md5pass for generating the password hash. -echo "yoursecrectpassword" | mkpasswd -Hmd5 -s +echo "yoursecrectpassword" | mkpasswd -m md5 -s .TP .B NFSROOT @@ -57,6 +57,12 @@ fai-cd(8), fai-mirror(1) and fai-setup(8). .TP +.B SERVERINTERFACE +Used to specify the interface when detecting the subnet for the +exportfs line. Only needed when the install server has multiple +interfaces. + +.TP .B SSH_IDENTITY Location of a ssh public key file. This user can log into the install clients in as root without a password. Only useful with @@ -90,7 +96,7 @@ .br This file is part of FAI (Fully Automatic Installation). The FAI -homepage is http://fai-project.org. +homepage is https://fai-project.org. .SH AUTHOR This man page was written by Thomas Lange . diff -Nru fai-5.3.6ubuntu1/man/setup-storage.8 fai-5.9.4ubuntu1/man/setup-storage.8 --- fai-5.3.6ubuntu1/man/setup-storage.8 2017-04-20 15:48:57.000000000 +0000 +++ fai-5.9.4ubuntu1/man/setup-storage.8 2020-04-27 02:48:18.000000000 +0000 @@ -1,4 +1,4 @@ -.TH setup-storage 8 "November 18, 2016" "Debian GNU/Linux" +.TH setup-storage 8 "Sep 18, 2017" "Debian GNU/Linux" .SH NAME \fBsetup-storage\fP \- automatically prepare storage devices @@ -15,14 +15,15 @@ .SH DESCRIPTION Using FAI disk_config files, \fBsetup-storage\fP -computes effective partition and volume sizes and executes the necessary -commands to configure storage devices. It manages disk drives as well as RAID -and LVM volumes plus encryption and tmpfs. It handles following -filesystems: \fBext2/3/4\fP, \fBvFAT(FAT32)\fP, \fBmsdos(FAT16)\fP, \fBreiserFS\fP, \fBXFS\fP and -\fBBTRFS\fP but is flexible enough to be extended to further types as well. -Once the storage devices are prepared, an appropriate -\fBfstab\fP(5) (and possibly also a \fBcrypttab\fP(5) -file is generated. +Computes effective partition and volume sizes and executes the necessary +commands to configure storage devices. It manages disk drives, RAID and LVM +volumes, along with encryption and tmpfs. Disks and partitions are designated +by \fBdisk1.2\fP, \fBdisk3.1\fP etc. and may thus be referenced as such. +Currently, setup-storage handles following filesystems: \fBext2/3/4\fP, +\fBvFAT(FAT32)\fP, \fBmsdos(FAT16)\fP, \fBreiserFS\fP, \fBXFS\fP and +\fBBTRFS\fP but could easily be extended to further types as well. +Once the storage devices are prepared, an appropriate \fBfstab\fP(5) (and +possibly also a \fBcrypttab\fP(5) file is generated. Without the \fB\-X\fP @@ -71,8 +72,9 @@ .TP \fB\-D\fP \fIdisks\fP Specify the list of disk drives to be configured using -\fBsetup-storage\fP. Overrides -.IR disklist. Do not forget to quote this space separated list. +\fBsetup-storage\fP. Overrides the variable +\fIdisklist\fP. +Do not forget to quote this space separated list. .TP \fB\-L\fP \fIdirectory\fP @@ -82,6 +84,10 @@ .TP \fB\-h\fP Display the synopsis and version info and exit. + +.TP +\fB\-y\fP +Print disk variables as YAML file into disk_var.yml .SH ENVIRONMENT \fBsetup-storage\fP will use the following environment variables: @@ -92,7 +98,7 @@ is not used, the .IR disklist variable may contain a space separated list of disk drives available in the -system. Their order matters as they may be referred to as disk1, etc. in +system. Their order matters as they may be referred to as disk1, and so on, in disk_config. If unset, fai-disk-info will be called to determine the list. .TP .B debug @@ -120,6 +126,11 @@ This variable determines if partitions should be preserved when they are tagged with preserve_reinstall (see below for details). Normally set by the list of FAI flags (FAI_FLAGS). +.TP +.B SS_IGNORE_VG +This variable may contain a list of volume groups, that are ignored by +setup-storage. The list can be comma or space separated. It's used by +fai-diskimage. .SH FILES If \fBsetup-storage\fP @@ -257,8 +268,8 @@ disk_config lvm vg my_pv sda2 -my_pv-_swap swap 2048 swap sw -my_pv-_root / 2048 ext3 rw +my_pv_swap swap 2048 swap sw +my_pv_root / 2048 ext3 rw .sp .fi .PP @@ -356,6 +367,25 @@ .PP .TP +Plain disk + LUKS + LVM2 example +.sp +.nf +.ta 10n 20n 30n 40n 50n + +disk_config disk1 disklabel:gpt bootable:1 fstabkey:uuid align-at:1M +primary - 100% - - + +disk_config cryptsetup +luks:"passwd" - disk1.1 - - + +disk_config lvm fstabkey:uuid +vg vg1 disk1.1 +vg1-root / 30%- ext4 defaults,errors=remount-ro,noatime,rw +.sp +.fi +.PP + +.TP tmpfs example .sp .nf @@ -374,6 +404,20 @@ Mount a tmpfs on /scratch with a maximum size of 3 GiB. .TP +nfs example +.sp +.nf +.ta 10n 20n 30n 40n 50n +disk_config nfs +nfs 11.22.33.44:/export/vm-root/HOSTNAME / defaults +.sp +.fi +.PP +.IP \(bu +A diskless client setup. Mount the whole OS file system via NFS from +an NFS server onto /. + +.TP Simple BTRFS example .sp .nf @@ -450,7 +494,7 @@ .PP .IP \(bu Creating a ESP partition is very simple. Use a GPT partition table, -create a vfat partitoon which is aslo bootable. That's it. +create a vfat partition which is also bootable. That's it. @@ -770,11 +814,11 @@ /* mkfs.xxx must exist */ .br -luks_options ::= (lukscreateoptions=".*") +luks_options ::= (lukscreateopts=".*") .br /* options to supply to cryptsetup when creating a LUKS * encrypted filesystem. If no ciper (-c) is specified, then - * aes-cbc-essiv:sha2 is used. If no key size (-s) is + * aes-xts-plain64 is used. If no key size (-s) is * specified then 256 is used. */ .br @@ -792,6 +836,12 @@ config. Otherwise the client will not be able to use these features. .IP \(bu +MD devices aka software RAID will not be synced during a new +installation because it would slow down the installation heavily. +Therefore setup-storage will set the sync_action of each device to +frozen. The sync will start after the next reboot. + +.IP \(bu Machine does not boot because no partition is marked as bootable: If the bootable option is not specified, not partition will be marked as such. Modern BIOSes don't seem to require such markers anymore, but for some systems it may @@ -809,22 +859,27 @@ config. .IP \(bu For backwards compatibility or other system-specific reasons an alignment to -cylinder boundaries may be necessary. Yet other systems will have other +cylinder boundaries may be necessary. Other systems might have other alignment constraints. setup-storage sets the alignment as follows: If align-at is set, align accordingly. Otherwise, if any partition on the particular disk is -to be preserved, default to cylinder alignment. Else use sector alignment. +to be preserved, default to cylinder alignment, otherwise use sector alignment. +.IP \(bu +If you use a raw partition, you should add -F to the createopts, +otherwise mkfs.ext4 hangs due to a warning message. See man mfs.ext4 +for more info on -F. +An example config using a raw disk looks like this: raw-disk / 4GB ext4 rw createopts="-F" .SH SEE ALSO This program is part of FAI (Fully Automatic Installation). -The FAI homepage is http://fai-project.org. +The FAI homepage is https://fai-project.org. Further documentation, including coding related information, is available -in a wiki page at http://wiki.fai-project.org/index.php/Setup-storage. +in a wiki page at https://wiki.fai-project.org/index.php/Setup-storage. .SH AUTHOR The \fBsetup-storage\fP program was written by Michael Tautschnig , with -contributions from Christian Kern, Julien Blache -and others. +contributions from Christian Kern, Julien Blache , +Kerim Güney, Thomas Lange and others. The original and primary author of FAI is Thomas Lange . diff -Nru fai-5.3.6ubuntu1/NEWS fai-5.9.4ubuntu1/NEWS --- fai-5.3.6ubuntu1/NEWS 1970-01-01 00:00:00.000000000 +0000 +++ fai-5.9.4ubuntu1/NEWS 2020-01-25 08:17:50.000000000 +0000 @@ -0,0 +1,850 @@ +fai (5.9) unstable; urgency=low + + * add UEFI support to fai-cd, fai-kvm + * add disk configs for UEFI + * new scripts fai-sed, fai-link + + -- Thomas Lange Thu, 02 Jan 2020 22:23:36 +0100 + +fai (5.8.7) unstable; urgency=low + + * support apt keys in files called package_config/CLASS.gpg + * fai-mirror: new option -V + + -- Thomas Lange Tue, 17 Sep 2019 14:48:21 +0200 + +fai (5.8) unstable; urgency=low + + * fcopy: change the precedence of mode handling + + -- Thomas Lange Fri, 08 Feb 2019 23:16:40 +0100 + +fai (5.7) unstable; urgency=low + + * The config examples are now in a separate git repo. See README for + more infos + * Add support for diskless clients in setup-storage + * Ubuntu installation now default to 18.04 LTS aka Bionic release + + -- Thomas Lange Thu, 31 May 2018 22:41:20 +0200 + +fai (5.6) unstable; urgency=low + + * When installing the package fai-server, use the repository + from fai-project.org by default for building the nfsroot + + -- Thomas Lange Wed, 28 Feb 2018 11:48:16 +0100 + +fai (5.5.4) unstable; urgency=low + + * New option -P for fai-make-nfsroot also preserves the ssh host + keys + * fai-diskimage: add support for raw.xz and raw.zst + + -- Thomas Lange Fri, 23 Feb 2018 13:08:40 +0100 + +fai (5.5) unstable; urgency=low + + * New option -S in fcopy for variable substitution, which may replace + your preinst scripts + * Get rid of the need to have aptitude installed + * Change order of package commands in install_packages, aptitude is now + called after apt-get + + -- Thomas Lange Thu, 19 Oct 2017 22:47:20 +0200 + +fai (5.4) unstable; urgency=low + + * FAI can now build cross-architecture disk images and chroot + environments for foreign architectures + * Add support for eMMC storages + * Disk images can use LVM partitions even if the host also uses LVM + * Use http://deb.debian.org as default for Debian package repositories + + -- Thomas Lange Tue, 26 Sep 2017 14:57:00 +0200 + +fai (5.2) unstable; urgency=low + + * new command fai-diskimage creates bootable disk images for your VM + + -- Thomas Lange Fri, 30 Sep 2016 19:33:47 +0200 + +fai (5.0) unstable; urgency=low + + * major rewrite of the FAI guide + * new autodiscover function, the client is searching the network + for a FAI server + * FAI profiles extend the FAI class concept + * FAI shows a curses based menu for selecting a profile on demand + * ready-to-go setup of the FAI server using the FAI CD or USB stick + * ready-to-go FAI profile for CentOS 7 and Ubuntu 14.04 + * Cloning machines using an image (hook debconf.IMAGE) + * action sysinfo now also mounts lvm and RAID devices + * use httpredir.debian.org as default + * fai-cd now uses dracut instead of live-boot, + use of squashfs creates smaller CD images, + fai-cd replaces fai-nfsroot2image + * files *.source are renamed to .sh + * dnf support for rpm based distributions + * improved btrfs support + * new command fai-kvm for starting a virtual machine + * new command fai-mk-network for setting up different test networks + * fai-cd: no networking for the rescue boot entry by default + + -- Thomas Lange Fri, 30 Sep 2016 15:16:31 +0200 + +fai (4.3) unstable; urgency=low + + * add btrfs support to setup-storage + + -- Thomas Lange Mon, 06 Oct 2014 10:33:21 +0200 + +fai (4.2) unstable; urgency=low + + - fai-cd now builds a hybrid ISO image + + -- Thomas Lange Fri, 23 May 2014 13:46:47 +0200 + +fai (4.0) unstable; urgency=low + + - New script names: + faimond -> fai-monitor + faimond-gui -> fai-monitor-gui + make-fai-nfsroot -> fai-make-nfsroot + disk-info -> fai-disk-info + - make-fai-nfsroot.conf renamed to nfsroot.conf + - task prepareapt renamed to repository + - task mirror was removed and is now part of task repository + - add task tests to action dirinstall and softupdate + - old tool setup_harddisks removed. Use setup-storage instead + - new script fai-nfsroot2image + - new script fai-new-mac + - new variables $FAI_BASEFILEURL adds support for receiving basefile via + ftp and http + - multicore support in fai-make-nfsroot (rm and xz compression is done + in the background + - huge speedup in fai-make-nfsroot using ramdisk (package installation + is twice as fast) + - ifclass new options -a and -o + - fai-make-nfsroot new option -a, -g, -l, remove -U, -r + - fai-make-nfsroot dracut is now the default initramfs creator inside + the nfsroot which replaces live-boot and initramfs-tools + - fai-monitor-gui: add option -s + - *.asc files are loaded by class names + - the variable $FAI does not need to be set in fai.conf, since all + scripts use the default value of /var/lib/fai/config + - add support for python, ruby and zsh scripts to fai-do-scripts + - fai-chboot must specify the config space URL + - fai-chboot: new option -E + - FAI supports NFS v4 using dracut + - install apt keys from /etc/fai/apt/keys into nfsroot + - fcopy can copy symlinks using -H + - FAI can work without any NFS access + - action softupdates now calls task repository + - add dracut support + - new FAI_FLAG halt + - add variable AINSL_TARGET + - new log file fai-monitor.log on the install client + + -- Thomas Lange Tue, 10 Apr 2012 11:48:33 +0200 + +fai (3.4.4) unstable; urgency=low + + - This stable release is targeted towards Debian/squeeze but continues + to provide support for older Debian releases as well. + If you want to deploy the Debian lenny release please see + /usr/share/doc/fai-doc/lenny-instructions.txt for instructions. + + - Please note that due to Debian's switch from /bin/bash to /bin/dash + as default /bin/sh shell your scripts/hooks/... should use + /bin/bash in the shebang line if you're using the environment of FAI. + Otherwise you might notice problems like "ifclass" not being defined. + + - FAI project homepage moved to its own domain http://fai-project.org/ + Along with the new web home also the wiki moved. + If your sources.list configuration includes something like: + + deb http://www.informatik.uni-koeln.de/fai/download lenny koeln + + please change it to the new URL accordingly, like: + + deb http://fai-project.org/download lenny koeln + + -- Michael Prokop Thu, 14 Oct 2010 17:29:35 +0200 + +fai (3.3) unstable; urgency=low + + - variable FAI_CONFIGDIR moved from fai.conf to make-fai-nfsroot.conf + - automatic tests are now supported + - dirinstall now uses FAI_CONFIG_SRC instead of FAI_CONFIGDIR + - files named package_config/*.asc are added to the list of apt keys + - cvs, bootpc, expect and mdetect are not installed by default into the + nfsroot + + -- Thomas Lange Tue, 03 Nov 2009 09:35:06 +0100 + +fai (3.2.8) unstable; urgency=low + + - new partition tool setup-storage added + + -- Thomas Lange Sun, 15 Jun 2008 12:47:16 +0200 + +fai (3.2.2) unstable; urgency=low + + - LOGDIR is now /var/log/fai/$HOSTNAME/$FAI_ACTION_date+time + - LOGDIR is /tmp/fai during an installation (not dirinstall), and + will be copied to the path above at the end of an installation + + -- Thomas Lange Fri, 16 Nov 2007 17:46:49 +0100 + +fai (3.2) unstable; urgency=low + + - replace special fai-kernels with plain Debian kernel and an initrd + build by initramfs ($KERNELPACKAGE removed) + - FAI uses live-initramfs for booting, the whole nfsroot is now + writeable for the clients (by using unionfs) + - fai-cd can create bootable USB sticks + - major update to the fai guide + - scp/ssh are now the default methods instead of rcp/rsh when + contacting the install server + - faimond can now call fai-chboot (instead of rsh/ssh call) + - Task extrbase can also extract files from directory ../basefiles/ + - /tmp/target is now /target + + -- Thomas Lange Tue, 21 Aug 2007 17:43:30 +0200 + +fai (3.1) unstable; urgency=medium + + - rename action dirinst to dirinstall + - fai: add option -u,--hostname + + -- Thomas Lange Wed, 18 Oct 2006 16:18:36 +0200 + +fai (3.0) unstable; urgency=low + + - WARNING: the fai-guide does not yet reflect the changes from FAI 2 to FAI 3 + - rename NEWS to NEWS.Debian + - /etc/fai/sources.list moved to /etc/fai/apt/sources.list + - lots of new pathes: + use /srv/tftp/fai instead of /boot/fai + use /srv/tftp/fai/pxelinux.cfg instead of /boot/fai/pxelinux.cfg + use /srv/fai/config instead of /usr/local/share/fai + use /srv/fai/nfsroot instead of /usr/lib/fai/nfsroot + use /var/lib/fai/config instead of /fai + use /var/lib/fai/mirror instead of /mnt + - changed file names + variables.sh is now variables.log + - new config file /etc/fai/NFSROOT which contains the package list + for the nfsroot + - changes in variables + remove FAI_REMOTESH and FAI_REMOTECP from fai.conf, + use FAI_LOGPROTO instead + remove $installserver and $mirrorhost in fai.conf + replace FAI_LOCATION by FAI_CONFIG_SRC, use default if undefined: + "nfs://`hostname`$FAI_CONFIGDIR" + LOGSERVER, LOGREMOTEDIR, LOGPASSWD removed from fai.conf, set + them in the config space + MNTPOINT now set to /media/mirror + SERVERINTERFACE not needed by default in make-fai-nfsroot.conf + NFSROOT moved to make-fai-nfsroot.conf + FAICLIENTS, NFSROOT_PACKAGES removed from make-fai-nfsroot.conf + $terror renamed to $task_error + all flags from FAI_FLAGS are now defined as $flag_xxx + $time_zone renamed to $TIMEZONE + $videodrv renamed to $VIDEODRIVER + $FAI_CONSOLEFONT renamed to $CONSOLEFONT + $FAI_KEYMAP renamed to $KEYMAP + $rootpw renamed to $ROOTPW + $moduleslist renamed to $MODULESLIST + new variable FAI_ALLOW_UNSIGNED + - task_updatebase does not use updatebase.log any more + - task_updatebase now logs to fai.log + - all IP addresses of the install server are added to $NFSROOT/etc/hosts + - automatic reboot if no errors are found (if error.log is empty) + - new task dirinst for creating a chroot environment + - try ftar $FAI/basefiles before extracting base.tgz + - install_packages: new option -p (see man install_packages) + - make-fai-nfsroot: add option -V (see man make-fai-nfsroot) + - fai-chboot: change in options, -d is now -D, -r is now -d, -r is + not used any more + - add policy-rc.d support + - move some -c to -C, so now all scripts use -C for cfdir, setting + $FAI_ETC_DIR does the same + - fai-cd can now eject the CD after installation + - fai-mirror remove option -a (now default), add -B + - default is kernel 2.6.17 + - convert cfengine (version 1) scripts to cfengine2 + - rename class XFREE to XORG + - new script ainsl, implements AppendIfNoSuchLine from cfeninge in Perl + - config space can be checked out from a subversion repository + + -- Thomas Lange Wed, 27 Sep 2006 14:41:11 +0200 + +fai (2.10.1) unstable; urgency=low + + - minor fix in fai-chboot + - packages in /files/packages are not supported any more + - fai-mirror: add option -C + - fai-cd: add option -C, grub menu now shows FAI version + - after the installation you can leave the FAI-CD in the drive, + since it now boot from local disk by default + - FAI_FLAG syslogd was removed, syslogd is now started by default + + -- Thomas Lange Thu, 20 Apr 2006 11:46:12 +0200 + +fai (2.10) unstable; urgency=low + + - add option -n to fcopy + - several new listing options for fai-chboot, add option -c for + copying PXE configurations + - verbose output when defining variables + - add urpmi and yum support to install_packages + - add new subroutine mkrw(), which makes read-only directories + writeable. Very cool and usefull thing until we can use unionfs + - When booting from fai-cd the config space /fai is now writeable + - class FAISERVER sets up an apt-proxy + + -- Thomas Lange Mon, 3 Apr 2006 15:11:30 +0200 + +fai (2.9.1) unstable; urgency=low + + - new class FAISERVER can install the fai install server from CD + - new command fai-statoverride + - some bug fixes + + -- Thomas Lange Sun, 5 Mar 2006 22:37:31 +0100 + +fai (2.9) unstable; urgency=low + + - lots of bug fixes + - splitting the FAI package into more packages: + fai-server, fai-client, fai-nfsroot, fai-doc, fai-quickstart + - use a 2.6 kernel by default + - Config scripts named S[0-9][0-9]* are not executed any + more. Rename them to match [0-9][0-9]*. + - fcopy now supports a preinst script, add option -U, ignore .svn + directories + - new option -I for make-fai-bootfloppy can specify default + interface, new option -B creates 2.88M floppy + - use md5 hash for passwords + - backticks and variables can't be used in package_config any more + - root-path does not need to be defined in dhcpd.conf any more + (fai-chboot does it for you) + - fai-cd's El Torito boot image is not limited to 2.88M any more + + -- Thomas Lange Tue, 13 Dec 2005 15:53:00 +0100 + +fai (2.8.4) unstable; urgency=high + + - small but important bug fix: remove non-US entry + + -- Thomas Lange Wed, 25 May 2005 13:59:39 +0200 + +fai (2.8.3) unstable; urgency=high + + - remove debconf support for package itself, debconf support for + the installation was not removed + + -- Thomas Lange Thu, 19 May 2005 15:54:18 +0200 + +fai (2.8.2) unstable; urgency=high + + - close some bugs, which occured when using softupdates + + -- Thomas Lange Fri, 6 May 2005 09:23:34 +0200 + +fai (2.8.1) unstable; urgency=low + + - minor bug fixes + - added $COLOR_FAI_LOGO which is off unless doing initial + installations + - added german and french translation of the debconf templates + - task sysinfo mounts the local partitions read only + - move some classes from 10-base-classes to the new script + 50-host-classes + - fixed a lot of typos in the fai guide + + -- Thomas Lange Sat, 30 Apr 2005 21:20:53 +0200 + +fai (2.8) unstable; urgency=high + + - rename rcS_fai to fai, add manual page fai.8 + - new simple examples using class FAIBASE + - add debconf support for the package itself + - new action softupdates, update a system without reinstallation + - fai-do-scripts now executes scripts matching [0-9][0-9]* + - rcS.log is now fai.log + - major updates in fai-guide (softupdate, fai on other archs) + - add task prepareapt + - variable $addpackages removed from examples scripts + + -- Thomas Lange Sat, 9 Apr 2005 23:43:27 +0200 + +fai (2.7) unstable; urgency=high + + - closes grave and important bugs + - add fai-cd(8) script for creating a bootable FAI CD image + - add option -a to fai-mirror + - add option -d to install_packages + + -- Thomas Lange Fri, 25 Mar 2005 23:51:34 +0100 + +fai (2.6.7) unstable; urgency=low + + - add task debconf and new script fai-debconf for preseeding + - minor updates in the fai guide + + -- Thomas Lange Thu, 10 Mar 2005 11:00:05 +0100 + +fai (2.6.6) unstable; urgency=medium + + - new command fai-mirror(1) to create a partial Debian mirror + - setup_harddisks: bug fix: error redefined mountpoint is wrongly + reported, allow space before keywords primary and logical + - install_packages: add option -f + - task_sysinfo calls hwinfo if available (very nice hardware info) + - 06hwdetect.source: SCSI detect code for 2.6 kernel + - new variable FAICLIENTS in make-fai-nfsroot.conf. Used by + fai-setup for exporting the nfsroot and the config space via NFS + - create a list of all packages in base.tgz (for fai CD) + - ftar: test if directory is / before removing files recursively + - enable shadow passwords for passwd and group in examples + - save files FAI_CLASSES, variables.sh and disk_var.sh to + /var/log/fai not to /etc/fai + - add supprt for booting from CD + - other bug fixes + + -- Thomas Lange Fri, 21 Jan 2005 04:24:26 +0100 + +fai (2.6.5) unstable; urgency=medium + + - fcopy now handles svn and arch subdirectories, added option -I + - install_packages does not remove unknown package names when + using aptitude, so aptitude's search patterns can be used + + -- Thomas Lange Thu, 11 Nov 2004 15:14:08 +0100 + +fai (2.6.4) unstable; urgency=medium + + - bug fixes + - install_packages and files in package_config/ have now support + for aptitude + + -- Thomas Lange Mon, 8 Nov 2004 14:38:58 +0100 + +fai (2.6.3) unstable; urgency=high + + - make $rootpw not readable for users + - use default kernel 2.4.27 + - fai-setup: add option -e + - make-fai-nfsroot: add option -K + - add xfs support into the nfsroot + - define kernel parameters using $kappend + + -- Thomas Lange Mon, 13 Sep 2004 18:40:36 +0200 + +fai (2.6.2) unstable; urgency=high + + - Workaround to support new tasksel behaviour + - fix broken grub entry when using class FAI_BOOTPART + - fai-chboot: add option -e + + -- Thomas Lange Thu, 26 Aug 2004 20:09:15 +0200 + +fai (2.6.1) unstable; urgency=medium + + - new option -k for make-fai-nfroot only installs a new kernel + - catnc() greps now through multiple files + - when logging in with ssh all variables for FAI are defined by + sourcing /tmp/fai/variables.sh + - faireboot sends message to fai monitor daemon + - install_packages now supports taskrm (which calls tasksel + remove), default number of packages that are install with one + command is set to 99 + - better support for installing a client with a different hostname + than during installaion + + -- Thomas Lange Mon, 9 Aug 2004 14:02:13 +0200 + +fai (2.6) unstable; urgency=low + + - make FAI ready-to-use for sarge + - make the examples much easier, remove a lot of unused stuff + - fai.conf is split into two files, make-fai-nfsroot specific + variables are moved to /etc/fai/make-fai-nfsroot.conf + - make-fai-nfsroot: more packages for hardware detection included, + write a warning if $FAI_SOURCES_LIST is used + - rcS_fai: if a file /.nocolorlogo exists, do not enable colored + logo and let scroll region unchanged + - 06hwdetect.source: better hardware detection uses discover2, + load all pci IDE drivers, enables DMA mode for disks, include + code of 11modules.source + - task_sysinfo: show serial numbers of hard disks, show usb + information + - tasks can set return code ($terror) so faimond receives it + - faimond receives more messages + - fai-chboot: new options -d, can use localboot, so we need not + copy the kernel image and initrd to the install server + - grub-install does not probe floppy drive (which can hang the system + for a long time) + - install_packages: add option -L, new code for detecting unknown + package names which uses perl module AptPkg + - mkdebmirror: mirrors now woody and sarge in one directory + + -- Thomas Lange Mon, 26 Jul 2004 17:22:44 +0200 + +fai (2.5.4) unstable; urgency=low + + - fix bug in make-fai-bootfloppy when using -f + - make-fai-bootfloppy: added option -i that creates a bootable + ISO9960 cdrom image + - some sparc and PowerPC adjustments + + -- Thomas Lange Thu, 26 Feb 2004 17:07:31 +0100 + +fai (2.5.3) unstable; urgency=low + + - default kernel is 2.4.24 + - add option -c to make-fai-{nfsroot,bootfloppy} to define a + different configuration directory than /etc/fai + - make-fai-bootfloppy: add option -c and -F, now DHCP is the + default protocol when -d is not used + - fai.conf: exclude more packages from debootstrap + adjust KERNELPACKAGE to new name (since fai-kernels_1.6) + put important variables to the top + remove some comments + - fai-chboot: new option -S sets FAI_ACTION=sysinfo + - The variable FAI_SOURCES_LIST is now obsolete, + use /etc/fai/sources.list or /etc/apt/sources.list instead + - new examples for sources.list in + /usr/share/doc/fai/examples/etc/sources.list + - remove some packages that are not needed and not available in + sarge + - utility chkdebnames mostly rewritten + - package recommends mknbi, and does not work with netboot package + when using BOOTP + + -- Thomas Lange Wed, 4 Feb 2004 14:42:40 +0100 + +fai (2.5.2) unstable; urgency=low + + - fai monitor daemon added, see faimond(8) + - colored copyright message on console + - variable hdparm included again; can be used if the kernel does + not enables DMA for brand new IDE controllers by default + - package names can contain pinning information + - preferences file is copied from /etc/fai if it exists + - default kernel version is 2.4.22 + - bug fixes + + -- Thomas Lange Tue, 6 Jan 2004 15:20:10 +0100 + +fai (2.5.1) unstable; urgency=low + + - minor bug fixes + - added chapter to the fai guide how to receive the configuration + space using CVS + - initrd support when booting new kernel via network + + -- Thomas Lange Fri, 10 Oct 2003 14:58:16 +0200 + +fai (2.5) unstable; urgency=low + + - a new section in the manual which describes a simple + installation example. Read the chapter 'For the impatient user' + - old templates now split into simple and advanced examples. They + are located in /usr/share/doc/fai/examples/{simple,advanced} + - added script fai-chboot which manages the network boot + configuration files for PXE boot + - the installation time is printed in seconds + - menu entries for grub now works also if /boot is a separate + partition + - number of packages installed at a time can be limited (use + $MAXPACKAGES) + - log files can be saved using FTP protocol + - the files in /fai/class that are list of classes can contain + comment lines. All lines starting with a hash are ignored + - syslogd now works during installation + - add an grub entry for memtest86 if installed + - do not fsck ext3 partitions + - add -M option to fcopy + - make-fai-nfsroot: new option -f; print error message if it fails + - a new example configuration for a demo host using GNOME, DHCP + - added XFS support to setup_harddisks + - files class/*.mod and modules.log removed, use 11modules.source + instead + - packages for xfree server now in file/class XFREE + - added SunOS support; you can install Solaris using FAI + - bug fixes as always + + -- Thomas Lange Wed, 6 Aug 2003 16:02:26 +0200 + +fai (2.4.1) unstable; urgency=low + + - use dhcp3, dhcp support was broken in FAI 2.4 + - disk_config examples are using ext3 file systems + - add SERVERINTERFACE to fai.conf + - add FAI_BOOT to fai.conf; the list of boot protocols to set + up (boot or dhcp or both) + - DHCP install kernel file /boot/fai/installkernel renamed to + vmlinuz-install + - new script fai-do-scripts; include the functions from do_script + and task_configure, this makes the Solaris port easier + - some bug fixes + + -- Thomas Lange Thu, 3 Apr 2003 16:57:12 +0200 + +fai (2.4) unstable; urgency=low + + - Era Erikson did some great work on proofreading all manuals and + script comments. Great work Era! + - lots of updates in the fai guide + - use the script fai-class for defining classes; scripts in class/ + must not have prefix S; the following command renames your + existing scripts so they will work with the new command: + rename 's/S(\d\d.+)(\.sh|\.pl)/$1/' S* + the order of scripts executed has slightly changed; all classes + from the file $HOSTNAME are defined after the scripts in class/ + are executed; the suffix .sh or .pl is not needed any more, + fai-class has a manual page + - kernel 2.4.20 is the default kernel during installation + - USB keyboard support during installation + - make-fai-bootfloppy creates a more generic boot floppy which + uses grub or lilo as boot loader, it supports more than one boot + protocol, more disk space is available on the floppy + - the exit status of every hook and script is written to + status.log + - the hook faiend.LAST parses all log files for warnings and + errors and writes them to error.log + - variable.sh lists all variables defined after task defvar has finished + - FAI_LOCATION is now defined in fai.conf, FAI_ACTION is defined + in LAST.var, do not use T170 and T171 via a BOOTP or DHCP server + (but it is still possible) + - hooks can make their tasks to be skipped (as in fai 2.2) + - templates scripts and config files has been rewritten and added + (eg. WWWKIOSK, a notebook with Windows and Linux) + - a new default location for the Debian mirror (in mkdebmirror and + fai.conf) + - much of reorganizing the code, but this does not change the user + visible behavior + - some functions that were defined as shell subroutines are now + separate scripts in /usr/lib/fai (fai-class, create_ramdisk, + prepare_apt, fai-divert, fai-savelog, task_sysinfo, ...), they + are not standalone script, most of them only work in the fai + environment, this should solve the problems with a too big + environment (when using xargs) + - PATH always starts with /usr/local/{sbin,bin} + - new FAI_FLAG syslogd starts log daemons (syslogd and klogd) only + on demand + - save log files to host $LOGSERVER if defined, otherwise use + $SERVER + - make-fai-nfsroot always does setup for dhcp and bootp, and uses + following sources to create the file sources.list for the + nfsroot: the variable $FAI_SOURCES_LIST or the files + /etc/fai/sources.list or /etc/apt/sources.list + - you can add a list of classes after the PACKAGE command in files + in package_config, so the following packages will only be + installed for this class (Please only use this in the file + package_config/DEFAULT) + - fcopy has new option -i and -B + - the variable addpackages can contain a list of packages without + their version number, therefore /fai/files/packages should be a + simple repository + - a lot of bug fixes + + -- Thomas Lange Thu, 13 Feb 2003 11:45:29 +0100 + +fai (2.3.4) unstable; urgency=low + + - the default name for fai kernel-image package has changed to + kernel-image-2.2.20_fai1_i386.deb, since the package fai-kernel + >=1.4 contains install kernels which support both the BOOTP and + DHCP protocol + + -- Thomas Lange Thu, 16 May 2002 14:42:00 +0200 + +fai (2.3.3) unstable; urgency=medium + + - important bug fix (wrong symlink for rcS_fai) + - copy id_dsa* and id_rsa* files in make-fai-nfsroot + - use strict enabled in perl scripts + - add "append ip=dhcp" in pxelinux.cfg/default + - minor changes in package_config files + - setup_harddisks default fs type changed from auto to ext2 + + -- Thomas Lange Thu, 16 May 2002 09:27:15 +0200 + +fai (2.3.2) unstable; urgency=low + + - minor bug fixes + - minor changes in package_config files + - use discover command for hardware detection and loading of scsi + kernel modules in class/S03hwdetect.source + - use swap partitions during installation if available + + -- Thomas Lange Mon, 29 Apr 2002 19:47:39 +0200 + +fai (2.3.1) unstable; urgency=low + + - some minor bug fixes + - add variable $addpackages to DEFAULT.var + - $FAI_SUBDIR renamed to $FAI_SHAREDIR (fai.conf) + - changes in package_config files + - additional method to determine all ethernet devices + - manual updates for woody + - added a lot of comments into shell script + - add option -m to make-fai-bootfloppy + + -- Thomas Lange Tue, 16 Apr 2002 13:30:04 +0200 + +fai (2.3) unstable; urgency=low + + - all default configurations are for Debian 3.0 aka woody + - /etc/fai.conf moved to /etc/fai/fai.conf + - moved some variables from fai.conf to class/*.var + - add FAI_DEBOOTSTRAP_OPTS to fai.conf + - temporary files are stored to $LOGDIR (default to /tmp/fai/), + can be set in fai.conf using mktemp if desired + - log files for every new run are stored in a separate directory, + last-$FAI_ACTION is pointing to the last log directory + - if a task is skipped, also all its hooks are skipped + - uname -s in uppercase is also a default class + - all class/S[0-9]*.source scripts are sourced + - hooks that end in .source are sourced (formerly .sh), so they + can define variables + - new adddivert routine; make a diversion for a file and add it to + the list of all diversions; you need not care about removing the + diversion; the finish task will do this for you + - class/*.mod files can now define variables + - new examples class/S30menu.source (was hook/install.MENU) + - /fai can be a different location using $FAI in fai.conf + - /fai can be retrieved from a CVS repository: (see variables + FAI_LOCATION, FAI_CVSROOT, FAI_CVSMODULE) and create a + /etc/fai/.cvspass + - /etc/apt/preferences will be copied to nfsroot + - additional manual pages for fai-setup, make-fai-nfsroot, + make-fai-bootfloppy, install_packages + - setup_harddisks: called with option -d (DOS alignment) + support for ext3 and disk controllers using /dev/ida/, /dev/rd/ + and /dev/cciss (Compaq SMART2 raid array and Mylex DAC960 PCI + RAID controller) + - make-fai-bootfloppy can write to a file, creates environment for + DHCP using pxelinux, does not copy System.map to floppy (now + more space left for the kernel image), new option -s + - bootpc and dhcp request will use only active network devices + ($netdevices_up determined by netdevice_info()) by default, + which can be overwritten with $netdevices + - add a hint how to set up the kernel automounter for scratch + partitions + - fcopy skips CVS directories, executes postinst script if file + was copied, new options -L and -P + - added prtnetgr script which prints a flat list of all hosts + belonging to a netgroup + - execute all /fai/scripts/$class/S[0-9]* scripts if this + directory exists, so it's possible to execute multiple scripts + for one class; see examples in scripts/NETWORK/ and scripts/DEFAULT/ + - use shm (was tmpfs) for ramdisk if available + - mkdebmirror uses passive ftp mode + - task sysinfo calls kudzu + - added THANKS file + + -- Thomas Lange Tue, 9 Apr 2002 18:29:15 +0200 + +fai (2.2.3) unstable; urgency=low + + - woody support improved, but the default configuration is still + for potato + - added disk configuration for Beowulf nodes + - Wake on LAN section added to FAI guide + - reiserfs support in setup_harddisks (thanks to Diane Trout) + - make-fai-nfsroot -v output can be redirected to a file + - sysinfo also uses detect and discover to probe for hardware + - utilities moved to /usr/share/fai/utils + - install_packages checks all package names. If a package name is + misspelled, it will be removed from the installation list + - added class NOGETTY + - package_config: new action "hold", PRELOAD can use a file: url + + -- Thomas Lange Thu, 8 Nov 2001 17:01:02 +0100 + +fai (2.2.2) unstable; urgency=low + + - bug fix: getting dhcp information + - added jmon to BEOWULF + + -- Thomas Lange Wed, 10 Oct 2001 10:52:35 +0200 + +fai (2.2.1) unstable; urgency=low + + - FAI_FLAGS can be space or comma separated. They must be space + separated in bootptab. Use a comma to separate them as + additional kernel parameters. + - bootp requests on multiple ethernet devices show device name + (Thanks to Geert Stappers) + - script all_hosts doesn't use hardcoded list of hosts any more; + now it uses the netgroup allhosts + + -- Thomas Lange Fri, 5 Oct 2001 17:19:14 +0200 + +fai (2.2) unstable; urgency=low + + - the fai guide has a new chapter about building a Beowulf cluster + - new utilities for Beowulf cluster: all_hosts and rshall + - new utility softupdate for updating packages on a running system + - improved example for diskless hook + - major reorganization of the rcS_fai code; most parts are moved + to the subroutines file + - source /fai/hooks/subroutines if file exists; here you can define + your own subroutines or redefine FAIs subroutines + - most tasks are now executed via task() and the name of the task + as option. This subroutine looks for a hook with the given name + and executes it. Hooks can skip the default task of FAI (called + task_) by using skiptask(). So, hooks can replace the + default behavior, and not only add functions to the + installation process + - hooks can define classes by writing class names to + /tmp/additional-classes and variable by writing line to + /tmp/additional.var + - new hooks/tasks added + - classes and variables are now defined in the very beginning + before task_action is called and $FAI_ACTION is evaluated + - FAI_ACTION can be any user defined value. FAI is looking for a + command in /fai/hooks/$FAI_ACTION and executes it. + - log file prepare-apt.log renamed to updatebase.log + - debian-non-US in local mirror script (mkdebmirror) has new location + - new type "PACKAGE taskinst" in package_config can install new + task packages (for Debian 3.0 and later releases) + - get_bootp_inf() and get_dhcp_info() support multiple ethernet + devices via $netdevices + - $netdevices can be set or automaticly determined to the list of + ethernet devices + - make-fai-bootfloppy: handle symlinks of lilo 21.5 and newer + - tlink can show symlink of a host or all file in /boot/fai + - new classes NOSECURETTY, BEOWULF, NOTCPD + + -- Thomas Lange Fri, 14 Sep 2001 14:35:49 +0200 + +fai (2.1) unstable; urgency=low + + - NEWS file added (you found it already ;-), which contains the + user visible changes; changelog file is for developers + - woody support + - define $FAI_DEBOOTSTRAP for using debootstrap + - you can add your own functions using hooks (read the manual) + - /fai/fai_config not used anymore, replaced by a hook + - setup_harddisk does not complain when root partition is not in + the first 8GB, do not complain if not a primary partition + - no more problems when using other locales + - support for diskless clients + - grub support, new class LILO and GRUB + - new flag createvt; add this to FAI_FLAGS to get two additional + terminals and ctrl-c will interrupt the installation + process. Otherwise ctrl-c will reboot and no terminals are + available. In the past, this function was enabled by default. + Add createvt to FAI_FLAGS to get the old behavior. + - before any classes are defined using the scripts in /fai/class, + the classes DEFAULT, $HOSTNAME and LAST are defined + - new utility chkdebnames can check package names for a certain + distribution + + -- Thomas Lange Fri, 20 Jul 2001 11:55:29 +0200 diff -Nru fai-5.3.6ubuntu1/README fai-5.9.4ubuntu1/README --- fai-5.3.6ubuntu1/README 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/README 2020-04-27 02:48:16.000000000 +0000 @@ -1,56 +1,50 @@ -This is FAI (Fully Automatic Installation) for Linux +This is FAI (Fully Automatic Installation) version FAIVERSIONSTRING - FAIVERSIONSTRING - -FAI is a non-interactive system to install, customize and manage Linux -systems and software configurations on computers as well as virtual -machines and chroot environments, from small networks to large -infrastructures and clusters. It's a tool for mass unattended Linux -installation. You can take one or more virgin systems, turn on the -power, and after a few minutes, the systems are installed, and -completely configured to your exact needs, without any interaction -necessary. Thus it's a scalable method for deploying and updating a -Beowulf cluster or a network of workstations unattended with little -effort involved. FAI uses the Debian distribution and a collection of -shell and Perl scripts for the installation process. Changes to the -configuration files of the operating system are made by cfengine, -shell and Perl scripts. +FAI is a tool for unattended mass deployment of Linux. It's a system +to install and configure Linux systems and software packages on +computers as well as virtual machines, from small labs to large-scale +infrastructures like clusters and virtual environments. You can take +one or more virgin PC's, turn on the power, and after a few minutes, +the systems are installed, and completely configured to your exact +needs, without any interaction necessary. It can be used for creating +custom disk images used in virtual machines or on a cloud-computing +platform. FAI uses Debian Linux but it can install and deploy multiple +distributions like Debian, Ubuntu, CentOS, RHEL and SUSE. Changes to +the configuration files of the operating system can be made by shell +or Perl scripts or any other configuration software. The home page for FAI is - http://fai-project.org/ + https://fai-project.org/ -This release of FAI is tested with the Debian 8 release. +This release of FAI is tested with the Debian 9 release. FAI is free software, distributed under the terms of the GNU General -Public License, version 2. For more information, see the file -COPYING. There is no warranty, expressed or implied, associated with -this product. Use at your own risk. Please read the file changelog for -changes in new versions of FAI. Comments, bug reports, fixes, -enhancements etc. are welcome. Send them to +Public License, version 2. There is no warranty, expressed or implied, +associated with this product. Use at your own risk. Comments, bug +reports, fixes, enhancements etc. are welcome. Send them to fai@fai-project.org Please fill out the questionnaire when you have finished a project -using FAI. http://fai-project.org/questionnaire -I'm looking for short success stories or reports, so new users -can see how others are using FAI in several types of environment. - -There's also a mailing list for FAI available. Mails may be -written in english or german. -https://lists.uni-koeln.de/mailman/listinfo/linux-fai - - -now enjoy FAI and your saved time - -Thomas ----------------------------------------------------------------------- - Thomas Lange -Institut fuer Informatik mailto:lange@informatik.Uni-Koeln.DE - Universitaet zu Koeln - Weyertal 121 Telefon: +49 221 470 89781 - 50931 Koeln - -4096R/074BCDE4 B11E E327 3F6B 2DEB 528C 93DA 2BF8 D9FE 074B CDE4 ----------------------------------------------------------------------- -Copyright (c) 1999-2017 Thomas Lange. All rights reserved. +using FAI. https://fai-project.org/questionnaire + + + +Checking out the FAI sources: + + git clone --recursive https://github.com/faiproject/fai.git + cd examples/simple + git checkout master + +This command will also clone a git submodule which includes the FAI +config space examples. + + +Now enjoy FAI and your saved time + +Thomas Lange + +My GPG Key is: 4096R/074BCDE4 B11E E327 3F6B 2DEB 528C 93DA 2BF8 D9FE 074B CDE4 +-------------------------------------------------------------------------------- +Copyright (c) 1999-2020 Thomas Lange. All rights reserved. diff -Nru fai-5.3.6ubuntu1/README.build-sources fai-5.9.4ubuntu1/README.build-sources --- fai-5.3.6ubuntu1/README.build-sources 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/README.build-sources 2020-04-27 02:48:16.000000000 +0000 @@ -1,5 +1,8 @@ # check out the sources to the directory fai -git clone git@github.com:faiproject/fai.git +git clone --recursive https://github.com/faiproject/fai.git +cd examples/simple +git checkout master +cd ../.. # build the packages cd fai diff -Nru fai-5.3.6ubuntu1/utils/mkdebmirror fai-5.9.4ubuntu1/utils/mkdebmirror --- fai-5.3.6ubuntu1/utils/mkdebmirror 2017-04-20 15:48:58.000000000 +0000 +++ fai-5.9.4ubuntu1/utils/mkdebmirror 2020-04-27 02:48:20.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh -# Thomas Lange, lange@informatik.uni-koeln.de, (c) 2001-2012 +# Thomas Lange, lange@informatik.uni-koeln.de, (c) 2001-2018 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - update_from() { @@ -8,7 +8,7 @@ # update local mirror from a host host=$1 shift - defopt="--i18n --diff=none $allopt --host=$host --dist=$dist $sect" + defopt="--keyring /usr/share/keyrings/debian-archive-keyring.gpg --method=http --rsync-extra=none --diff=none $allopt --host=$host --dist=$dist $sect" echo "------------------ create mirror for debian ------------------" debmirror $excl $destdir/debian $defopt $* @@ -19,11 +19,11 @@ # here you have to adjust the hostnames of the mirror and the names of the distributions # excluding dbg_ packages saves a lot of disk space. About 33G for squeeze,wheezy in amd64,i386 -excl=--exclude='-dbg_' +excl="--exclude=-dbg_ --exclude=debian-installer-netboot-images --include=libc6-dbg" debug="$@" arch=amd64 -dist=stretch +dist=buster,buster-backports destdir=/files/scratch/debmirror sect="--section main,contrib,non-free" @@ -34,8 +34,8 @@ # If this mirror isn't always up to date, sync again from an official mirror # sync from an official mirror -update_from httpredir.debian.org --getcontents $* +update_from deb.debian.org --getcontents $* # even one should not mirror the security site, but I will do it. echo "------------------ create mirror for debian-security ------------------" -debmirror $excl $destdir/debian-security $allopt --host=security.debian.org -r debian-security $sect -d stretch/updates $* +debmirror --keyring /usr/share/keyrings/debian-archive-keyring.gpg --method=http $excl $destdir/debian-security $allopt --host=deb.debian.org -r debian-security $sect -d buster/updates $* diff -Nru fai-5.3.6ubuntu1/VERSION fai-5.9.4ubuntu1/VERSION --- fai-5.3.6ubuntu1/VERSION 2017-04-20 15:48:55.000000000 +0000 +++ fai-5.9.4ubuntu1/VERSION 2020-04-27 02:48:16.000000000 +0000 @@ -1 +1 @@ -VERSIONSTRING="$(shell dpkg-parsechangelog | awk '/^Version:/ {print $$2}')" +VERSIONSTRING=$(shell dpkg-parsechangelog | awk '/^Version:/ {print $$2}')