From 43480add5b3ab6f4e407065454bd6be1d1fe1870 Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Thu, 3 Nov 2016 23:34:27 -0700 Subject: [PATCH] fix chboot, add partition options --- chboot | 8 +++++- fai-wrapper | 24 +++++++++++------ fai/config/class/50-host-classes | 7 ++++- fai/config/hooks/partition.DEFAULT | 42 +++++++++++++++--------------- 4 files changed, 50 insertions(+), 31 deletions(-) diff --git a/chboot b/chboot index eb8b118..12befb8 100755 --- a/chboot +++ b/chboot @@ -39,6 +39,9 @@ EOF exit $1 } + +grub_extn=4 + ###### begin command line parsing ##### reboot=true temp=$(getopt -l opt o "$@") || usage 1 @@ -91,8 +94,11 @@ boot_disk=${boot_dev%%[0-9]*} e grub-bios-setup -d $mount_point/grub/i386-pc -s -m $mount_point/grub/device.map $boot_disk # todo, mount_point needs subvolid=0 -e grub-editenv $mount_point/grub2/grubenv set default_subvol=/boot_$distro +e umount $mount_point + +e mount $boot_disk$grub_extn $mount_point +e grub-editenv $mount_point/grubenv set default_subvol=/boot_$distro e umount $mount_point e rmdir $mount_point diff --git a/fai-wrapper b/fai-wrapper index d07ea8f..45804a5 100644 --- a/fai-wrapper +++ b/fai-wrapper @@ -15,19 +15,27 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# for using some fai commands outside of fai +# For using some fai commands outside of fai. +# to set fai classes, export CLASS_CLASSNAME=true ifclass() { local var=${1/#/CLASS_} [[ $HOSTNAME == $1 || ${!var} ]] } +fai-setclass() { + for class in "$@"; do + # export class vars with CLASS_ in front to avoid name collisions. + classes+=" $class" + export CLASS_$class=true + done + classes="${classes# }" + export classes +} +eval-fai-classfile() { + file=$1 + fai-setclass $(bash -l $file) +} export -f ifclass classes= # used by fcopy -for x in $(bash /a/bin/fai/fai/config/class/50-host-classes); do - # export class vars with CLASS_ in front to avoid name collisions. - classes+=" $x" - export CLASS_$x=true -done -classes="${classes# }" -export classes +eval-fai-classfile /a/bin/fai/fai/config/class/50-host-classes export FAI_ROOT=/ export FAI=/a/bin/fai/fai/config diff --git a/fai/config/class/50-host-classes b/fai/config/class/50-host-classes index 4f776f5..f8e46de 100755 --- a/fai/config/class/50-host-classes +++ b/fai/config/class/50-host-classes @@ -24,7 +24,7 @@ # We check the reverse condition in 51-multi-boot, # and set what os we are installing, but don't check it # into git since it changes regularly. Each host needs -# to have a class of either DEBIAN + (STABLE or STRETCH64), +# to have a class of either DEBIAN + (STABLE or STRETCH64 or STABLE_BOOTSTRAP), # or UBUNTU + XENIAL64. # # Other notable classes: @@ -38,6 +38,11 @@ # fresh install. I use this in case our repartition check has # a bug in it, or I accidentally set REPARTITION. # +# ROTATIONAL: in a system with ssd and hdd, install to the hdd +# instead of the default ssd. +# +# RAID0: Use raid 0 even if there are >= 4 disks with boot partititions. +# # It's shell looks like this: # if [[ ! -e /a/bin/fai/fai-wrapper ]]; then # case $HOSTNAME in diff --git a/fai/config/hooks/partition.DEFAULT b/fai/config/hooks/partition.DEFAULT index 9905602..46887e9 100755 --- a/fai/config/hooks/partition.DEFAULT +++ b/fai/config/hooks/partition.DEFAULT @@ -37,7 +37,7 @@ grub_extn=4 # https://wiki.archlinux.org/index.php/GRUB bios_grubn=5 lastn=$bios_grubn -boot_mib=4000 +boot_mib=10000 ##### end configuration @@ -99,7 +99,7 @@ $(cat $disk/queue/rotational)"; exit 1 ;; done # install all ssds, or if there are none, all hdds -if (( ${#ssds[@]} > 0 )); then +if ! ifclass ROTATIONAL && (( ${#ssds[@]} > 0 )); then short_devs=( ${ssds[@]} ) else short_devs=( ${hdds[@]} ) @@ -173,6 +173,17 @@ for dev in ${devs[@]}; do fi done +if ifclass RAID0 || (( ${#boot_devs[@]} < 4 )); then + raid_level=0 +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 + + + if [[ ! $DISTRO ]]; then if ifclass STABLE_BOOTSTRAP; then DISTRO=debianstable_bootstrap @@ -192,17 +203,10 @@ fi first_boot_dev=${boot_devs[0]} -case ${#boot_devs[@]} in - # need double the space if we are raid 10, and then - # might as well give some extra overhead. - [4-9]*|[1-3]?*) boot_mib=$((boot_mib * 3)) ;; -esac - - bpart() { # btrfs a partition - case ${#@} in - [1-3]) mkfs.btrfs -f $@ ;; - [4-9]*|[1-3]?*) mkfs.btrfs -f -m raid10 -d raid10 $@ ;; + case $raid_level in + 0) mkfs.btrfs -f $@ ;; + 10) mkfs.btrfs -f -m raid10 -d raid10 $@ ;; esac } @@ -240,7 +244,11 @@ done shopt -s nullglob if $partition; then for dev in ${devs[@]}; do - for x in $dev[0-9]; 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 @@ -417,14 +425,6 @@ $first_root_crypt /q btrfs noatime,subvol=q 0 0 $first_boot_dev /boot btrfs noatime,subvol=$boot_vol 0 0 EOF - # I will avoid using uuid in the future. the other way of specifying is simpler - if ifclass treetowl; then - cat >> /tmp/fai/fstab <<'EOF' -$first_root_crypt /i btrfs noatime,subvol=i 0 0 -UUID=3f7b31cd-f299-40b4-a86b-7604282e2715 /i btrfs noatime 0 2 -EOF - fi - swaps=() for dev in ${devs[@]}; do swaps+=(`swap-cryptname`) -- 2.30.2