X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=fai%2Fconfig%2Fhooks%2Fpartition.DEFAULT;h=7a1967b2268b002bb3f76d8a734df652db99d6f8;hb=5f680f6bea2faae10ca8e5ccea0d08d18ccc9aa1;hp=fdcfe6d1238e2f5f0c98d3f123fe4746b1a1ba1b;hpb=bacafbabe07c9edc86eaa75c24887d6fac0c310a;p=automated-distro-installer diff --git a/fai/config/hooks/partition.DEFAULT b/fai/config/hooks/partition.DEFAULT index fdcfe6d..7a1967b 100755 --- a/fai/config/hooks/partition.DEFAULT +++ b/fai/config/hooks/partition.DEFAULT @@ -18,12 +18,49 @@ 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 +# then to set classes with: fai-setclass OPT1... +# which sets CLASS_OPT1=true... +# +# OPTIONS: +# +# environment variables: +# +# HOSTNAME: if frodo, we exclude 2 devices from the /boot array, which +# the bios does not see. if demohost, we set the luks password to just +# 'x'. +# +# SPECIAL_DISK: For use outside of fai. A base disk name like +# /dev/sdk. If set, we just cryptsetup and partition this one disk then +# exit. This is useful for partitioning a disk in preparation to replace +# a failed or failing disk from a raid10 array. +# +# classes: +# +# REPARTITION: forces repartitioning even if we detect the proper amount +# of partitions already exist. +# +# ROTATIONAL: forces to install onto hdds instead of sdds. normally sdds +# are chosen if they exist. +# +# PARTITION_PROMPT: command line prompt before partitioning +# +# RAID0: forces raid0 filesystem. Normally with 4+ devices, we use +# raid10. + +if [[ $SPECIAL_DISK ]]; then + export CLASS_REPARTITION=true +fi + # # fai's setup-storage won't do btrfs on luks, # # so we do it ourself :) # inspiration taken from files in fai-setup-storage package +# if we are not running in fai, skiptask won't be defined, so carry on. +skiptask partition || ! type skiptask + -skiptask partition || ! type skiptask # for running not in fai #### begin configuration @@ -81,7 +118,7 @@ devbyid() { local f for f in $FAI/distro-install-common/devbyid \ /a/bin/fai/fai/config/distro-install-common/devbyid; do - if [[ -e $f ]]; then $f "$@"; fi + if [[ -e $f ]]; then $f "$@"; break; fi done } @@ -196,9 +233,11 @@ fi if [[ ! $DISTRO ]]; then if ifclass VOL_STRETCH_BOOTSTRAP; then - DISTRO=stretch_bootstrap + DISTRO=debianstretch_bootstrap elif ifclass VOL_STRETCH; then DISTRO=debianstretch + elif ifclass VOL_TESTING; then + DISTRO=debiantesting elif ifclass VOL_XENIAL; then DISTRO=ubuntuxenial elif ifclass VOL_BELENOS; then @@ -230,11 +269,11 @@ if [[ ! -e $luks_dir/host-$HOSTNAME ]]; then exit 1 fi -if ifclass tp; then - lukspw=$(cat $luks_dir/traci) -else - lukspw=$(cat $luks_dir/iank) -fi +lukspw=$(cat $luks_dir/iank) +# # ian: disabled while I use the tp host. +# if ifclass tp; then +# lukspw=$(cat $luks_dir/traci) +# fi if ifclass demohost; then lukspw=x fi @@ -253,27 +292,37 @@ for dev in ${devs[@]}; do done shopt -s nullglob if $partition; then - for dev in ${devs[@]}; do - # if we repartition to the same as an old partition, - # we don't want any old fses hanging around. - for (( i=1; i <= lastn; i++ )); do - x=$(add-part $dev $i) - [[ -e $x ]] || continue - count_down=10 - # wipefs has failed, manual run works, google suggests timing issue - while ! wipefs -a $x; do - sleep 2 - count_down=$((count_down - 1)) - (( count_down > 0 )) || exit 1 + + ### begin wipefs + if [[ ! $SPECIAL_DISK ]]; then + for dev in ${devs[@]}; do + # if we repartition to the same as an old partition, + # we don't want any old fses hanging around. + for (( i=1; i <= lastn; i++ )); do + x=$(add-part $dev $i) + [[ -e $x ]] || continue + count_down=10 + # wipefs has failed, manual run works, google suggests timing issue + while ! wipefs -a $x; do + sleep 2 + count_down=$((count_down - 1)) + (( count_down > 0 )) || exit 1 + done done done - done + fi + ### end wipefs + for dev in ${devs[@]}; do + if [[ $SPECIAL_DISK ]]; then + dev=$(devbyid $SPECIAL_DISK) + fi + # parted will round up the disk size. Do -1 so we can have # fully 1MiB unit partitions for easy resizing of the last partition. # Otherwise we would pass in -0 for the end argument for the last partition. # - # parted print error output is expected. example: + # Note: parted print error output is expected. example: # Error: /dev/vda: unrecognised disk label disk_mib=$(( $(parted -m $dev unit MiB print | \ sed -nr "s#^/dev/[^:]+:([0-9]+).*#\1#p") - 1)) @@ -348,6 +397,10 @@ if $partition; then cryptsetup luksOpen `rootdev` `root-cryptname` \ --key-file $luks_dir/host-$HOSTNAME + + if [[ $SPECIAL_DISK ]]; then + exit 0 + fi done ls -la /dev/btrfs-control # this was probably for debugging... sleep 1 @@ -363,7 +416,7 @@ else fi -if [[ $DISTRO != stretch_bootstrap ]]; then +if [[ $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. @@ -401,7 +454,7 @@ btrfs subvolume set-default 0 /mnt # already default, just ensuring it. mkdir -p /mnt/grub2 cp $FAI/distro-install-common/libreboot_grub.cfg /mnt/grub2 -if [[ $DISTRO == stretch_bootstrap ]]; then +if [[ $DISTRO == debianstretch_bootstrap ]]; then # this is just convenience for the libreboot_grub config # so we can glob the other ones easier. boot_vol=$DISTRO @@ -420,7 +473,7 @@ grub-editenv /mnt/grubenv set did_fai_check=true grub-editenv /mnt/grubenv set last_boot=/$boot_vol umount /mnt -if [[ $DISTRO == stretch_bootstrap ]]; then +if [[ $DISTRO == debianstretch_bootstrap ]]; then cat > /tmp/fai/fstab <