X-Git-Url: https://iankelling.org/git/?p=automated-distro-installer;a=blobdiff_plain;f=fai%2Fconfig%2Fhooks%2Fpartition.DEFAULT;h=7c88c7492a8b808ceeb52eaf0c3eb25b87260c47;hp=c2628e26def254be12ff62759eabe8e98af69d7e;hb=53db7c23cb11661c98a08d69295bb315c392003b;hpb=d4f7a9349a08f60957ca544f3d68a9b97015f6b9 diff --git a/fai/config/hooks/partition.DEFAULT b/fai/config/hooks/partition.DEFAULT index c2628e2..7c88c74 100755 --- a/fai/config/hooks/partition.DEFAULT +++ b/fai/config/hooks/partition.DEFAULT @@ -15,11 +15,20 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +PS4='+ $LINENO ' 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 +if [[ $EUID != 0 ]]; then + echo "$0: error: need to run as root" >&2 + exit 1 +fi + +# 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 +50,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. # @@ -131,24 +142,34 @@ 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 -while read -r l; do - eval "$l" - if [[ ! $PKNAME ]]; then - PKNAME="$KNAME" - fi - if [[ $MOUNTPOINT ]]; then - disk_excludes[$PKNAME]=true - fi -done < <(lsblk -nP -o KNAME,MOUNTPOINT,PKNAME) +if ((`nproc` > 2)); then + mopts=,compress=zstd +fi +declare -A disk_excludes +if ! ifclass USE_MOUNTED; then + ## ignore disks that are mounted, eg when running from fai-cd + while read -r l; do + eval "$l" + if [[ ! $PKNAME ]]; then + PKNAME="$KNAME" + fi + if [[ $MOUNTPOINT ]]; then + disk_excludes[$PKNAME]=true + fi + done < <(lsblk -nP -o KNAME,MOUNTPOINT,PKNAME) +fi hdds=() ssds=() @@ -294,6 +315,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 @@ -317,36 +342,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]}) @@ -484,7 +506,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 @@ -492,7 +516,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. @@ -507,7 +531,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}') . @@ -537,8 +560,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 && [[ -e /mnt/$boot_vol ]]; then + btrfs subvolume delete /mnt/$boot_vol +fi +if [[ ! -e /mnt/$boot_vol ]]; then + btrfs subvolume create $boot_vol +fi cd / umount /mnt ## end create subvols ## @@ -560,15 +587,17 @@ EOF else # note, fai creates the mountpoints listed here cat > /tmp/fai/fstab <>/tmp/fai/crypttab <> /tmp/fai/fstab <