#!/bin/bash -x set -eE -o pipefail trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR if [[ $EUID != 0 ]]; then echo "$0: error: expected to be root." exit 1 fi if ! type -t fcopy &>/dev/null; then sudo apt-get -y install fai-client fi if [[ -e /a/bin/fai/fai-wrapper ]]; then chroot() { shift "$@" } fi # -r = recursive # -i = ignore non-matching class warnings, always exit 0 # -B = no backup files fcopy -riB /boot # this is also done by FABASE/10-misc by default (without B) fcopy -riB /root fcopy -riB /usr/local/bin src=$FAI/distro-install-common/shadow dst=/q/root/shadow if [[ ! -e $dst && -e $src ]]; then # outside of fai context, we skip this mkdir -p $dst mount -o bind $src $dst fi $FAI/distro-install-common/end ### begin sources install + updates # these get copied in an earlier stage by fai, but leaving it here since # I run this as a single post-fai script to update things that have changed. tmpfile1=$(mktemp) # this can fail if we need an apt update chroot $FAI_ROOT /usr/bin/apt-cache policy >$tmpfile1 ||: fcopy -riBM /etc/apt tmpfile2=$(mktemp) chroot $FAI_ROOT /usr/bin/apt-cache policy >$tmpfile2 if ! diff -q $tmpfile1 $tmpfile2; then chroot $FAI_ROOT /usr/bin/apt update fi # outside of fai, this seems to regularly lead to # E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) # so add a sleep. 1 sec is probably way more than needed. sleep 1 f=$FAI_ROOT/var/cache/apt/pkgcache.bin if [[ ! -r $f ]] || (( $(( $(date +%s) - $(stat -c %Y $f ) )) > 60*60*2 )); then i=0 while fuser $FAI_ROOT/var/lib/dpkg/lock &>/dev/null; do sleep 1 i=$(( i+1 )) if (( i > 300 )); then echo "error: timed out waiting for /var/lib/dpkg/lock" >&2 exit 1 fi $ROOTCMD apt-get update done fi ### end sources install + updates #### misc configurations chroot $FAI_ROOT bash <<'EOFOUTER' if getent group systemd-journal >/dev/null; then # makes the journal be saved to disk. mkdir -p /var/log/journal chmod 755 /var/log/journal fi debconf-set-selections <$target/etc/systemd/system/myncq.service <<'EOF' [Unit] Description=fix ncq errors [Service] Type=oneshot ExecStart=/usr/bin/myncq TimeoutStartSec=20 [Install] # https://www.enricozini.org/blog/2017/debian/systemd-07-devices/ WantedBy=dev-disk-by\x2did-ata\x2dSamsung_SSD_870_QVO_8TB_S5VUNG0N900656V.device EOF chroot $FAI_ROOT bash <<'EOFOUTER' systemctl enable myncq.service /usr/bin/myncq no-upgrub EOFOUTER ;; # per rubens suggestion to make a d16 more stable kd|kw) cmdline+=" pci=realloc=off" ;; esac fi cat >$FAI_ROOT/etc/grub.d/40_custom </dev/null; then update-grub2 else update-grub fi EOF fi ##### end != dirinstall && != NOCRYPT ###### begin network setup #### # use old names. the idea of them changing between boots has never # happened to me and I usually only have 1 wired or other type. # If I ever do need to care about it, I will. # Strangely this didn't work on kw, so I added kernel cmdline parameter. # https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ ln -sf /dev/null $target/etc/systemd/network/99-default.link # bitfolk installer handles the rest case $HOSTNAME in bk|je) exit 0 ;; esac # bug fix, somewhere between t9's xorg 1.19.6 # and 1.20.1-3ubuntu2 # xserver-xorg-video-nouveau 1:1.0.15-3 # xorg stopped load nouveau # https://www.linuxquestions.org/questions/slackware-14/kernel-modules-conflicting-with-nouveau-driver-4175623867/ # https://nouveau.freedesktop.org/InstallNouveau.html if lspci|grep -q 'GeForce GTX 6[0-9][0-9]\]'; then mkdir -p $target/etc/X11/xorg.conf.d/ cat >$target/etc/X11/xorg.conf.d/10-nouveau.conf <<'EOF' Section "Device" Identifier "Device0" Driver "nouveau" EndSection EOF fi # use networkmanager if this host has wireless. if type -p iw &>/dev/null && [[ $(iw dev) ]]; then chroot $FAI_ROOT bash <$target/etc/NetworkManager/conf.d/99-iank.conf <<'EOF' [main] dns=systemd-resolved EOF if [[ $HOSTNAME == frodo ]]; then cat > $target/etc/network/interfaces <<-EOF # generated by FAI auto lo eth0 iface lo inet loopback iface eth0 inet static address 10.3.0.2/16 EOF fi else cat > $target/etc/network/interfaces <<-EOF # generated by FAI auto lo eth0 iface lo inet loopback iface eth0 inet dhcp iface eth0 inet6 auto EOF # previously had an else condition after #elif ifclass VM || ifclass LINODE; then # iface $NIC1 inet manual # iface br0 inet dhcp # bridge_ports $NIC1 # bridge_stp off # bridge_maxwait 0 # however, on t9, on startup, br0, became # rename1 and didn't come up. i dunno why, # but the bridge is for vms that I rarely use, # so not bothering to figure it out. fi if ifclass LINODE; then mkdir -p $target/etc/initramfs-tools/conf.d cat >$target/etc/initramfs-tools/conf.d/mine < $target/etc/network/interfaces <<-EOF # generated by FAI auto lo eth0 iface lo inet loopback iface eth0 inet dhcp # for the standard network config, uncomment this and comment the lines after it. #iface eth0 inet6 auto iface eth0 inet6 static # this is really a /128. it seems like we need to assign it for ipv6 to work. address 2600:3c00::f03c:91ff:fe6d:baf8/64 gateway fe80::1 iface eth0 inet6 static # from a requested /64 pool address 2600:3c00:e000:280::2/64 EOF fi fi # I prefer to stick with ifup/down for now. a. networkd is not in its # own package, so cant use in other init systems. b. it works fine. chroot $FAI_ROOT bash </dev/null; then usermod -aG $g iank fi done if getent group systemd-journal >/dev/null; then usermod -aG systemd-journal iank fi EOFOUTER rm -f $target/etc/resolv.conf ln -s ../run/systemd/resolve/stub-resolv.conf $target/etc/resolv.conf # needed for bitfolk image if [[ -e /a/bin/fai/fai-wrapper ]]; then systemctl enable systemd-resolved systemctl start systemd-resolved fi # reading through the groups that iank is in but user2 isn't, for g in plugdev audio video cdrom; do $ROOTCMD usermod -a -G $g user2 done