X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=fai%2Fconfig%2Fhooks%2Fpartition.DEFAULT;h=0a0c2ad69946535a624c74d0ce3f7443ad69671c;hb=cef9b6ede5c1e028bed1b4dc7895f5dfa121ad6b;hp=ab436bdad797d35b60e0339237b731a164fbd09e;hpb=ed3681256885d295f39d5df60784d3281a2f8719;p=automated-distro-installer diff --git a/fai/config/hooks/partition.DEFAULT b/fai/config/hooks/partition.DEFAULT index ab436bd..0a0c2ad 100755 --- a/fai/config/hooks/partition.DEFAULT +++ b/fai/config/hooks/partition.DEFAULT @@ -18,8 +18,11 @@ set -eE -o pipefail trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR -# for calling outside of FAI, first -# - source /a/bin/fai-wrapper +# for calling outside of FAI: +# # need to redep and set that location so that we get luks keys +# export FAI=/srv/fai/config +# fai-redep +# source /b/fai/fai-wrapper # - set any appropriate classes with: fai-setclass OPT1... which sets CLASS_OPT1=true... # or run eval-fai-classfile FILE # @@ -41,6 +44,8 @@ trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR # REPARTITION: forces repartitioning even if we detect the proper amount # of partitions already exist. # +# NOWIPE: use existing subvolumes if they exist +# # ROTATIONAL: forces to install onto hdds instead of sdds. normally sdds # are chosen if they exist. # @@ -93,10 +98,7 @@ grub_extn=4 # https://wiki.archlinux.org/index.php/GRUB bios_grubn=5 lastn=$bios_grubn -# this is larger than needed for several /boot subvols, -# becuase I keep a minimal debian install on it, for -# recovery needs, and for doing pxe-kexec. -boot_mib=10000 + ##### end configuration @@ -134,11 +136,16 @@ swap-cryptname() { crypt-name $(swapdev $@); } ##### end function defs -if ifclass REPARTITION;then +if ifclass REPARTITION; then partition=true # force a full wipe else partition=false # change to true to force a full wipe fi +if ifclass NOWIPE; then + wipe=false +else + wipe=true +fi ## ignore disks that are mounted, eg when running from fai-cd declare -A disk_excludes @@ -212,7 +219,7 @@ if [[ ! ${devs[0]} ]]; then exit 1 fi - +boot_space=0 first=false boot_devs=() for dev in ${devs[@]}; do @@ -242,6 +249,8 @@ for dev in ${devs[@]}; do done $bad_disk || boot_devs+=($(bootdev)) else + boot_space=$(( boot_space + $(parted -m $dev unit MiB print | \ + sed -nr "s#^/dev/[^:]+:([0-9]+).*#\1#p") - 1)) boot_devs+=($(bootdev)) fi if [[ $boot_devs && $first ]]; then @@ -256,11 +265,32 @@ elif ifclass RAID1 || (( ${#boot_devs[@]} <= 3 )); then raid_level=1 else raid_level=10 - # need double the space if we are raid 10, and then - # might as well give some extra. - boot_mib=$((boot_mib * 3)) fi +### Begin calculate boot partition space +# due to raid duplication +case $raid_level in + 1*) boot_space=$(( boot_space / 2 )) ;; +esac +if (( boot_space > 60000 )); then + # this is larger than needed for several /boot subvols, + # becuase I keep a minimal debian install on it for + # recovery needs and for doing pxe-kexec. + boot_mib=10000 +elif (( boot_space > 30000 )); then + boot_mib=$(( 5000 + (boot_space - 30000) / 2 )) +else + # Small vms don't have room for /boot recovery. With 3 kernels + # installed, i'm using 132M on t8, so this seems like plenty of + # room. note: rhel 8 recomments 1g for /boot. + boot_mib=500 + # +fi +case $raid_level in + 1*) boot_mib=$(( boot_mib * 2 )) ;; +esac +### end calculate boot partition space + if [[ ! $DISTRO ]]; then @@ -274,6 +304,10 @@ if [[ ! $DISTRO ]]; then DISTRO=debiantesting elif ifclass VOL_XENIAL; then DISTRO=ubuntuxenial + elif ifclass VOL_BIONIC; then + DISTRO=ubuntubionic + elif ifclass VOL_FOCAL; then + DISTRO=ubuntufocal elif ifclass VOL_BELENOS; then DISTRO=trisquelbelenos elif ifclass VOL_FLIDAS; then @@ -297,36 +331,33 @@ bpart() { # btrfs a partition } -# see README for docs about how to create these -luks_dir=${LUKS_DIR:-/var/lib/fai/config/distro-install-common/luks} - +if [[ ! -e /a/bin/fai/fai-wrapper ]]; then + # see README for docs about how to create these + luks_dir=$FAI/distro-install-common/luks + + luks_file=$luks_dir/host-$HOSTNAME + if [[ ! -e $luks_file ]]; then + hostkeys=($luks_dir/host-*) + # if there is only one key, we might be deploying somewhere + # where dhcp doesnt give us a proper hostname, so use that. + if [[ ${#hostkeys[@]} == 1 && -e ${hostkeys[0]} ]]; then + luks_file=${hostkeys[0]} + else + echo "$0: error: no key for hostname at $luks_file" >&2 + exit 1 + fi + fi -luks_file=$luks_dir/host-$HOSTNAME -if [[ ! -e $luks_file ]]; then - hostkeys=($luks_dir/host-*) - # if there is only one key, we might be deploying somewhere - # where dhcp doesnt give us a proper hostname, so use that. - if [[ ${#hostkeys[@]} == 1 && -e ${hostkeys[0]} ]]; then - luks_file=${hostkeys[0]} + # # note, corresponding changes in /b/ds/keyscript-{on,off} + if ifclass demohost; then + lukspw=x + elif [[ -e $luks_dir/$HOSTNAME ]]; then + lukspw=$(cat $luks_dir/$HOSTNAME) else - echo "$0: error: no key for hostname at $luks_file" >&2 - exit 1 + lukspw=$(cat $luks_dir/iank) fi fi -# # note, corresponding changes in /b/ds/keyscript-{on,off} -if ifclass tpnew; then - lukspw=$(cat $luks_dir/traci) -elif ifclass ziva; then - lukspw=$(cat $luks_dir/ziva) -elif ifclass demohost; then - lukspw=x -elif [[ -e $luks_dir/$HOSTNAME ]]; then - lukspw=$(cat $luks_dir/$HOSTNAME) -else - lukspw=$(cat $luks_dir/iank) -fi - first_root_crypt=$(root-cryptdev ${devs[0]}) @@ -464,7 +495,9 @@ if $partition; then bpart ${boot_devs[@]} else for dev in ${devs[@]}; do - mkfs.ext2 $(grub_extdev) + if [[ -e /dev/mapper/$(root-cryptname) ]]; then + continue + fi cryptsetup luksOpen $(rootdev) $(root-cryptname) \ --key-file $luks_file done @@ -472,7 +505,7 @@ else fi -if [[ $DISTRO != debianstretch_bootstrap ]]; then +if $wipe && [[ $DISTRO != debianstretch_bootstrap ]]; then # bootstrap distro doesn't use separate encrypted root. mount -o subvolid=0 $first_root_crypt /mnt # systemd creates subvolumes we want to delete. @@ -487,7 +520,6 @@ if [[ $DISTRO != debianstretch_bootstrap ]]; then btrfs subvolume create root_$DISTRO - mkdir -p /mnt/root_$DISTRO/boot # could set default subvol like this, but no reason to. # btrfs subvolume set-default \ # $(btrfs subvolume list . | grep "root_$DISTRO$" | awk '{print $2}') . @@ -517,8 +549,12 @@ if [[ $DISTRO == debianstretch_bootstrap ]]; then else boot_vol=boot_$DISTRO fi -[[ ! -e /mnt/$boot_vol ]] || btrfs subvolume delete /mnt/$boot_vol -btrfs subvolume create $boot_vol +if $wipe; then + if [[ -e /mnt/$boot_vol ]]; then + btrfs subvolume delete /mnt/$boot_vol + fi + btrfs subvolume create $boot_vol +fi cd / umount /mnt ## end create subvols ## @@ -540,19 +576,21 @@ EOF else # note, fai creates the mountpoints listed here cat > /tmp/fai/fstab <>/tmp/fai/crypttab <> /tmp/fai/fstab <