X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=fai%2Fconfig%2Fhooks%2Fpartition.DEFAULT;h=7a1967b2268b002bb3f76d8a734df652db99d6f8;hb=5f680f6bea2faae10ca8e5ccea0d08d18ccc9aa1;hp=94f6c25216926038270df6b910a0ee21bd4a685c;hpb=e6c8a36522847eca91819ab3eb656dd824bc3e3c;p=automated-distro-installer diff --git a/fai/config/hooks/partition.DEFAULT b/fai/config/hooks/partition.DEFAULT index 94f6c25..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 } @@ -195,12 +232,12 @@ fi if [[ ! $DISTRO ]]; then - if ifclass VOL_STABLE_BOOTSTRAP; then - DISTRO=debianstable_bootstrap + if ifclass VOL_STRETCH_BOOTSTRAP; then + DISTRO=debianstretch_bootstrap elif ifclass VOL_STRETCH; then + DISTRO=debianstretch + elif ifclass VOL_TESTING; then DISTRO=debiantesting - elif ifclass VOL_STABLE; then - DISTRO=debianstable elif ifclass VOL_XENIAL; then DISTRO=ubuntuxenial elif ifclass VOL_BELENOS; then @@ -232,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 @@ -255,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)) @@ -285,19 +332,28 @@ if $partition; then parted -s $dev mklabel gpt # MiB because parted complains about alignment otherwise. pcmd="parted -a optimal -s -- $dev" - $pcmd mkpart primary "ext3" 12MiB ${root_end}MiB - $pcmd mkpart primary "linux-swap" ${root_end}MiB ${swap_end}MiB + $pcmd mkpart primary ext3 12MiB ${root_end}MiB + # without naming, systemd gives us misc errors like: + # dev-disk-by\x2dpartlabel-primary.device: Dev dev-disk-by\x2dpartlabel-primary.device appeared twice + $pcmd name $rootn root + # normally a swap is type "linux-swap", but this is encrypted swap. using that + # label will confuse systemd. + $pcmd mkpart primary "" ${root_end}MiB ${swap_end}MiB + $pcmd name $swapn swap $pcmd mkpart primary "" ${swap_end}MiB ${disk_mib}MiB + $pcmd name $bootn boot # i only need a few k, but googling min size, # I found someone saying that gparted required # required at least 8 because of their hard drive cylinder size. # And 8 is still very tiny. $pcmd mkpart primary "ext2" 4MiB 12MiB + $pcmd name $grub_extn grubext # gpt ubuntu cloud image uses ~4 mb for this partition. fai uses 1 MiB. # so, I use 3, whatever. # note: parted manual saying cheap flash media # should to start at 4. $pcmd mkpart primary "" 1MiB 4MiB + $pcmd name $bios_grubn biosgrub $pcmd set $bios_grubn bios_grub on $pcmd set $bootn boot on # generally not needed on modern systems # the mkfs failed before on a vm, which prompted me to add @@ -341,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 @@ -356,7 +416,7 @@ else fi -if [[ $DISTRO != debianstable_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. @@ -394,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 == debianstable_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 @@ -413,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 == debianstable_bootstrap ]]; then +if [[ $DISTRO == debianstretch_bootstrap ]]; then cat > /tmp/fai/fstab <