Initial commit
This commit is contained in:
commit
4406155089
|
@ -0,0 +1 @@
|
||||||
|
*.sw[a-z]
|
|
@ -0,0 +1,336 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# mk-basefile, create basefiles for some distributions
|
||||||
|
#
|
||||||
|
# Thomas Lange, Uni Koeln, 2011-2022
|
||||||
|
# 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/20.04/22.04
|
||||||
|
# Rocky Linux 8
|
||||||
|
# CentOS 5/6/7/8
|
||||||
|
# Scientific Linux Cern 5/6
|
||||||
|
#
|
||||||
|
# Packages you might want to install to use this command:
|
||||||
|
# debootstrap, rinse, xz-utils
|
||||||
|
|
||||||
|
|
||||||
|
# Define your local mirros here
|
||||||
|
# For the first stage, set the CentOS/SLC mirror in /etc/rinse/rinse.conf
|
||||||
|
MIRROR_DEBIAN=http://deb.debian.org/debian/
|
||||||
|
MIRROR_UBUNTU=http://mirror.netcologne.de/ubuntu/
|
||||||
|
MIRROR_CENTOS=http://mirror.netcologne.de/
|
||||||
|
|
||||||
|
EXCLUDE_SQUEEZE=isc-dhcp-client,isc-dhcp-common,info
|
||||||
|
EXCLUDE_WHEEZY=info
|
||||||
|
EXCLUDE_JESSIE=info
|
||||||
|
EXCLUDE_STRETCH=info
|
||||||
|
EXCLUDE_BUSTER=
|
||||||
|
EXCLUDE_BULLSEYE=
|
||||||
|
EXCLUDE_BOOKWORM=
|
||||||
|
EXCLUDE_TRIXIE=
|
||||||
|
EXCLUDE_FORKY=
|
||||||
|
EXCLUDE_SID=
|
||||||
|
|
||||||
|
EXCLUDE_TRUSTY=dhcp3-client,dhcp3-common,info
|
||||||
|
EXCLUDE_XENIAL=udhcpc,dibbler-client,info
|
||||||
|
EXCLUDE_BIONIC=udhcpc,dibbler-client,info
|
||||||
|
EXCLUDE_FOCAL=udhcpc,dibbler-client,info
|
||||||
|
EXCLUDE_JAMMY=udhcpc,dibbler-client,info
|
||||||
|
|
||||||
|
# here you can add packages, that are needed very early
|
||||||
|
INCLUDE_DEBIAN=
|
||||||
|
|
||||||
|
|
||||||
|
setarch() {
|
||||||
|
|
||||||
|
l32=
|
||||||
|
if [ X$1 = Xi386 ]; then
|
||||||
|
l32=linux32
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check() {
|
||||||
|
|
||||||
|
if [ $(id -u) != 0 ]; then
|
||||||
|
echo "You must be root to create chroots."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mknod $xtmp/test-dev-null c 1 3
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
echo "Cannot create device files on $xtmp, aborting."
|
||||||
|
echo "Perhaps this directory is mounted with option nodev."
|
||||||
|
rm -rf $xtmp
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo test > $xtmp/test-dev-null
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
echo "Cannot create device files on $xtmp, aborting."
|
||||||
|
echo "Perhaps this directory is mounted with option nodev."
|
||||||
|
rm -rf $xtmp
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rm -f $xtmp/test-dev-null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mkpost-centos() {
|
||||||
|
|
||||||
|
# set local mirror for rinse post script
|
||||||
|
[ -z "$MIRROR_CENTOS" ] && return
|
||||||
|
cat <<EOM > $xtmp/post
|
||||||
|
#! /bin/sh
|
||||||
|
mkdir -p $xtmp/etc/yum.repos.d/orig
|
||||||
|
cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig
|
||||||
|
perl -pi -e 's,mirrorlist=,#mirrorlist=,; s,#baseurl=http://mirror.centos.org,baseurl=$MIRROR_CENTOS,;' $xtmp/etc/yum.repos.d/CentOS-Base.repo
|
||||||
|
EOM
|
||||||
|
chmod 555 $xtmp/post
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mkpost-slc() {
|
||||||
|
|
||||||
|
# set local mirror for rinse post script
|
||||||
|
ver=$1
|
||||||
|
[ -z "$MIRROR_SLC" ] && return
|
||||||
|
cat <<EOM > $xtmp/post
|
||||||
|
#! /bin/sh
|
||||||
|
mkdir -p $xtmp/etc/yum.repos.d/orig
|
||||||
|
cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig
|
||||||
|
perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-os.repo
|
||||||
|
perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-updates.repo
|
||||||
|
|
||||||
|
EOM
|
||||||
|
chmod 555 $xtmp/post
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cleanup-deb() {
|
||||||
|
|
||||||
|
chroot $xtmp apt-get clean
|
||||||
|
rm -f $xtmp/etc/hostname $xtmp/etc/resolv.conf \
|
||||||
|
$xtmp/var/lib/apt/lists/*_* $xtmp/usr/bin/qemu-*-static \
|
||||||
|
$xtmp/etc/udev/rules.d/70-persistent-net.rules \
|
||||||
|
$xtmp/var/lib/dbus/machine-id
|
||||||
|
> $xtmp/etc/machine-id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cleanup-rinse() {
|
||||||
|
|
||||||
|
# check if chroot works
|
||||||
|
echo "Installed packages in chroot:"
|
||||||
|
chroot $xtmp rpm -qa|sort
|
||||||
|
echo -n "CHROOT rpm -qa: "
|
||||||
|
chroot $xtmp rpm -qa|wc -l
|
||||||
|
|
||||||
|
rm -f $xtmp/etc/resolv.conf $xtmp/post
|
||||||
|
if [ -d $xtmp/etc/yum.repos.d/orig ]; then
|
||||||
|
mv $xtmp/etc/yum.repos.d/orig/* $xtmp/etc/yum.repos.d/
|
||||||
|
rm -rf $xtmp/etc/yum.repos.d/orig
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tarit() {
|
||||||
|
|
||||||
|
tar $attributes --numeric-owner --one-file-system -C $xtmp -cf - . | $zip > $target.$ext
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rocky() {
|
||||||
|
|
||||||
|
local arch=$1
|
||||||
|
local vers=$2
|
||||||
|
local domain=$(domainname)
|
||||||
|
|
||||||
|
check
|
||||||
|
setarch $arch
|
||||||
|
# mkpost-centos
|
||||||
|
$l32 rinse --directory $xtmp --distribution rocky-$vers --arch $arch --before-post-install $xtmp/post
|
||||||
|
domainname $domain # workaround for #613377
|
||||||
|
cleanup-rinse
|
||||||
|
tarit
|
||||||
|
}
|
||||||
|
|
||||||
|
centos() {
|
||||||
|
|
||||||
|
local arch=$1
|
||||||
|
local vers=$2
|
||||||
|
local domain=$(domainname)
|
||||||
|
|
||||||
|
check
|
||||||
|
setarch $arch
|
||||||
|
mkpost-centos
|
||||||
|
$l32 rinse --directory $xtmp --distribution centos-$vers --arch $arch --before-post-install $xtmp/post
|
||||||
|
domainname $domain # workaround for #613377
|
||||||
|
cleanup-rinse
|
||||||
|
tarit
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
slc() {
|
||||||
|
|
||||||
|
local arch=$1
|
||||||
|
local vers=$2
|
||||||
|
|
||||||
|
check
|
||||||
|
setarch $arch
|
||||||
|
mkpost-slc $vers
|
||||||
|
$l32 rinse --directory $xtmp --distribution slc-$vers --arch $arch --before-post-install $xtmp/post
|
||||||
|
cleanup-rinse
|
||||||
|
tarit
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
debgeneric() {
|
||||||
|
|
||||||
|
local DIST=$1
|
||||||
|
shift
|
||||||
|
local mirror=$1
|
||||||
|
shift
|
||||||
|
local arch=$1
|
||||||
|
|
||||||
|
dist=${DIST%%[0-9][0-9]}
|
||||||
|
local exc="EXCLUDE_$dist"
|
||||||
|
[ -n "${!exc}" ] && exc="--exclude=${!exc}" || unset exc
|
||||||
|
dist=${dist,,}
|
||||||
|
|
||||||
|
check
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
prtdists() {
|
||||||
|
|
||||||
|
echo "Available:
|
||||||
|
|
||||||
|
ROCKY8_64
|
||||||
|
CENTOS5_32 CENTOS5_64
|
||||||
|
CENTOS6_32 CENTOS6_64
|
||||||
|
CENTOS7_32 CENTOS7_64
|
||||||
|
CENTOS8_64
|
||||||
|
SLC5_32 SLC5_64
|
||||||
|
SLC6_32 SLC6_64
|
||||||
|
SLC7_64
|
||||||
|
TRUSTY32 TRUSTY64
|
||||||
|
XENIAL32 XENIAL64
|
||||||
|
BIONIC64
|
||||||
|
FOCAL64
|
||||||
|
JAMMY64
|
||||||
|
SQUEEZE32 SQUEEZE64
|
||||||
|
WHEEZY32 WHEEZY64
|
||||||
|
JESSIE32 JESSIE64
|
||||||
|
STRETCH32 STRETCH64
|
||||||
|
BUSTER32 BUSTER64
|
||||||
|
BULLSEYE32 BULLSEYE64
|
||||||
|
BOOKWORM32 BOOKWORM64
|
||||||
|
TRIXIE32 TRIXIE64
|
||||||
|
FORKY32 FORKY64
|
||||||
|
SID32 SID64
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
mk-basefile, create minimal base files for a Linux distritubtion
|
||||||
|
|
||||||
|
Copyright (C) 2011-2022 by Thomas Lange
|
||||||
|
|
||||||
|
Usage: mk-basefile [OPTION] ... DISTRIBUTION
|
||||||
|
|
||||||
|
-s Show list of supported linux distributions
|
||||||
|
-f ARCH Build for foreign architecture ARCH.
|
||||||
|
-d DIR Use DIR for creating the temporary subtree structure.
|
||||||
|
-z Use zstd for compressing the tar file.
|
||||||
|
-J Use xz for compressing the tar file.
|
||||||
|
-k Keep the temporary subtree structure, do not remove it.
|
||||||
|
-h Print help.
|
||||||
|
|
||||||
|
Usage example: mk-basefile -J STRETCH64
|
||||||
|
This will create a STRETCH64.tar.xz basefile.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# main routine
|
||||||
|
|
||||||
|
ext=tar
|
||||||
|
zip=cat
|
||||||
|
attributes=
|
||||||
|
cleanup=1
|
||||||
|
attributes="--xattrs --selinux --acls"
|
||||||
|
|
||||||
|
while getopts ashzJd:kf: opt ; do
|
||||||
|
case "$opt" in
|
||||||
|
a) echo "$0: Warning. -a is ignored, because xtattrs, acls and selinux are always added." ;;
|
||||||
|
d) export TMPDIR=$OPTARG ;;
|
||||||
|
f) export ARCH=$OPTARG ;;
|
||||||
|
z) zip="zstd -9"; ext=tar.zst ;;
|
||||||
|
J) zip="xz -8" ext=tar.xz ;;
|
||||||
|
k) cleanup=0 ;;
|
||||||
|
h) usage ;;
|
||||||
|
s) prtdists ; exit 0;;
|
||||||
|
?) exit 3 ;; # error in option parsing
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
|
xtmp=$(mktemp --tmpdir -d basefiles.XXXXXXXX)
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
echo "mktemp failed. Aborting."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
chmod 755 $xtmp
|
||||||
|
|
||||||
|
target=$1 # also the name of the output file
|
||||||
|
|
||||||
|
[ -z "$target" ] && usage
|
||||||
|
case "$target" in
|
||||||
|
CENTOS5_32) centos i386 5 ;;
|
||||||
|
CENTOS5_64) centos amd64 5 ;;
|
||||||
|
CENTOS6_32) centos i386 6 ;;
|
||||||
|
CENTOS6_64) centos amd64 6 ;;
|
||||||
|
CENTOS7_32) centos i386 7 ;;
|
||||||
|
CENTOS7_64) centos amd64 7 ;;
|
||||||
|
CENTOS8_64) centos amd64 8 ;;
|
||||||
|
ROCKY8_64) rocky amd64 8 ;;
|
||||||
|
SLC5_32) slc i386 5 ;;
|
||||||
|
SLC5_64) slc amd64 5 ;;
|
||||||
|
SLC6_32) slc i386 6 ;;
|
||||||
|
SLC6_64) slc amd64 6 ;;
|
||||||
|
SLC7_64) slc amd64 7 ;;
|
||||||
|
TRUSTY*|XENIAL*|BIONIC*|FOCAL*|JAMMY*)
|
||||||
|
debgeneric $target $MIRROR_UBUNTU ;;
|
||||||
|
SQUEEZE*|WHEEZY*|JESSIE*|STRETCH*|BUSTER*|BULLSEYE*|BOOKWORM*|TRIXIE*|SID*)
|
||||||
|
debgeneric $target $MIRROR_DEBIAN $ARCH;;
|
||||||
|
*) echo "Unknown distribution. Aborting."
|
||||||
|
prtdists
|
||||||
|
exit 99 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
if [ $cleanup -eq 1 ]; then
|
||||||
|
rm -rf $xtmp
|
||||||
|
fi
|
|
@ -0,0 +1,79 @@
|
||||||
|
Default: HW4F Desktop
|
||||||
|
|
||||||
|
Name: HW4F Desktop
|
||||||
|
Description: Desktop installation for Hardware for Future
|
||||||
|
Short: HW4F
|
||||||
|
Long: Ubuntu 20.04 LTS (Focal Fossa) desktop installation
|
||||||
|
Login: user, Password: dezentrale, Login: root, Password: dezentrale
|
||||||
|
Classes: INSTALL HW4F_DESKTOP HW4F_DESKTOP_LAST UBUNTU GERMAN
|
||||||
|
|
||||||
|
Name: Secure erase SSD
|
||||||
|
Description: Run a secure erase for SSD
|
||||||
|
Short: Secure erase
|
||||||
|
Long: Run a secure erase on SSD
|
||||||
|
Classes: SECURE_ERASE
|
||||||
|
|
||||||
|
Name: Ubuntu
|
||||||
|
Description: Ubuntu
|
||||||
|
Short: Ubuntu
|
||||||
|
Long: Ubuntu 20.04 LTS (Focal Fossa)
|
||||||
|
Classes: INSTALL UBUNTU
|
||||||
|
|
||||||
|
Name: Minimalist debian
|
||||||
|
Description: Minimal debian installation
|
||||||
|
Short: Simple debian
|
||||||
|
Long: Simple debian without additional packages
|
||||||
|
Classes: DEBIAN
|
||||||
|
|
||||||
|
Name: Debian Desktop with Cinnamon
|
||||||
|
Description: Xfce desktop, LVM partitioning
|
||||||
|
Short: A fancy Xfce desktop will be installed, the user account is demo
|
||||||
|
Long: This is the Xfce desktop example. Additional account called
|
||||||
|
demo with password: fai, root password: fai
|
||||||
|
All needed packages are already on the CD or USB stick.
|
||||||
|
Classes: INSTALL DEBIAN CINNAMON
|
||||||
|
|
||||||
|
Name: Xfce
|
||||||
|
Description: Xfce desktop, LVM partitioning
|
||||||
|
Short: A fancy Xfce desktop will be installed, the user account is demo
|
||||||
|
Long: This is the Xfce desktop example. Additional account called
|
||||||
|
demo with password: fai, root password: fai
|
||||||
|
All needed packages are already on the CD or USB stick.
|
||||||
|
Classes: INSTALL FAIBASE DEBIAN DEMO XORG XFCE LVM
|
||||||
|
|
||||||
|
Name: Gnome
|
||||||
|
Description: Gnome desktop installation
|
||||||
|
Short: A Gnome desktop, no LVM, You will get an account called demo
|
||||||
|
Long: This is the Gnome desktop example. Additional account called
|
||||||
|
demo with password: fai, root password: fai
|
||||||
|
You should have a fast network connection, because most packages are
|
||||||
|
downloaded from the internet.
|
||||||
|
Classes: INSTALL FAIBASE DEBIAN DEMO XORG GNOME
|
||||||
|
|
||||||
|
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 CENTOS8_64 XORG
|
||||||
|
|
||||||
|
Name: Ubuntu
|
||||||
|
Description: Ubuntu 20.04 LTS 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 FOCAL FOCAL64 XORG
|
||||||
|
|
||||||
|
Name: Inventory
|
||||||
|
Description: Show hardware info
|
||||||
|
Short: Show some basic hardware infos
|
||||||
|
Long: Execute commands for showing hardware info
|
||||||
|
Classes: INVENTORY
|
||||||
|
|
||||||
|
Name: Sysinfo
|
||||||
|
Description: Show defailed system information
|
||||||
|
Short: Show detailed hardware and system information
|
||||||
|
Long: Execute a lot of commands for collecting system information
|
||||||
|
Classes: SYSINFO
|
|
@ -0,0 +1,8 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
[ "$cmdlineclasses" ] || exit 0
|
||||||
|
|
||||||
|
# define the classes given on the cmdline (using -c) very early
|
||||||
|
echo $cmdlineclasses
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,21 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# do only execute if this is called on the client being installed. Do not use during fai-diskimage
|
||||||
|
if [ X$FAI_ACTION = Xinstall -a $do_init_tasks -eq 0 ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Echo architecture and OS name in uppercase. Do NOT remove these two lines.
|
||||||
|
uname -s | tr '[:lower:]' '[:upper:]'
|
||||||
|
command -v dpkg >&/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=
|
||||||
|
n="${ip//[^:]}"
|
||||||
|
if [[ $ip =~ ^(on|any|dhcp)$ ]]; then
|
||||||
|
echo DHCPC
|
||||||
|
elif [ ${#n} -lt 6 ]; then
|
||||||
|
echo DHCPC
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,35 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# (c) Thomas Lange, 2002-2013, lange@cs.uni-koeln.de
|
||||||
|
|
||||||
|
# NOTE: Files named *.sh will be evaluated, but their output ignored.
|
||||||
|
|
||||||
|
[ $do_init_tasks -eq 1 ] || return 0 # Do only execute when doing install
|
||||||
|
|
||||||
|
echo 0 > /proc/sys/kernel/printk
|
||||||
|
|
||||||
|
# example how to load modules depending on the kernel version
|
||||||
|
#case $(uname -r) in
|
||||||
|
# 2.6*) 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
|
||||||
|
[ X$verbose = X1 ] && echo Loading kernel module $mod
|
||||||
|
modprobe -a $mod 1>/dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
|
# show the basic information about the network interface
|
||||||
|
ip -br li show up|egrep -v ^lo; ip -br a show up|egrep -v ^lo
|
||||||
|
|
||||||
|
echo $printk > /proc/sys/kernel/printk
|
||||||
|
|
||||||
|
odisklist=$disklist
|
||||||
|
set_disk_info # recalculate list of available disks
|
||||||
|
if [ "$disklist" != "$odisklist" ]; then
|
||||||
|
echo New disklist: $disklist
|
||||||
|
echo disklist=\"$disklist\" >> $LOGDIR/additional.var
|
||||||
|
fi
|
||||||
|
|
||||||
|
save_dmesg # save new boot messages (from loading modules)
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# parse *.profile and build a curses menu, so the user can select a profile
|
||||||
|
#
|
||||||
|
# (c) 2015 by Thomas Lange, lange@cs.uni-koeln.de
|
||||||
|
# Universitaet zu Koeln
|
||||||
|
|
||||||
|
if [ X$FAI_ACTION = Xinstall -o X$FAI_ACTION = Xdirinstall -o X$FAI_ACTION = X ]; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ "$flag_menu" ] || return 0
|
||||||
|
|
||||||
|
out=$(tty)
|
||||||
|
tempfile=$(mktemp)
|
||||||
|
tempfile2=$(mktemp)
|
||||||
|
trap "rm -f $tempfile $tempfile2" EXIT INT QUIT
|
||||||
|
|
||||||
|
# declare the data structure, use associative arrays
|
||||||
|
declare -A arshort
|
||||||
|
declare -A ardesc
|
||||||
|
declare -A arlong
|
||||||
|
declare -A arclasses
|
||||||
|
declare -a list
|
||||||
|
|
||||||
|
|
||||||
|
parse_profile() {
|
||||||
|
|
||||||
|
# read a profile and add all info to the data structure
|
||||||
|
|
||||||
|
local short
|
||||||
|
local long
|
||||||
|
local desc
|
||||||
|
local name
|
||||||
|
local classes
|
||||||
|
local lflag=0
|
||||||
|
|
||||||
|
# disable word splitting when reading a line, this helps reading a keyword without a value
|
||||||
|
local OIF=$IFS
|
||||||
|
IFS=
|
||||||
|
|
||||||
|
while read -r line || [[ -n $line ]]; do
|
||||||
|
|
||||||
|
if [[ $line =~ "Name: " ]]; then
|
||||||
|
if [ -n "$long" ]; then
|
||||||
|
arlong[$name]="$long"
|
||||||
|
fi
|
||||||
|
short=
|
||||||
|
desc=
|
||||||
|
long=
|
||||||
|
classes=
|
||||||
|
lflag=0
|
||||||
|
name=${line##Name: }
|
||||||
|
[ $debug ] && echo "XX NAME $name found"
|
||||||
|
list+=("$name") # add new item to list
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $line =~ "Description: " ]]; then
|
||||||
|
lflag=0
|
||||||
|
desc=${line##Description: }
|
||||||
|
[ $debug ] && echo "XX $desc found"
|
||||||
|
ardesc[$name]="$desc"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $line =~ "Short: " ]]; then
|
||||||
|
lflag=0
|
||||||
|
short=${line##Short: }
|
||||||
|
[ $debug ] && echo "XX $short found"
|
||||||
|
arshort[$name]="$short"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $line =~ "Classes: " ]]; then
|
||||||
|
lflag=0
|
||||||
|
classes=${line##Classes: }
|
||||||
|
[ $debug ] && echo "XX classes found"
|
||||||
|
arclasses[$name]="$classes"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $line =~ "Long: " ]]; then
|
||||||
|
lflag=1
|
||||||
|
long=${line##Long: }
|
||||||
|
[ $debug ] && echo "XX long found"
|
||||||
|
|
||||||
|
# else it's another long line
|
||||||
|
elif [ $lflag -eq 1 ]; then
|
||||||
|
long+="\n$line"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $line =~ "Default: " ]]; then
|
||||||
|
lflag=0
|
||||||
|
default=${line##Default: }
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
done < $1
|
||||||
|
|
||||||
|
if [ -n "$long" ]; then
|
||||||
|
arlong[$name]="$long"
|
||||||
|
fi
|
||||||
|
IFS=$OIF
|
||||||
|
}
|
||||||
|
|
||||||
|
prtresult() {
|
||||||
|
|
||||||
|
# set newclasses which is used by fai-class(1)
|
||||||
|
local res=$(<$tempfile)
|
||||||
|
echo "$BASH_SOURCE defined new classes: ${arclasses[$res]}"
|
||||||
|
newclasses="${arclasses[$res]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# read all files with name matching *.profile
|
||||||
|
_parsed=0
|
||||||
|
shopt -s nullglob
|
||||||
|
for _f in *.profile; do
|
||||||
|
parse_profile $_f
|
||||||
|
_parsed=1
|
||||||
|
done
|
||||||
|
unset _f
|
||||||
|
|
||||||
|
# do nothing if no profile was read
|
||||||
|
if [ $_parsed -eq 0 ]; then
|
||||||
|
unset _parsed
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# create the argument list containing the menu entries
|
||||||
|
# and the help text file
|
||||||
|
for i in "${list[@]}"; do
|
||||||
|
par+=("$i")
|
||||||
|
par+=("${ardesc[${i}]}")
|
||||||
|
par+=("${arshort[${i}]}")
|
||||||
|
echo "Name: ${i}" >> $tempfile2
|
||||||
|
echo -e ${arlong[${i}]} >> $tempfile2
|
||||||
|
echo -e "Classes: " ${arclasses[${i}]} "\n" >> $tempfile2
|
||||||
|
done
|
||||||
|
unset i
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
|
||||||
|
dialog --clear --item-help --title "FAI - Fully Automatic Installation" --help-button \
|
||||||
|
--default-item "$default" \
|
||||||
|
--menu "\nSelect your FAI profile\n\nThe profile will define a list of classes,\nwhich are used by FAI.\n\n\n"\
|
||||||
|
15 70 0 "${par[@]}" 2> $tempfile 1> $out
|
||||||
|
|
||||||
|
_retval=$?
|
||||||
|
case $_retval in
|
||||||
|
0)
|
||||||
|
prtresult
|
||||||
|
break ;;
|
||||||
|
1)
|
||||||
|
echo "No profile selected."
|
||||||
|
break ;;
|
||||||
|
2)
|
||||||
|
dialog --title "Description of all profiles" --textbox $tempfile2 0 0 1> $out;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
done
|
||||||
|
unset par ardesc arshort arlong arclasses list tempfile tempfile2 _parsed _retval line
|
|
@ -0,0 +1,28 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
if [ X$FAI_ACTION = Xinstall -o X$FAI_ACTION = X ]; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if [ X$action = Xdirinstall ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
grep -q INSTALL $LOGDIR/FAI_CLASSES || return 0
|
||||||
|
[ "$flag_menu" ] || return 0
|
||||||
|
|
||||||
|
out=$(tty)
|
||||||
|
red=$(mktemp)
|
||||||
|
echo 'screen_color = (CYAN,RED,ON)' > $red
|
||||||
|
|
||||||
|
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
|
|
@ -0,0 +1,26 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# assign classes to hosts based on their hostname
|
||||||
|
|
||||||
|
# do not use this if a menu will be presented
|
||||||
|
[ "$flag_menu" ] && exit 0
|
||||||
|
|
||||||
|
# use a list of classes for our demo machine
|
||||||
|
case $HOSTNAME in
|
||||||
|
faiserver)
|
||||||
|
echo "FAIBASE DEBIAN DEMO FAISERVER" ;;
|
||||||
|
demohost|client*)
|
||||||
|
echo "FAIBASE DEBIAN DEMO" ;;
|
||||||
|
xfcehost)
|
||||||
|
echo "FAIBASE DEBIAN DEMO XORG XFCE LVM";;
|
||||||
|
gnomehost)
|
||||||
|
echo "FAIBASE DEBIAN DEMO XORG GNOME";;
|
||||||
|
ubuntuhost)
|
||||||
|
echo "FAIBASE DEBIAN DEMO UBUNTU JAMMY JAMMY64 XORG";;
|
||||||
|
rocky)
|
||||||
|
echo "FAIBASE ROCKY" # you may want to add class XORG here
|
||||||
|
ifclass AMD64 && echo ROCKY8_64
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "FAIBASE DEBIAN DEMO" ;;
|
||||||
|
esac
|
|
@ -0,0 +1,11 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
ifclass -o CENTOS ROCKY && exit 0
|
||||||
|
|
||||||
|
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
|
|
@ -0,0 +1,14 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# define classes for disk_config in an EFI environment
|
||||||
|
|
||||||
|
if [ ! -d /sys/firmware/efi ] || ifclass GRUB_PC; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
for c in CLOUD LVM FAISERVER FAIBASE HW4F_DESKTOP; do
|
||||||
|
if ifclass $c; then
|
||||||
|
echo ${c}_EFI
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
|
@ -0,0 +1 @@
|
||||||
|
NIC1=eth0
|
|
@ -0,0 +1,26 @@
|
||||||
|
release=bullseye
|
||||||
|
apt_cdn=http://deb.debian.org
|
||||||
|
security_cdn=http://security.debian.org
|
||||||
|
|
||||||
|
# since bullseye Debian changed the suite name for security
|
||||||
|
if [ $release = buster ]; then
|
||||||
|
secsuite=buster/updates
|
||||||
|
else
|
||||||
|
secsuite=$release-security
|
||||||
|
fi
|
||||||
|
|
||||||
|
CONSOLEFONT=
|
||||||
|
KEYMAP=de-latin1
|
||||||
|
|
||||||
|
# MODULESLIST contains modules that will be loaded by the new system,
|
||||||
|
# not during installation these modules will be written to /etc/modules
|
||||||
|
# If you need a module during installation, add it to $kernelmodules
|
||||||
|
# in 20-hwdetect.sh.
|
||||||
|
MODULESLIST="usbhid psmouse"
|
||||||
|
|
||||||
|
# if you have enough RAM (>2GB) you may want to enable this line. It
|
||||||
|
# also puts /var/cache into a ramdisk.
|
||||||
|
#FAI_RAMDISKS="$target/var/lib/dpkg $target/var/cache"
|
||||||
|
|
||||||
|
# if you want to use the faiserver as APT proxy
|
||||||
|
APTPROXY=http://faiserver:3142
|
|
@ -0,0 +1,29 @@
|
||||||
|
# default values for installation. You can override them in your *.var files
|
||||||
|
|
||||||
|
# allow installation of packages from unsigned repositories
|
||||||
|
FAI_ALLOW_UNSIGNED=1
|
||||||
|
|
||||||
|
# Set UTC=yes if your system clock is set to UTC (GMT), and UTC=no if not.
|
||||||
|
UTC=yes
|
||||||
|
TIMEZONE=Europe/Berlin
|
||||||
|
|
||||||
|
# the hash of the root password for the new installed linux system
|
||||||
|
# pw is "fai"
|
||||||
|
ROOTPW='$1$kBnWcO.E$djxB128U7dMkrltJHPf6d1'
|
||||||
|
|
||||||
|
# errors in tasks greater than this value will cause the installation to stop
|
||||||
|
STOP_ON_ERROR=700
|
||||||
|
|
||||||
|
# set parameter for install_packages(8)
|
||||||
|
MAXPACKAGES=800
|
||||||
|
|
||||||
|
# Account on the FAI server for saving log files and calling fai-chboot.
|
||||||
|
# Remove the hash character in the next line to activate this feature
|
||||||
|
#LOGUSER=fai
|
||||||
|
|
||||||
|
# a user account will be created
|
||||||
|
username=demo
|
||||||
|
USERPW='$1$kBnWcO.E$djxB128U7dMkrltJHPf6d1'
|
||||||
|
|
||||||
|
# set a default
|
||||||
|
FAI_DEBOOTSTRAP="bullseye http://deb.debian.org/debian"
|
|
@ -0,0 +1,3 @@
|
||||||
|
# german environment (for Debian)
|
||||||
|
KEYMAP=de-latin1-nodeadkeys
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
# set time
|
||||||
|
UTC=yes
|
||||||
|
TIMEZONE=Europe/Berlin
|
||||||
|
|
||||||
|
# some install parameters
|
||||||
|
STOP_ON_ERROR=700
|
||||||
|
MAXPACKAGES=800
|
||||||
|
|
||||||
|
KEYMAP=de-latin1-nodeadkeys
|
||||||
|
|
||||||
|
# start user and password
|
||||||
|
username=user
|
||||||
|
USERPW='$5$n4TiokMaqws2PC/i$eqDh77it8N/haBU6OeE6WqbBjI0E1IUczp2EJ7Tr4J/'
|
||||||
|
|
||||||
|
SUPRESS_GNOME_INITIAL_SCREEN=1
|
|
@ -0,0 +1 @@
|
||||||
|
FAI_ACTION=install
|
|
@ -0,0 +1 @@
|
||||||
|
FAI_ACTION=inventory
|
|
@ -0,0 +1,9 @@
|
||||||
|
CONSOLEFONT=lat9v-16
|
||||||
|
KEYMAP=us
|
||||||
|
DEFAULTLOCALE=en_US.UTF-8
|
||||||
|
SUPPORTEDLOCALE=en_US.UTF-8:en_US:en
|
||||||
|
|
||||||
|
# if you install much software and have only few RAM, use the RAM disk
|
||||||
|
# not for var/cache/yum
|
||||||
|
#FAI_RAMDISKS="$target/var/lib/rpm $target/var/cache/yum"
|
||||||
|
FAI_RAMDISKS="$target/var/lib/rpm"
|
|
@ -0,0 +1 @@
|
||||||
|
FAI_ACTION=sysinfo
|
|
@ -0,0 +1,2 @@
|
||||||
|
ubuntumirror=http://archive.ubuntu.com
|
||||||
|
ubuntudist=jammy
|
|
@ -0,0 +1,54 @@
|
||||||
|
Default: Xfce
|
||||||
|
|
||||||
|
Name: Simple
|
||||||
|
Description: My first FAI installation
|
||||||
|
Short: just a very simple example, no xorg, an account called demo
|
||||||
|
Long: This is the demohost example of FAI.
|
||||||
|
Additional account called demo with password: fai, root password: fai
|
||||||
|
All needed packages are already on the CD or USB stick.
|
||||||
|
Classes: INSTALL FAIBASE DEBIAN DEMO
|
||||||
|
|
||||||
|
Name: Xfce
|
||||||
|
Description: Xfce desktop, LVM partitioning
|
||||||
|
Short: A fancy Xfce desktop will be installed, the user account is demo
|
||||||
|
Long: This is the Xfce desktop example. Additional account called
|
||||||
|
demo with password: fai, root password: fai
|
||||||
|
All needed packages are already on the CD or USB stick.
|
||||||
|
Classes: INSTALL FAIBASE DEBIAN DEMO XORG XFCE LVM
|
||||||
|
|
||||||
|
Name: Gnome
|
||||||
|
Description: Gnome desktop installation
|
||||||
|
Short: A Gnome desktop, no LVM, You will get an account called demo
|
||||||
|
Long: This is the Gnome desktop example. Additional account called
|
||||||
|
demo with password: fai, root password: fai
|
||||||
|
You should have a fast network connection, because most packages are
|
||||||
|
downloaded from the internet.
|
||||||
|
Classes: INSTALL FAIBASE DEBIAN DEMO XORG GNOME
|
||||||
|
|
||||||
|
Name: Rocky Linux 8
|
||||||
|
Description: Rocky Linux 8 with Xfce desktop
|
||||||
|
Short: A normal Xfce desktop, running Rocky Linux 8
|
||||||
|
Long: We use the Debian nfsroot for installing the Rocky Linux 8 OS.
|
||||||
|
You should have a fast network connection, because most packages are
|
||||||
|
downloaded from the internet.
|
||||||
|
Classes: INSTALL FAIBASE ROCKY ROCKY8_64 XORG
|
||||||
|
|
||||||
|
Name: Ubuntu
|
||||||
|
Description: Ubuntu 22.04 LTS 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 JAMMY JAMMY64 XORG
|
||||||
|
|
||||||
|
Name: Inventory
|
||||||
|
Description: Show hardware info
|
||||||
|
Short: Show some basic hardware infos
|
||||||
|
Long: Execute commands for showing hardware info
|
||||||
|
Classes: INVENTORY
|
||||||
|
|
||||||
|
Name: Sysinfo
|
||||||
|
Description: Show defailed system information
|
||||||
|
Short: Show detailed hardware and system information
|
||||||
|
Long: Execute a lot of commands for collecting system information
|
||||||
|
Classes: SYSINFO
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Linux command line:
|
||||||
|
grub-pc grub2/linux_cmdline_default string elevator=noop quiet
|
|
@ -0,0 +1,9 @@
|
||||||
|
exim4-config exim4/dc_eximconfig_configtype select local delivery only; not on a network
|
||||||
|
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 us
|
||||||
|
keyboard-configuration keyboard-configuration/variant select Deutsch
|
||||||
|
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
|
|
@ -0,0 +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
|
|
@ -0,0 +1,36 @@
|
||||||
|
locales locales/default_environment_locale select de_DE.UTF-8
|
||||||
|
locales locales/locales_to_be_generated multiselect de_DE.UTF-8 UTF-8
|
||||||
|
|
||||||
|
xserver-xorg xserver-xorg/config/inputdevice/keyboard/layout string de
|
||||||
|
xserver-xorg xserver-xorg/config/inputdevice/keyboard/model string pc105
|
||||||
|
xserver-xorg xserver-xorg/config/inputdevice/keyboard/options string lv3:ralt_switch
|
||||||
|
xserver-xorg xserver-xorg/autodetect_monitor boolean false
|
||||||
|
xserver-xorg xserver-xorg/autodetect_keyboard boolean true
|
||||||
|
xserver-xorg xserver-xorg/autodetect_mouse boolean true
|
||||||
|
xserver-xorg xserver-xorg/autodetect_video_card boolean true
|
||||||
|
|
||||||
|
console-setup console-setup/variant select Germany
|
||||||
|
console-setup console-setup/charmap select UTF-8
|
||||||
|
console-setup console-setup/layoutcode string de
|
||||||
|
console-setup console-setup/compose select No compose key
|
||||||
|
console-setup console-setup/fontsize-text select 16
|
||||||
|
console-setup console-setup/optionscode string lv3:ralt_switch
|
||||||
|
console-setup console-setup/layout select Germany
|
||||||
|
console-setup console-setup/detected note
|
||||||
|
console-setup console-setup/variantcode string
|
||||||
|
console-setup console-setup/codesetcode string Lat15
|
||||||
|
console-setup console-setup/modelcode string pc105
|
||||||
|
console-setup console-setup/ask_detect boolean false
|
||||||
|
console-setup console-setup/altgr select Right Alt
|
||||||
|
console-setup console-setup/ttys string /dev/tty[1-6]
|
||||||
|
console-setup console-setup/model select Generic 105-key (Intl) PC
|
||||||
|
console-setup console-setup/fontsize-fb select 16
|
||||||
|
console-setup console-setup/switch select No temporary switch
|
||||||
|
console-setup console-setup/codeset select # Latin1 and Latin5 - western Europe and Turkic languages
|
||||||
|
console-setup console-setup/toggle select No toggling
|
||||||
|
console-setup console-setup/fontface select VGA
|
||||||
|
console-setup console-setup/fontsize string 16
|
||||||
|
|
||||||
|
tzdata tzdata/Zones/Etc select UTC
|
||||||
|
tzdata tzdata/Zones/Europe select Berlin
|
||||||
|
tzdata tzdata/Areas select Europe
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,7 @@
|
||||||
|
# config for a disk image for a VM
|
||||||
|
#
|
||||||
|
# <type> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:msdos bootable:1 fstabkey:uuid align-at:1M
|
||||||
|
|
||||||
|
primary / 300- ext4 rw,discard,barrier=0,noatime,errors=remount-ro tuneopts="-c 0 -i 0"
|
|
@ -0,0 +1,8 @@
|
||||||
|
# config for a disk image for a VM
|
||||||
|
#
|
||||||
|
# p=<partlabel> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:gpt bootable:1 fstabkey:uuid align-at:1M
|
||||||
|
|
||||||
|
p=efi /boot/efi 64M vfat defaults createopts="-F 32"
|
||||||
|
p=root / 300- ext4 rw,discard,barrier=0,noatime,errors=remount-ro tuneopts="-c 0 -i 0"
|
|
@ -0,0 +1,9 @@
|
||||||
|
# example of new config file for setup-storage
|
||||||
|
#
|
||||||
|
# <type> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:msdos bootable:1 fstabkey:uuid
|
||||||
|
|
||||||
|
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"
|
|
@ -0,0 +1,10 @@
|
||||||
|
# example of new config file for setup-storage
|
||||||
|
#
|
||||||
|
# p=<partlabel> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:gpt bootable:1 fstabkey:uuid
|
||||||
|
|
||||||
|
p=efi /boot/efi 512M vfat rw
|
||||||
|
p=root / 2G-50G ext4 rw,noatime,errors=remount-ro
|
||||||
|
p= swap 200-10G swap sw
|
||||||
|
p=home /home 100- ext4 rw,noatime,nosuid,nodev createopts="-L home -m 1" tuneopts="-c 0 -i 0"
|
|
@ -0,0 +1,11 @@
|
||||||
|
# config file for an FAI install server
|
||||||
|
#
|
||||||
|
# <type> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:msdos fstabkey:uuid
|
||||||
|
|
||||||
|
primary / 2G-15G ext4 rw,noatime,errors=remount-ro
|
||||||
|
logical swap 200-1000 swap sw
|
||||||
|
logical /tmp 100-1000 ext4 rw,noatime,nosuid,nodev createopts="-m 0" tuneopts="-c 0 -i 0"
|
||||||
|
logical /home 100-40% ext4 rw,noatime,nosuid,nodev createopts="-m 1" tuneopts="-c 0 -i 0"
|
||||||
|
logical /srv 1G-50% ext4 rw,noatime createopts="-m 1" tuneopts="-c 0 -i 0"
|
|
@ -0,0 +1,12 @@
|
||||||
|
# config file for an FAI install server
|
||||||
|
#
|
||||||
|
# p=<partlabel> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:gpt fstabkey:uuid
|
||||||
|
|
||||||
|
p=efi /boot/efi 512M vfat rw
|
||||||
|
p=system / 2G-15G ext4 rw,noatime,errors=remount-ro
|
||||||
|
p=swap swap 200-1000 swap sw
|
||||||
|
p= /tmp 100-1000 ext4 rw,noatime,nosuid,nodev createopts="-m 0" tuneopts="-c 0 -i 0"
|
||||||
|
p=home /home 100-40% ext4 rw,noatime,nosuid,nodev createopts="-m 1" tuneopts="-c 0 -i 0"
|
||||||
|
p=data /srv 1G-50% ext4 rw,noatime createopts="-m 1" tuneopts="-c 0 -i 0"
|
|
@ -0,0 +1,5 @@
|
||||||
|
disk_config disk1 disklabel:msdos bootable:1 fstabkey:uuid
|
||||||
|
|
||||||
|
logical swap 200-10G swap sw
|
||||||
|
primary / 4G-50G ext4 rw,noatime,errors=remount-ro
|
||||||
|
logical /home 100- ext4 rw,noatime,nosuid,nodev createopts="-L home -m 1" tuneopts="-c 0 -i 0"
|
|
@ -0,0 +1,6 @@
|
||||||
|
disk_config disk1 disklabel:gpt bootable:1 fstabkey:uuid
|
||||||
|
|
||||||
|
primary /boot/efi 512M vfat rw
|
||||||
|
primary / 4G-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"
|
|
@ -0,0 +1,15 @@
|
||||||
|
# <type> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
# entire disk with LVM, separate /home
|
||||||
|
|
||||||
|
disk_config disk1 fstabkey:uuid align-at:1M
|
||||||
|
|
||||||
|
primary /boot 200 ext4 rw,noatime
|
||||||
|
primary - 4G- - -
|
||||||
|
|
||||||
|
disk_config lvm
|
||||||
|
|
||||||
|
vg vg1 disk1.2
|
||||||
|
vg1-root / 3G-50G ext4 noatime,rw
|
||||||
|
vg1-swap swap 200-4G swap sw
|
||||||
|
vg1-home /home 600- ext4 noatime,nosuid,nodev,rw
|
|
@ -0,0 +1,16 @@
|
||||||
|
# p=<partlabel> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
# entire disk with LVM, separate /home
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:gpt fstabkey:uuid align-at:1M
|
||||||
|
|
||||||
|
p=efi /boot/efi 512M vfat rw
|
||||||
|
p=boot /boot 200 ext4 rw,noatime
|
||||||
|
p=system - 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
|
|
@ -0,0 +1,10 @@
|
||||||
|
# example of new config file for setup-storage
|
||||||
|
#
|
||||||
|
# <type> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
disk_config disk1 disklabel:msdos bootable:1 fstabkey:label
|
||||||
|
|
||||||
|
primary / 4G-50G ext4 rw,noatime,errors=remount-ro createopts="-L ROOT"
|
||||||
|
|
||||||
|
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"
|
|
@ -0,0 +1,12 @@
|
||||||
|
# example of new config file for setup-storage
|
||||||
|
#
|
||||||
|
# <type> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
# 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"
|
|
@ -0,0 +1,13 @@
|
||||||
|
# example of new config file for setup-storage
|
||||||
|
#
|
||||||
|
# <type> <mountpoint> <size> <fs type> <mount options> <misc options>
|
||||||
|
|
||||||
|
# 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"
|
|
@ -0,0 +1 @@
|
||||||
|
Acquire::http::Proxy "http://hw4f-fai-vagrant:3142";
|
|
@ -0,0 +1,5 @@
|
||||||
|
DPkg {
|
||||||
|
Options {
|
||||||
|
"--force-confdef";
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,11 @@
|
||||||
|
Package: *
|
||||||
|
Pin: origin live.linuxmint.com
|
||||||
|
Pin-Priority: 750
|
||||||
|
|
||||||
|
Package: *
|
||||||
|
Pin: release o=linuxmint,c=upstream
|
||||||
|
Pin-Priority: 700
|
||||||
|
|
||||||
|
Package: *
|
||||||
|
Pin: release o=Ubuntu
|
||||||
|
Pin-Priority: 500
|
|
@ -0,0 +1,3 @@
|
||||||
|
deb {%apt_cdn%}/debian {%release%} main
|
||||||
|
deb {%security_cdn%}/debian-security {%secsuite%} main
|
||||||
|
deb {%apt_cdn%}/debian {%release%}-updates main
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,49 @@
|
||||||
|
# A configuration file for setupcon
|
||||||
|
|
||||||
|
# Change to "yes" and setupcon will explain what is being doing
|
||||||
|
VERBOSE_OUTPUT=no
|
||||||
|
|
||||||
|
# Setup these consoles. Most people do not need to change this.
|
||||||
|
ACTIVE_CONSOLES="/dev/tty[1-6]"
|
||||||
|
|
||||||
|
# Put here your encoding. Valid charmaps are: UTF-8 ARMSCII-8 CP1251
|
||||||
|
# CP1255 CP1256 GEORGIAN-ACADEMY GEORGIAN-PS IBM1133 ISIRI-3342
|
||||||
|
# ISO-8859-1 ISO-8859-2 ISO-8859-3 ISO-8859-4 ISO-8859-5 ISO-8859-6
|
||||||
|
# ISO-8859-7 ISO-8859-8 ISO-8859-9 ISO-8859-10 ISO-8859-11 ISO-8859-13
|
||||||
|
# ISO-8859-14 ISO-8859-15 ISO-8859-16 KOI8-R KOI8-U TIS-620 VISCII
|
||||||
|
CHARMAP="UTF-8"
|
||||||
|
|
||||||
|
# The codeset determines which symbols are supported by the font.
|
||||||
|
# Valid codesets are: Arabic Armenian CyrAsia CyrKoi CyrSlav Ethiopian
|
||||||
|
# Georgian Greek Hebrew Lao Lat15 Lat2 Lat38 Lat7 Thai Uni1 Uni2 Uni3
|
||||||
|
# Vietnamese. Read README.fonts for explanation.
|
||||||
|
CODESET="Lat15"
|
||||||
|
|
||||||
|
# Valid font faces are: VGA (sizes 8, 14 and 16), Terminus (sizes
|
||||||
|
# 12x6, 14, 16, 20x10, 24x12, 28x14 and 32x16), TerminusBold (sizes
|
||||||
|
# 14, 16, 20x10, 24x12, 28x14 and 32x16), TerminusBoldVGA (sizes 14
|
||||||
|
# and 16), Fixed (sizes 13, 14, 15, 16 and 18), Goha (sizes 12, 14 and
|
||||||
|
# 16), GohaClassic (sizes 12, 14 and 16).
|
||||||
|
FONTFACE="VGA"
|
||||||
|
FONTSIZE="16"
|
||||||
|
|
||||||
|
# You can also directly specify nonstandard font and ACM to load:
|
||||||
|
# FONT=/usr/local/share/funnyfonts/sarge16.psf
|
||||||
|
# ACM=/usr/local/share/consoletrans/my_special_encoding.acm
|
||||||
|
|
||||||
|
# The following variables describe your keyboard and can have the same
|
||||||
|
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options
|
||||||
|
# in /etc/X11/xorg.conf.
|
||||||
|
XKBMODEL="pc105"
|
||||||
|
XKBLAYOUT="de"
|
||||||
|
XKBVARIANT=""
|
||||||
|
XKBOPTIONS=""
|
||||||
|
|
||||||
|
|
||||||
|
# Do not update the following md5 sum if you change
|
||||||
|
# /etc/console-setup/boottime.kmap.gz and Debconf will not overwrite
|
||||||
|
# your custom keymap. Do not update it even if you want to make
|
||||||
|
# Debconf overwrite it. Instead simply specify the empty string as
|
||||||
|
# a md5 sum.
|
||||||
|
|
||||||
|
BOOTTIME_KMAP_MD5=""
|
|
@ -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"
|
|
@ -0,0 +1 @@
|
||||||
|
LANG="de_DE.UTF-8"
|
|
@ -0,0 +1,32 @@
|
||||||
|
# dhcpd.conf for a fai installation server
|
||||||
|
# replace faiserver with the name of your install server
|
||||||
|
|
||||||
|
ignore-client-uids on;
|
||||||
|
deny unknown-clients;
|
||||||
|
option dhcp-max-message-size 2048;
|
||||||
|
use-host-decl-names on;
|
||||||
|
#always-reply-rfc1048 on;
|
||||||
|
|
||||||
|
subnet 192.168.33.0 netmask 255.255.255.0 {
|
||||||
|
option routers 192.168.33.1;
|
||||||
|
option domain-name "fai.example";
|
||||||
|
option domain-name-servers 192.168.33.250;
|
||||||
|
option time-servers faiserver;
|
||||||
|
# option ntp-servers faiserver;
|
||||||
|
server-name faiserver;
|
||||||
|
next-server faiserver;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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
|
|
@ -0,0 +1,8 @@
|
||||||
|
# See fai.conf(5) for detailed information.
|
||||||
|
|
||||||
|
# Account for saving log files and calling fai-chboot.
|
||||||
|
LOGUSER=fai
|
||||||
|
|
||||||
|
# URL to access the fai config space
|
||||||
|
# If undefined, use default nfs://<install server>/$FAI_CONFIGDIR
|
||||||
|
FAI_CONFIG_SRC=nfs://faiserver/srv/fai/config
|
|
@ -0,0 +1,15 @@
|
||||||
|
# For a detailed description see nfsroot.conf(5)
|
||||||
|
|
||||||
|
# "<suite> <mirror>" for debootstrap
|
||||||
|
FAI_DEBOOTSTRAP="bullseye 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"
|
||||||
|
|
||||||
|
# Configuration space
|
||||||
|
FAI_CONFIGDIR=/srv/fai/config
|
||||||
|
|
||||||
|
NFSROOT_ETC_HOSTS="192.168.33.250 faiserver"
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
|
||||||
|
Plan your installation, and FAI installs your plan.
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# regenerate ssh_host keys
|
||||||
|
ls /etc/ssh/ssh_host_* >/dev/null 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
dpkg-reconfigure -fnoninteractive openssh-server
|
||||||
|
fi
|
||||||
|
rm $0
|
|
@ -0,0 +1,106 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# setup script that is only run once at boot time
|
||||||
|
# set up an FAI install server
|
||||||
|
|
||||||
|
NORMAL='\E(B\E[m'
|
||||||
|
RED='\E[31m'
|
||||||
|
GREEN='\E[32m'
|
||||||
|
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# setup network
|
||||||
|
nic=$(cat /etc/network/interfaces /etc/network/interfaces.d/* 2>/dev/null | awk '$1 == "iface" && $2 != "lo" {print $2; exit}')
|
||||||
|
if [ -n "$nic" ]; then
|
||||||
|
ifup $nic
|
||||||
|
fi
|
||||||
|
# regenerate ssh_host keys
|
||||||
|
ls /etc/ssh/ssh_host_* > /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
dpkg-reconfigure -fnoninteractive openssh-server
|
||||||
|
fi
|
||||||
|
sleep 8
|
||||||
|
[ -x /etc/init.d/nscd ] && invoke-rc.d nscd restart
|
||||||
|
|
||||||
|
echo "================================="
|
||||||
|
echo "Setting up the FAI install server"
|
||||||
|
echo "This will take a few minutes"
|
||||||
|
echo "================================="
|
||||||
|
|
||||||
|
. /etc/fai/fai.conf
|
||||||
|
. /etc/fai/nfsroot.conf
|
||||||
|
|
||||||
|
# copy the simple examples and pimp my config space
|
||||||
|
if [ ! -d "$FAI_CONFIGDIR/class" ]; then
|
||||||
|
mkdir -p $FAI_CONFIGDIR
|
||||||
|
cp -a /usr/share/doc/fai-doc/examples/simple/* $FAI_CONFIGDIR
|
||||||
|
ainsl /srv/fai/config/class/FAIBASE.var "^LOGUSER=fai"
|
||||||
|
_nic=$(ip route | awk '/^default/ {print $5}'|head -1)
|
||||||
|
myip=$(ip -br ad sh $_nic | awk '{print $3}')
|
||||||
|
myip=${myip%/*}
|
||||||
|
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
|
||||||
|
ainsl /etc/fai/fai.conf "^LOGUSER=fai"
|
||||||
|
|
||||||
|
# make index, then import the packages from the CD mirror
|
||||||
|
apt-get update >/dev/null
|
||||||
|
curl -fs 'http://127.0.0.1:3142/acng-report.html?doImport=Start+Import&calcSize=cs&asNeeded=an#bottom' >/dev/null
|
||||||
|
|
||||||
|
# setup the FAI server, including creating the nfsroot, use my own proxy
|
||||||
|
export APTPROXY="http://127.0.0.1:3142"
|
||||||
|
if [ -f /var/tmp/base.tar.xz ]; then
|
||||||
|
fai-setup -fvB /var/tmp/base.tar.xz > /var/log/fai/fai-setup.log 2>&1
|
||||||
|
else
|
||||||
|
fai-setup -fv > /var/log/fai/fai-setup.log 2>&1
|
||||||
|
fi
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
rm /var/tmp/base.tar.xz
|
||||||
|
echo ""
|
||||||
|
echo "================================================"
|
||||||
|
echo -e "Setting up the FAI server was ${GREEN}successful${NORMAL}"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
sleep 10
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo "=================================================="
|
||||||
|
echo -e "${RED}ERROR${NORMAL}: Setting up the FAI install server ${RED}FAILED${NORMAL}!"
|
||||||
|
echo "Read /var/log/fai/fai-setup.log for more debugging"
|
||||||
|
echo "=================================================="
|
||||||
|
echo ""
|
||||||
|
sleep 10
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF >> /srv/fai/nfsroot/etc/fai/fai.conf
|
||||||
|
# use short hostname instead of FQDN
|
||||||
|
export HOSTNAME=\${HOSTNAME%%.*}
|
||||||
|
echo \$HOSTNAME > /proc/sys/kernel/hostname
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# create default pxelinux boot configuration
|
||||||
|
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 bullseye.tmpl
|
||||||
|
|
||||||
|
# Since we do not know the MAC address, our DHCP cannot provide the hostname.
|
||||||
|
# Therefore we do explicitly set the hostname
|
||||||
|
fai-chboot -Iv -f verbose,sshd,createvt,menu -u nfs://faiserver/srv/fai/config -k hostname=xfcehost xfcehost
|
||||||
|
fai-chboot -Iv -f verbose,sshd,createvt,menu -u nfs://faiserver/srv/fai/config -k hostname=demohost demohost
|
||||||
|
for c in {01..10}; do
|
||||||
|
fai-chboot -Iv -f verbose,sshd,createvt,menu -u nfs://faiserver/srv/fai/config -k hostname=client$c client$c
|
||||||
|
done
|
||||||
|
|
||||||
|
fai-monitor > /var/log/fai/fai-monitor.log &
|
||||||
|
|
||||||
|
# move me away
|
||||||
|
mv $0 /var/tmp
|
||||||
|
|
||||||
|
# create new rc.local for next reboot
|
||||||
|
echo '#! /bin/bash' > /etc/rc.local
|
||||||
|
echo 'fai-monitor > /var/log/fai/fai-monitor.log &' >> /etc/rc.local
|
||||||
|
chmod a+rx /etc/rc.local
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,12 @@
|
||||||
|
# This file controls the state of SELinux on the system.
|
||||||
|
# SELINUX= can take one of these three values:
|
||||||
|
# enforcing - SELinux security policy is enforced.
|
||||||
|
# permissive - SELinux prints warnings instead of enforcing.
|
||||||
|
# disabled - No SELinux policy is loaded.
|
||||||
|
SELINUX=disabled
|
||||||
|
# SELINUXTYPE= can take one of these two values:
|
||||||
|
# targeted - Only targeted network daemons are protected.
|
||||||
|
# strict - Full SELinux protection.
|
||||||
|
# mls - Multi Level Security protection.
|
||||||
|
SELINUXTYPE=targeted
|
||||||
|
# SETLOCALDEFS= Check local definition changes
|
|
@ -0,0 +1,45 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# hook for installing a file system image (tar file)
|
||||||
|
# this works for Ubuntu 14.04
|
||||||
|
#
|
||||||
|
# Copyright (C) 2015 Thomas Lange, lange@cs.uni-koeln.de
|
||||||
|
|
||||||
|
|
||||||
|
# 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 --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
|
||||||
|
skiptask configure # do not run the usual configure scripts
|
||||||
|
|
||||||
|
# we assume, that the new host will get its hostname and IP via DHCP
|
||||||
|
# remove old hostname
|
||||||
|
fgrep -v 127.0.1.1 $target/etc/hosts >> /tmp/fai/hosts
|
||||||
|
mv /tmp/fai/hosts $target/etc/hosts
|
||||||
|
rm $target/etc/hostname
|
||||||
|
|
||||||
|
#install grub
|
||||||
|
mount -t proc proc $FAI_ROOT/proc
|
||||||
|
mount -t sysfs sysfs $FAI_ROOT/sys
|
||||||
|
mount --bind /dev $FAI_ROOT/dev
|
||||||
|
|
||||||
|
if [ -f $target/etc/debian_version ]; then
|
||||||
|
$ROOTCMD grub-install $BOOT_DEVICE
|
||||||
|
$ROOTCMD update-grub
|
||||||
|
fi
|
||||||
|
if [ -f $target/etc/centos-release ]; then
|
||||||
|
rm $target/etc/grub2/device.map
|
||||||
|
$FAI/scripts/ROCKY/40-install-grub
|
||||||
|
$FAI/scripts/ROCKY/30-mkinitrd
|
||||||
|
$ROOTCMD fixfiles onboot # this fixes the SELinux security contexts during the first boot
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# things that may be adjusted:
|
||||||
|
#
|
||||||
|
# MAC address ?? (not needed for Ubuntu, it uses iftab(5)
|
||||||
|
# /etc/hosts may contain the IP and name of the original host
|
||||||
|
# /etc/hostname (for Ubuntu just remove it)
|
||||||
|
# /var/lib/NetworkManager/dhclient-eth0.conf?
|
|
@ -0,0 +1,3 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
skiptask debconf
|
|
@ -0,0 +1,25 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# if package locales will be installed, then install it early, before
|
||||||
|
# other packages
|
||||||
|
if [ $FAI_ACTION != "install" -a $FAI_ACTION != "dirinstall" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
fcopy -Bi /etc/apt/apt.conf.d/force_confdef
|
||||||
|
ainsl -a /etc/ucf.conf "^conf_force_conffold=YES"
|
||||||
|
|
||||||
|
# in case the locales are already included inside the base file (Ubuntu)
|
||||||
|
if [ -f $target/usr/sbin/locale-gen ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if we want to install locales, install them now
|
||||||
|
install_packages -l 2>/dev/null | egrep -q ' locales|locales '
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
if [ X$verbose = X1 ]; then
|
||||||
|
$ROOTCMD apt-get -y install locales
|
||||||
|
else
|
||||||
|
$ROOTCMD apt-get -y install locales > /dev/null
|
||||||
|
fi
|
||||||
|
fi
|
|
@ -0,0 +1,31 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# (c) Michael Goetze, 2010-2011, mgoetze@mgoetze.net
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
if [ $FAI_ACTION = "install" ]; then
|
||||||
|
mount -t proc proc $target/proc
|
||||||
|
mount -t sysfs sysfs $target/sys
|
||||||
|
[ -L $target/etc/mtab ] || cp /etc/mtab $target/etc/mtab
|
||||||
|
|
||||||
|
cat > $target/etc/sysconfig/network <<-EOF
|
||||||
|
NETWORKING=yes
|
||||||
|
HOSTNAME=$HOSTNAME.$DOMAIN
|
||||||
|
EOF
|
||||||
|
echo "127.0.0.1 localhost" > $target/etc/hosts
|
||||||
|
ifclass DHCPC || ainsl -s /etc/hosts "$IPADDR $HOSTNAME.$DOMAIN $HOSTNAME"
|
||||||
|
cp /etc/resolv.conf $target/etc
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir $target/dev/pts
|
||||||
|
mknod -m 000 $target/dev/pts/ptmx c 5 2
|
||||||
|
|
||||||
|
fcopy -riv /etc/yum.repos.d/
|
||||||
|
|
||||||
|
# disable the fastestmirror plugin
|
||||||
|
#fai-sed 's/enabled=1/enabled=0/' /etc/yum/pluginconf.d/fastestmirror.conf
|
||||||
|
|
||||||
|
skiptask repository
|
||||||
|
|
||||||
|
exit $error
|
|
@ -0,0 +1,223 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# parse all log files for error messages
|
||||||
|
# print errors and warnings found to error.log
|
||||||
|
# WARNING: This will only work with english error messages!
|
||||||
|
|
||||||
|
errfile=$LOGDIR/error.log
|
||||||
|
|
||||||
|
# Define grep patterns. Do not start or end with an empty line!
|
||||||
|
globalerrorpatterns="error
|
||||||
|
fail
|
||||||
|
warn
|
||||||
|
bad
|
||||||
|
bad
|
||||||
|
no space
|
||||||
|
Couldn't stat
|
||||||
|
Cannot access
|
||||||
|
conflict
|
||||||
|
is bigger than the limit
|
||||||
|
did not exist
|
||||||
|
non existent
|
||||||
|
not found
|
||||||
|
couldn't
|
||||||
|
can't
|
||||||
|
E: Sorry, broken packages
|
||||||
|
^E:
|
||||||
|
operator expected
|
||||||
|
ambiguous redirect
|
||||||
|
No previous regular expression
|
||||||
|
No such
|
||||||
|
Device or resource busy
|
||||||
|
unknown option
|
||||||
|
[a-z]\+\.log:E:
|
||||||
|
No candidate version found
|
||||||
|
segfault
|
||||||
|
Couldn't find any package whose name or description matched
|
||||||
|
cannot create
|
||||||
|
The following packages have unmet dependencies"
|
||||||
|
|
||||||
|
globalignorepatterns="[a-z]\+\.log:#
|
||||||
|
Error: Driver 'pcspkr' is already registered, aborting
|
||||||
|
: bytes packets errors dropped
|
||||||
|
:+ error=0
|
||||||
|
:+ trap error=
|
||||||
|
task_error_func=
|
||||||
|
STOP_ON_ERROR=
|
||||||
|
courier-webadmin
|
||||||
|
plugins-bad
|
||||||
|
Enabling conf localized-error-pages
|
||||||
|
ibwebadmin
|
||||||
|
kernel-patch-badram
|
||||||
|
kolab-webadmin
|
||||||
|
kolabadmin
|
||||||
|
gstreamer.\+-plugins-really-bad
|
||||||
|
liberrors.so
|
||||||
|
liberrors-samba
|
||||||
|
libsamba-errors
|
||||||
|
gsambad
|
||||||
|
libad
|
||||||
|
libtest-nowarnings-perl
|
||||||
|
libtest-warn-perl
|
||||||
|
libclass-errorhandler-perl
|
||||||
|
zope-ploneerrorreporting
|
||||||
|
libroxen-errormessage
|
||||||
|
liberror-perl
|
||||||
|
perl-Error
|
||||||
|
libgpg-error-dev
|
||||||
|
libgpg-error0
|
||||||
|
Opts:.\+errors=remount
|
||||||
|
[RT]X packets:
|
||||||
|
WARNING: unexpected IO-APIC
|
||||||
|
warned about = ( )
|
||||||
|
daemon.warn
|
||||||
|
kern.warn
|
||||||
|
rw,errors=
|
||||||
|
Expect some cache
|
||||||
|
no error
|
||||||
|
failmsg
|
||||||
|
RPC call returned error 101
|
||||||
|
deverror.out
|
||||||
|
(floppy), sector 0
|
||||||
|
mount version older than kernel
|
||||||
|
Can't locate module
|
||||||
|
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
|
||||||
|
confC._FILE
|
||||||
|
Warning: 3 database(s) sources
|
||||||
|
were not found, (but were created)
|
||||||
|
removing exim
|
||||||
|
The home dir you specified already exists.
|
||||||
|
No Rule for /usr/lib/ispell/default.hash.
|
||||||
|
/usr/sbin/update-fonts-.\+: warning: absolute path
|
||||||
|
hostname: Unknown server error
|
||||||
|
EXT2-fs warning: checktime reached
|
||||||
|
RPC: sendmsg returned error 101
|
||||||
|
can't print them to stdout. Define these classes
|
||||||
|
warning: downgrading
|
||||||
|
suppress emacs errors
|
||||||
|
echo Error:
|
||||||
|
Can't open dependencies file
|
||||||
|
documents in /usr/doc are no longer supported
|
||||||
|
if you have both a SCSI and an IDE CD-ROM
|
||||||
|
Warning: /proc/ide/hd?/settings interface is obsolete, and will be removed soon
|
||||||
|
Monitoring disabled
|
||||||
|
Error: only one processor found.
|
||||||
|
Error Recovery Strategy:
|
||||||
|
sector 0 does not have an
|
||||||
|
syslogin_perform_logout: logout() returned an error
|
||||||
|
grub is not in an XFS filesystem.
|
||||||
|
grub-install: line 374:
|
||||||
|
grub-probe: error: Cannot open \`/boot/grub/device.map'
|
||||||
|
is harmless
|
||||||
|
not updating .\+ font directory data.
|
||||||
|
register_serial(): autoconfig failed
|
||||||
|
Fontconfig error: Cannot load default config file
|
||||||
|
asking for cache data failed
|
||||||
|
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
|
||||||
|
/cow': No such file or directory
|
||||||
|
Dummy start-stop-daemon called
|
||||||
|
X: bytes packets errors
|
||||||
|
ACPI Error
|
||||||
|
ACPI Warning
|
||||||
|
AE_NOT_FOUND
|
||||||
|
conflicts with ACPI region
|
||||||
|
cannot stat \`/etc/modprobe.d/\*.conf'
|
||||||
|
cdrom: open failed.
|
||||||
|
libgpg-error
|
||||||
|
process \`kudzu' used the deprecated sysctl system call
|
||||||
|
PM: Resume from disk failed
|
||||||
|
JBD: barrier-based sync failed
|
||||||
|
aufs: module is from the staging directory, the quality is unknown
|
||||||
|
warning: linuxlogo stop runlevel arguments (none) do not match
|
||||||
|
insserv: warning: script .\+ missing LSB tags and overrides
|
||||||
|
live-premount.\+ If this fails
|
||||||
|
cannot read table of mounted file systems
|
||||||
|
error: no alternatives for
|
||||||
|
ERST: Error Record Serialization Table (ERST) support is initialized
|
||||||
|
ERST: Table is not found
|
||||||
|
HEST: Table not found
|
||||||
|
failed to stat /dev/pts
|
||||||
|
Failed to connect to socket /var/run/dbus/system_bus_socket
|
||||||
|
fail to add MMCONFIG information
|
||||||
|
can't initialize iptables table
|
||||||
|
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
|
||||||
|
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
# Here you can define your own patterns. Put one pattern in a line,
|
||||||
|
# do not create empty lines.
|
||||||
|
myerrorpatterns="X_X-X_XX"
|
||||||
|
myignorepatterns="X_X-X_XX"
|
||||||
|
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
# The main routine
|
||||||
|
errorpatterns="$globalerrorpatterns
|
||||||
|
$myerrorpatterns"
|
||||||
|
ignorepatterns="$globalignorepatterns
|
||||||
|
$myignorepatterns"
|
||||||
|
|
||||||
|
cd $LOGDIR || exit 3
|
||||||
|
if [ -s $errfile ]; then
|
||||||
|
echo "Errorfile already exists. Aborting." >&2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
grep -i "$errorpatterns" *.log | grep -vi "$ignorepatterns" > $errfile
|
||||||
|
if [ X$verbose = X1 ]; then
|
||||||
|
egrep -v '^software.log:' $errfile > $LOGDIR/tempfile
|
||||||
|
mv $LOGDIR/tempfile $errfile
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -s $errfile ]; then
|
||||||
|
echo "ERRORS found in log files. See $errfile" >&2
|
||||||
|
else
|
||||||
|
echo "Congratulations! No errors found in log files."
|
||||||
|
# export flag_reboot=1 # if you want to reboot if no errors are found
|
||||||
|
fi
|
|
@ -0,0 +1,7 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# use short hostname instead of FQDN
|
||||||
|
export HOSTNAME=${HOSTNAME%%.*}
|
||||||
|
if [ $do_init_tasks -eq 1 ]; then
|
||||||
|
echo $HOSTNAME > /proc/sys/kernel/hostname
|
||||||
|
fi
|
|
@ -0,0 +1,14 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
if [ -n "$APTPROXY" ]; then
|
||||||
|
echo "Acquire::http::Proxy \"$APTPROXY\";" > $target/etc/apt/apt.conf.d/02proxy
|
||||||
|
else
|
||||||
|
rm -f $target/etc/apt/apt.conf.d/02proxy
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo force-unsafe-io > $target/etc/dpkg/dpkg.cfg.d/unsafe-io
|
||||||
|
|
||||||
|
# you may want to add i386 arch to amd64 hosts
|
||||||
|
# if ifclass AMD64; then
|
||||||
|
# $ROOTCMD dpkg --add-architecture i386
|
||||||
|
# fi
|
|
@ -0,0 +1,25 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
if [ ! -f $target/etc/resolv.conf ]; then
|
||||||
|
cp /etc/resolv.conf $target/etc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ X$verbose = X1 ]; then
|
||||||
|
echo "Updating base"
|
||||||
|
$ROOTCMD yum -y update |& tee -a $LOGDIR/software.log
|
||||||
|
else
|
||||||
|
$ROOTCMD yum -y update >> $LOGDIR/software.log
|
||||||
|
fi
|
||||||
|
|
||||||
|
$ROOTCMD systemd-machine-id-setup
|
||||||
|
|
||||||
|
cat > $target/etc/sysconfig/kernel <<EOF
|
||||||
|
# UPDATEDEFAULT specifies if new-kernel-pkg should make
|
||||||
|
# new kernels the default
|
||||||
|
UPDATEDEFAULT=yes
|
||||||
|
|
||||||
|
# DEFAULTKERNEL specifies the default kernel package type
|
||||||
|
DEFAULTKERNEL=kernel-core
|
||||||
|
EOF
|
||||||
|
|
||||||
|
skiptask updatebase
|
|
@ -0,0 +1,30 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# use external mirror, remove this script when using a mirror from CD
|
||||||
|
|
||||||
|
cat <<EOM > $target/etc/apt/sources.list
|
||||||
|
# external mirror
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# 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
|
|
@ -0,0 +1,10 @@
|
||||||
|
PACKAGES install DEBIAN
|
||||||
|
task-cinnamon-desktop
|
||||||
|
network-manager
|
||||||
|
network-manager-applet
|
||||||
|
network-manager-config-connectivity-debian
|
||||||
|
network-manager-gnome
|
||||||
|
|
||||||
|
PACKAGES install UBUNTU
|
||||||
|
cinnamon-desktop-environment
|
||||||
|
network-manager
|
|
@ -0,0 +1,65 @@
|
||||||
|
PACKAGES install-norec
|
||||||
|
#cryptsetup-initramfs # needed if you use an encrypted partition
|
||||||
|
apt-transport-https # is only needed for stretch
|
||||||
|
debconf-utils
|
||||||
|
file
|
||||||
|
zstd
|
||||||
|
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
|
||||||
|
# a list of firmware for wifi/wireless
|
||||||
|
atmel-firmware firmware-atheros firmware-brcm80211
|
||||||
|
firmware-iwlwifi firmware-libertas firmware-ralink firmware-zd1211
|
||||||
|
firmware-brcm80211 firmware-ti-connectivity
|
||||||
|
firmware-netronome firmware-netxen firmware-realtek
|
||||||
|
firmware-cavium
|
||||||
|
# firmware-ipw2x00 # needs a debconf question
|
||||||
|
|
||||||
|
PACKAGES install-norec I386
|
||||||
|
linux-image-686-pae
|
||||||
|
memtest86+
|
||||||
|
|
||||||
|
PACKAGES install-norec CHROOT
|
||||||
|
linux-image-686-pae-
|
||||||
|
linux-image-amd64-
|
||||||
|
|
||||||
|
PACKAGES install-norec AMD64
|
||||||
|
linux-image-amd64
|
||||||
|
memtest86+
|
||||||
|
|
||||||
|
PACKAGES install-norec ARM64
|
||||||
|
grub-efi-arm64
|
||||||
|
linux-image-arm64
|
||||||
|
|
||||||
|
PACKAGES install GRUB_PC
|
||||||
|
grub-pc
|
||||||
|
|
||||||
|
PACKAGES install GRUB_EFI
|
||||||
|
grub-efi dosfstools
|
||||||
|
|
||||||
|
PACKAGES install LVM
|
||||||
|
lvm2
|
||||||
|
|
||||||
|
PACKAGES install CLOUD
|
||||||
|
unattended-upgrades
|
||||||
|
|
||||||
|
PACKAGE install-norec CINNAMON
|
||||||
|
task-cinnamon-desktop
|
||||||
|
task-desktop
|
||||||
|
|
||||||
|
PACKAGE install-norec GERMAN
|
||||||
|
task-german
|
Binary file not shown.
|
@ -0,0 +1,9 @@
|
||||||
|
# some packages we need on a demo machine
|
||||||
|
|
||||||
|
PACKAGES install-norec
|
||||||
|
htop iotop nmon
|
||||||
|
|
||||||
|
# only when also class XORG is defined
|
||||||
|
PACKAGES install-norec XORG
|
||||||
|
bb xpenguins
|
||||||
|
#frozen-bubble
|
|
@ -0,0 +1,13 @@
|
||||||
|
PACKAGES install-norec
|
||||||
|
fai-quickstart
|
||||||
|
|
||||||
|
debmirror tcpdump
|
||||||
|
xorriso grub-pc
|
||||||
|
lftp curl
|
||||||
|
netselect
|
||||||
|
syslinux-common pxelinux
|
||||||
|
apt-cacher-ng
|
||||||
|
nscd psmisc
|
||||||
|
bind9 dnsutils
|
||||||
|
iptables-persistent
|
||||||
|
zile
|
|
@ -0,0 +1,5 @@
|
||||||
|
PACKAGES install
|
||||||
|
task-german
|
||||||
|
|
||||||
|
PACKAGES install GNOME
|
||||||
|
firefox-esr-l10n-de thunderbird-l10n-de
|
|
@ -0,0 +1,9 @@
|
||||||
|
PACKAGES install-norec
|
||||||
|
|
||||||
|
firefox-esr
|
||||||
|
#thunderbird
|
||||||
|
menu gdm3
|
||||||
|
gnome-core
|
||||||
|
gconf-editor
|
||||||
|
gnome-screensaver gnome-system-monitor gnome-system-tools
|
||||||
|
network-manager-gnome
|
|
@ -0,0 +1,16 @@
|
||||||
|
PACKAGES install
|
||||||
|
ubuntu-desktop
|
||||||
|
language-pack-de
|
||||||
|
language-pack-gnome-de
|
||||||
|
thunderbird
|
||||||
|
thunderbird-locale-de
|
||||||
|
firefox
|
||||||
|
firefox-locale-de
|
||||||
|
libreoffice
|
||||||
|
libreoffice-l10n-de
|
||||||
|
libreoffice-help-de
|
||||||
|
ubuntu-software
|
||||||
|
ubuntu-snappy
|
||||||
|
snapd
|
||||||
|
|
||||||
|
APTPROXY=http://hw4f-fai:3142
|
|
@ -0,0 +1,7 @@
|
||||||
|
PACKAGES install-norec DESKTOP
|
||||||
|
linuxmint-keyring
|
||||||
|
mint-info-cinnamon
|
||||||
|
mint-info
|
||||||
|
mint-meta-cinnamon
|
||||||
|
mint-meta-core
|
||||||
|
mint-meta-codecs
|
|
@ -0,0 +1,35 @@
|
||||||
|
PACKAGES dnfgroup
|
||||||
|
core
|
||||||
|
minimal-environment
|
||||||
|
#server-product-environment
|
||||||
|
#headless-management
|
||||||
|
|
||||||
|
PACKAGES dnfgroup XORG
|
||||||
|
graphical-server-environment
|
||||||
|
workstation-product-environment
|
||||||
|
|
||||||
|
PACKAGES dnfi
|
||||||
|
NetworkManager
|
||||||
|
chrony
|
||||||
|
kernel
|
||||||
|
dracut
|
||||||
|
less
|
||||||
|
openssh
|
||||||
|
openssh-clients
|
||||||
|
openssh-server
|
||||||
|
vim-enhanced
|
||||||
|
man
|
||||||
|
curl
|
||||||
|
unzip
|
||||||
|
which
|
||||||
|
ncurses ncurses-base
|
||||||
|
|
||||||
|
PACKAGES dnfi GRUB_PC
|
||||||
|
grub2-pc
|
||||||
|
|
||||||
|
PACKAGES dnfi GRUB_EFI
|
||||||
|
grub2-efi
|
||||||
|
|
||||||
|
|
||||||
|
PACKAGES dnfi LVM
|
||||||
|
lvm2
|
|
@ -0,0 +1,38 @@
|
||||||
|
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
|
||||||
|
reportbug
|
||||||
|
telnet
|
||||||
|
traceroute
|
||||||
|
ucf
|
||||||
|
xz-utils
|
||||||
|
vim
|
||||||
|
|
||||||
|
PACKAGES install-norec STRETCH BUSTER
|
||||||
|
python
|
||||||
|
python-minimal
|
||||||
|
|
||||||
|
PACKAGES install-norec BULLSEYE
|
||||||
|
python3
|
||||||
|
python3-minimal
|
|
@ -0,0 +1,23 @@
|
||||||
|
PACKAGES install I386
|
||||||
|
linux-image-generic
|
||||||
|
memtest86+
|
||||||
|
|
||||||
|
PACKAGES install CHROOT
|
||||||
|
linux-image-generic-
|
||||||
|
|
||||||
|
PACKAGES install AMD64
|
||||||
|
linux-image-generic
|
||||||
|
memtest86+
|
||||||
|
|
||||||
|
PACKAGES install GRUB_PC
|
||||||
|
grub-pc
|
||||||
|
|
||||||
|
PACKAGES install GRUB_EFI
|
||||||
|
grub-efi dosfstools
|
||||||
|
|
||||||
|
PACKAGES install
|
||||||
|
ubuntu-minimal
|
||||||
|
ubuntu-server
|
||||||
|
|
||||||
|
PACKAGES install GERMAN
|
||||||
|
language-pack-gnome-de
|
|
@ -0,0 +1,6 @@
|
||||||
|
PACKAGES install-norec
|
||||||
|
xfce4 # base system
|
||||||
|
xfce4-goodies # additional tools
|
||||||
|
lightdm
|
||||||
|
firefox-esr
|
||||||
|
network-manager-gnome
|
|
@ -0,0 +1,12 @@
|
||||||
|
PACKAGES install-norec DEBIAN
|
||||||
|
xorg xserver-xorg-video-all xserver-xorg-input-all
|
||||||
|
fonts-freefont-ttf
|
||||||
|
xscreensaver
|
||||||
|
xscreensaver-gl
|
||||||
|
xterm
|
||||||
|
desktop-base
|
||||||
|
|
||||||
|
PACKAGES install UBUNTU
|
||||||
|
ubuntu-server-
|
||||||
|
ubuntu-standard
|
||||||
|
ubuntu-desktop
|
|
@ -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
|
|
@ -0,0 +1,27 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
#fcopy /etc/init.d/expand-root
|
||||||
|
#if [ -f $target/files/etc/init.d/expand-root ]; then
|
||||||
|
# $ROOTCMD insserv --default expand-root
|
||||||
|
#fi
|
||||||
|
|
||||||
|
fai-sed "s/PermitRootLogin yes/PermitRootLogin without-password/" /etc/ssh/sshd_config
|
||||||
|
ainsl /etc/ssh/sshd_config 'ClientAliveInterval 120'
|
||||||
|
|
||||||
|
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 \
|
||||||
|
$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
|
||||||
|
if [ -f $target/etc/dhcp/dhclient.conf ]; then
|
||||||
|
fai-sed 's,rfc3442-classless-static-routes,disabled-\0,' /etc/dhcp/dhclient.conf
|
||||||
|
fi
|
|
@ -0,0 +1,18 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
# set root password
|
||||||
|
if [ -n "$ROOTPW" ]; then
|
||||||
|
$ROOTCMD chpasswd --encrypted <<< "root:${ROOTPW}"
|
||||||
|
elif [ -n "$username" ]; then
|
||||||
|
$ROOTCMD usermod -L root
|
||||||
|
# enable sudo for user
|
||||||
|
ainsl /etc/sudoers "$username ALL = ALL"
|
||||||
|
if [ ! -f $target/usr/bin/sudo ]; then
|
||||||
|
echo "WARNING. Package sudo is not installed"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $error
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Capabilities get lost when creating the fai base.tar.xz image.
|
||||||
|
# Restore them here.
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ ! -x $target/sbin/setcap ] ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
for FILE in /bin/ping /bin/ping6 /usr/bin/fping /usr/bin/fping6; do
|
||||||
|
if [ -x $target/$FILE -a ! -h $target/$FILE ] ; then
|
||||||
|
if $ROOTCMD /sbin/setcap cap_net_raw+ep $FILE; then
|
||||||
|
echo "Setcap worked! $FILE is not suid!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -x $target/usr/bin/systemd-detect-virt ] ; then
|
||||||
|
$ROOTCMD /sbin/setcap cap_dac_override,cap_sys_ptrace+ep /usr/bin/systemd-detect-virt
|
||||||
|
fi
|
|
@ -0,0 +1,117 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
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 $CIDR"
|
||||||
|
echo " gateway $GATEWAYS"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
newnicnames() {
|
||||||
|
|
||||||
|
local name
|
||||||
|
|
||||||
|
[ $do_init_tasks -eq 0 ] && return
|
||||||
|
[ -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
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 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
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$NIC1" ]; then
|
||||||
|
echo "WARNING: \$NIC1 is not defined. Cannot add ethernet to /etc/network/interfaces."
|
||||||
|
fi
|
||||||
|
CIDR=$(ip --br ad sh $NIC1|awk '{print $3}')
|
||||||
|
newnicnames
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
fcopy -iM /etc/resolv.conf
|
||||||
|
fcopy -iM /etc/network/interfaces /etc/networks
|
||||||
|
|
||||||
|
exit $error
|
|
@ -0,0 +1,51 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# (c) Thomas Lange, 2001-2016, lange@debian.org
|
||||||
|
# (c) Michael Goetze, 2010-2011, mgoetze@mgoetze.net
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
# a list of modules which are loaded at boot time
|
||||||
|
for module in $MODULESLIST; do
|
||||||
|
ainsl -a /etc/modules "^$module$"
|
||||||
|
done
|
||||||
|
|
||||||
|
fcopy -Mv /etc/hostname || echo $HOSTNAME > $target/etc/hostname
|
||||||
|
ainsl -a /etc/mailname ${HOSTNAME}
|
||||||
|
if [ ! -e $target/etc/adjtime ]; then
|
||||||
|
printf "0.0 0 0.0\n0\nUTC\n" > $target/etc/adjtime
|
||||||
|
fi
|
||||||
|
if [ "$UTC" = "yes" ]; then
|
||||||
|
fai-sed 's:^LOCAL$:UTC:' /etc/adjtime
|
||||||
|
else
|
||||||
|
fai-sed 's:^UTC$:LOCAL:' /etc/adjtime
|
||||||
|
fi
|
||||||
|
|
||||||
|
# enable linuxlogo
|
||||||
|
if [ -f $target/etc/inittab ]; then
|
||||||
|
fai-sed 's#/sbin/getty 38400#/sbin/getty -f /etc/issue.linuxlogo 38400#' /etc/inittab
|
||||||
|
elif [ -f $target/lib/systemd/system/getty@.service ]; then
|
||||||
|
fai-sed 's#sbin/agetty --noclear#sbin/agetty -f /etc/issue.linuxlogo --noclear#' /lib/systemd/system/getty@.service
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
fai-link /etc/mtab ../proc/self/mounts
|
||||||
|
|
||||||
|
rm -f $target/etc/dpkg/dpkg.cfg.d/unsafe-io
|
||||||
|
|
||||||
|
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
|
||||||
|
fcopy -iv /etc/rc.local
|
||||||
|
|
||||||
|
exit $error
|
|
@ -0,0 +1,39 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# (c) Thomas Lange, 2001-2017, lange@debian.org
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
ifclass XORG && {
|
||||||
|
fcopy -M /etc/X11/xorg.conf
|
||||||
|
}
|
||||||
|
|
||||||
|
if ifclass UBUNTU; then
|
||||||
|
groups="adm cdrom sudo dip plugdev lpadmin sambashare"
|
||||||
|
$ROOTCMD addgroup --system lpadmin || true
|
||||||
|
$ROOTCMD addgroup --system sambashare || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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
|
|
@ -0,0 +1,37 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# (c) Thomas Lange, 2001-2012, lange@debian.org
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
echo $TIMEZONE > $target/etc/timezone
|
||||||
|
if [ -L $target/etc/localtime ]; then
|
||||||
|
fai-link /etc/localtime /usr/share/zoneinfo/${TIMEZONE}
|
||||||
|
else
|
||||||
|
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
|
||||||
|
fcopy -iM /etc/hosts /etc/motd
|
||||||
|
|
||||||
|
# make /root accessible only by root
|
||||||
|
chmod -c 0700 $target/root
|
||||||
|
chown -c root:root $target/root
|
||||||
|
# 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
|
||||||
|
|
||||||
|
exit $error
|
|
@ -0,0 +1,35 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# (c) Thomas Lange, 2022, lange@debian.org
|
||||||
|
#
|
||||||
|
# Add public ssh key for user root to get login access
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
SSHDIR=$target/root/.ssh
|
||||||
|
AUKEY=$SSHDIR/authorized_keys
|
||||||
|
|
||||||
|
# reverse order of classes
|
||||||
|
for c in $classes; do
|
||||||
|
revclasses="$c $revclasses"
|
||||||
|
done
|
||||||
|
|
||||||
|
for c in $revclasses; do
|
||||||
|
if [ -f $FAI/files/root-ssh-key/$c ]; then
|
||||||
|
if [ -f $AUKEY ]; then
|
||||||
|
cmp -s $FAI/files/root-ssh-key/$c $AUKEY
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ ! -d $SSHDIR ]; then
|
||||||
|
mkdir -m 700 $SSHDIR
|
||||||
|
fi
|
||||||
|
cp -v $FAI/files/root-ssh-key/$c $AUKEY
|
||||||
|
chown root:root $AUKEY
|
||||||
|
chmod 700 $AUKEY
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exit $error
|
|
@ -0,0 +1,25 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# (c) Thomas Lange, 2006,2009, lange@debian.org
|
||||||
|
# create entries for removable media in fstab and directories in /media
|
||||||
|
|
||||||
|
cdromlist() {
|
||||||
|
[ -f /proc/sys/dev/cdrom/info ] || return
|
||||||
|
devs=$(grep 'drive name:' /proc/sys/dev/cdrom/info | cut -d ":" -f 2)
|
||||||
|
for d in $devs; do
|
||||||
|
echo $d
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
fstabline () {
|
||||||
|
line=$(printf "%-15s %-15s %-7s %-15s %-7s %s\n" "$1" "$2" "$3" "$4" "$5" "$6")
|
||||||
|
ainsl /etc/fstab "$line"
|
||||||
|
}
|
||||||
|
|
||||||
|
i=0
|
||||||
|
for cdrom in $(cdromlist | tac); do
|
||||||
|
[ $i -eq 0 ] && ln -sfn cdrom0 $target/media/cdrom
|
||||||
|
mkdir -p $target/media/cdrom$i
|
||||||
|
fstabline /dev/$cdrom /media/cdrom$i udf,iso9660 ro,user,noauto 0 0
|
||||||
|
i=$((i + 1))
|
||||||
|
done
|
|
@ -0,0 +1,49 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
fcopy -BvrS /etc/fai
|
||||||
|
fcopy -BvS /etc/dhcp/dhcpd.conf
|
||||||
|
|
||||||
|
if [ $FAI_ACTION = "install" -o $FAI_ACTION = "dirinstall" ] ; then
|
||||||
|
|
||||||
|
# use the same sources.list for the server itself and the clients
|
||||||
|
cp -a $target/etc/fai/apt $target/etc/
|
||||||
|
|
||||||
|
if ifclass DHCPC; then
|
||||||
|
rm -f $target/etc/resolv.conf
|
||||||
|
else
|
||||||
|
echo 127.0.0.1 > $target/etc/resolv.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
# faiserver uses its own apt cache
|
||||||
|
ainsl -av /etc/apt/apt.conf.d/02proxy 'Acquire::http::Proxy "http://127.0.0.1:3142";'
|
||||||
|
|
||||||
|
# create some host entries
|
||||||
|
_nic=$(ip route | awk '/^default/ {print $5}'|head -1)
|
||||||
|
myip=$(ip -br ad sh $_nic | awk '{print $3}')
|
||||||
|
myip=${myip%/*}
|
||||||
|
ainsl /etc/hosts "$myip faiserver" # that's me
|
||||||
|
ainsl /etc/hosts "192.168.33.100 demohost"
|
||||||
|
ainsl /etc/hosts "192.168.33.101 xfcehost"
|
||||||
|
# add entries for 10 hosts called client 01 .. 10
|
||||||
|
perl -e 'for (1..10) {printf "192.168.33.%s client%02s\n",101+$_,$_;}' >> $target/etc/hosts
|
||||||
|
|
||||||
|
fai-sed '/# ReuseConnections: 1/d' /etc/apt-cacher-ng/acng.conf
|
||||||
|
ainsl -v /etc/apt-cacher-ng/acng.conf "ReuseConnections: 0"
|
||||||
|
|
||||||
|
# copy base file for faster building of nfsroot
|
||||||
|
if [ -f /var/tmp/base.tar.xz ]; then
|
||||||
|
cp -p /var/tmp/base.tar.xz $target/var/tmp
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d /media/mirror/pool ]; then
|
||||||
|
mkdir $target/var/cache/apt-cacher-ng/_import
|
||||||
|
cp -p /media/mirror/pool/*/*/*/*.deb $target/var/cache/apt-cacher-ng/_import
|
||||||
|
$ROOTCMD chown -R apt-cacher-ng:apt-cacher-ng /var/cache/apt-cacher-ng/_import
|
||||||
|
fi
|
||||||
|
|
||||||
|
# copy basefiles from CD to config space
|
||||||
|
if [ -d $FAI/basefiles ]; then
|
||||||
|
mkdir -p $target/srv/fai/config/basefiles
|
||||||
|
cp -vp $FAI/basefiles/*.tar.* $target/srv/fai/config/basefiles 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
|
@ -0,0 +1,68 @@
|
||||||
|
#! /bin/bash
|
||||||
|
# support for GRUB version 2
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
# This script assumes that the disk has a GPT partition table and
|
||||||
|
# that the extended system partition (ESP) is mounted on /boot/efi.
|
||||||
|
# When building a disk image, we don't change the NVRAM to point at
|
||||||
|
# the boot image we made available, because the disk image is likely
|
||||||
|
# not installed on the current system. As a result, we force
|
||||||
|
# installation into the removable media paths as well as the standard
|
||||||
|
# debian path.
|
||||||
|
|
||||||
|
set -a
|
||||||
|
|
||||||
|
# do not set up grub during dirinstall
|
||||||
|
if [ "$FAI_ACTION" = "dirinstall" ] ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
# during softupdate use this file
|
||||||
|
[ -r $LOGDIR/disk_var.sh ] && . $LOGDIR/disk_var.sh
|
||||||
|
|
||||||
|
if [ -z "$BOOT_DEVICE" ]; then
|
||||||
|
exit 189
|
||||||
|
fi
|
||||||
|
|
||||||
|
# disable os-prober because of #802717
|
||||||
|
ainsl /etc/default/grub 'GRUB_DISABLE_OS_PROBER=true'
|
||||||
|
|
||||||
|
# skip the rest, if not an initial installation
|
||||||
|
if [ $FAI_ACTION != "install" ]; then
|
||||||
|
$ROOTCMD update-grub
|
||||||
|
exit $error
|
||||||
|
fi
|
||||||
|
|
||||||
|
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
|
||||||
|
raiddev=${BOOT_DEVICE#/dev/}
|
||||||
|
# install grub on all members of RAID
|
||||||
|
for device in $(LC_ALL=C perl -ne 'if(/^'$raiddev'\s.+raid\d+\s(.+)/){ $_=$1; s/\d+\[\d+\]//g; print }' /proc/mdstat); do
|
||||||
|
echo Install grub on /dev/$device
|
||||||
|
$ROOTCMD grub-install --no-floppy --force-extra-removable "/dev/$device"
|
||||||
|
done
|
||||||
|
|
||||||
|
elif [[ $BOOT_DEVICE =~ '/dev/loop' ]]; then
|
||||||
|
# do not update vmram when using a loop device
|
||||||
|
$ROOTCMD grub-install --no-floppy --force-extra-removable --modules=part_gpt --no-nvram $BOOT_DEVICE
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Grub installed on hostdisk $BOOT_DEVICE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
$ROOTCMD grub-install --no-floppy --modules=part_gpt "$GROOT"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Grub installed on $BOOT_DEVICE = $GROOT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
$ROOTCMD update-grub
|
||||||
|
|
||||||
|
exit $error
|
|
@ -0,0 +1,84 @@
|
||||||
|
#! /bin/bash
|
||||||
|
# support for GRUB version 2
|
||||||
|
|
||||||
|
error=0; trap 'error=$(($?>$error?$?:$error))' ERR # save maximum error code
|
||||||
|
|
||||||
|
set -a
|
||||||
|
|
||||||
|
# do not set up grub during dirinstall
|
||||||
|
if [ "$FAI_ACTION" = "dirinstall" ] ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
# during softupdate use this file
|
||||||
|
[ -r $LOGDIR/disk_var.sh ] && . $LOGDIR/disk_var.sh
|
||||||
|
|
||||||
|
if [ -z "$BOOT_DEVICE" ]; then
|
||||||
|
exit 189
|
||||||
|
fi
|
||||||
|
|
||||||
|
# disable os-prober because of #802717
|
||||||
|
ainsl /etc/default/grub 'GRUB_DISABLE_OS_PROBER=true'
|
||||||
|
|
||||||
|
# skip the rest, if not an initial installation
|
||||||
|
if [ $FAI_ACTION != "install" ]; then
|
||||||
|
$ROOTCMD update-grub
|
||||||
|
exit $error
|
||||||
|
fi
|
||||||
|
|
||||||
|
get_stable_devname() {
|
||||||
|
|
||||||
|
local _DEV="$1"
|
||||||
|
local i
|
||||||
|
declare -a _RES
|
||||||
|
|
||||||
|
# prefer SCSI over ATA over WWN over path
|
||||||
|
# do not use by-path
|
||||||
|
|
||||||
|
for i in $($ROOTCMD udevadm info -r --query=symlink "$_DEV"); do
|
||||||
|
if [[ "$i" =~ /by-id/scsi ]]; then
|
||||||
|
_RES[10]="$i"
|
||||||
|
elif [[ "$i" =~ /by-id/ata ]]; then
|
||||||
|
_RES[20]="$i"
|
||||||
|
elif [[ "$i" =~ /by-id/wwn ]]; then
|
||||||
|
_RES[99]="$i"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "${_RES[@]::1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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
|
||||||
|
raiddev=${BOOT_DEVICE#/dev/}
|
||||||
|
# install grub on all members of RAID
|
||||||
|
for device in $(LC_ALL=C perl -ne 'if(/^'$raiddev'\s.+raid\d+\s(.+)/){ $_=$1; s/\d+\[\d+\]//g; s/(nvme.+?)p/$1/g; print }' /proc/mdstat); do
|
||||||
|
pdevice=$(get_stable_devname /dev/$device)
|
||||||
|
if [ -z "$pdevice" ]; then
|
||||||
|
# if we cannot find a persistent name (for e.g. in a VM) use old name
|
||||||
|
pdevice="/dev/$device"
|
||||||
|
fi
|
||||||
|
mbrdevices+="$pdevice, "
|
||||||
|
echo Installing grub on /dev/$device = $pdevice
|
||||||
|
$ROOTCMD grub-install --no-floppy "/dev/$device"
|
||||||
|
done
|
||||||
|
# remove last ,
|
||||||
|
mbrdevices=${mbrdevices%, }
|
||||||
|
else
|
||||||
|
mbrdevices=$(get_stable_devname $BOOT_DEVICE)
|
||||||
|
if [ -z "$mbrdevices" ]; then
|
||||||
|
# if we cannot find a persistent name (for e.g. in a VM) use old name
|
||||||
|
mbrdevices=$BOOT_DEVICE
|
||||||
|
fi
|
||||||
|
echo "Installing grub on $BOOT_DEVICE = $mbrdevices"
|
||||||
|
$ROOTCMD grub-install --no-floppy "$mbrdevices"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "grub-pc grub-pc/install_devices multiselect $mbrdevices" | $ROOTCMD debconf-set-selections
|
||||||
|
$ROOTCMD dpkg-reconfigure grub-pc
|
||||||
|
exit $error
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
$ROOTCMD rm -f /etc/apt/apt.conf.d/00-proxy
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# allow configure NICs globally over network manager
|
||||||
|
#$ROOTCMD touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
|
||||||
|
# enable resolved
|
||||||
|
$ROOTCMD systemctl enable systemd-resolved
|
||||||
|
|
||||||
|
$ROOTCMD tee /etc/netplan/01-network-manager-all.yaml <<EOF
|
||||||
|
# NetworkManager should configure all network devices
|
||||||
|
network:
|
||||||
|
version: 2
|
||||||
|
renderer: NetworkManager
|
||||||
|
EOF
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#$ROOTCMD apt update -y
|
||||||
|
#$ROOTCMD apt upgrade -y
|
||||||
|
|
||||||
|
if [ "xSUPRESS_GNOME_INITIAL_SCREEN" = "x1" ] ; then
|
||||||
|
$ROOTCMD tee /home/demo/.config/gnome-initial-setup-done <<EOF
|
||||||
|
yes
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$ROOTCMD chown -Rc demo:demo /home/demo
|
||||||
|
|
||||||
|
fi
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue