# s
# source /b/fai/fai-wrapper
# - set any appropriate classes with: fai-setclass OPT1... which sets CLASS_OPT1=true...
-# or run eval-fai-classfile FILE
-# export luks_dir=/q/root/luks
+# or run eval-fai-classfile FILE.
+# - Set a VOL_DISTROVER, eg:
+# fai-setclass VOL_NABIA
+# - export luks_dir=/q/root/luks
#
# OPTIONS:
#
if ! type -p devbyid; then
for d in $FAI/distro-install-common \
- /a/bin/fai/fai/config/distro-install-common $FAI $PWD; do
+ /a/bin/fai/fai/config/distro-install-common $FAI $PWD; do
[[ -d $d ]] || continue
if [[ -e $d/devbyid ]]; then
devbyid=$d/devbyid
rootn=1
swapn=2
bootn=3
+efin=4
# ext partition so grub can write persistent variables,
# so it can do a one time boot. grub can't write to
# btrfs or any cow fs because it's more
# more complicated to do and they don't want to.
-grub_extn=4
+grub_extn=5
# bios boot partition,
# https://wiki.archlinux.org/index.php/GRUB
-bios_grubn=5
+bios_grubn=6
lastn=$bios_grubn
d=$1
part=$2
fi
- if [[ $d == /dev/disk/by-id/* ]]; then
- ret=$d-part$part
- else
- ret=$d$part
- fi
- echo $ret
+ echo $d-part$part
}
bootdev() { add-part $@ $bootn; }
rootdev() { add-part $@ $rootn; }
swapdev() { add-part $@ $swapn; }
+efidev() { add-part $@ $efin; }
grub_extdev() { add-part $@ $grub_extn; }
bios_grubdev() { add-part $@ $bios_grubn; }
root-cryptname() { crypt-name $(rootdev $@); }
swap-cryptname() { crypt-name $(swapdev $@); }
+dev-mib() {
+ echo $(( $(parted -m $dev unit MiB print | \
+ sed -nr "s#^/dev/[^:]+:([0-9]+).*#\1#p") - 1))
+}
+
##### end function defs
if ifclass REPARTITION; then
hdds=()
ssds=()
-cd /sys/block
-for disk in [sv]d[a-z]; do
+# this excludes usb. note: i may encounter some other type in the future.
+for disk in $(lsblk -do name,tran -n | awk '$2 ~ "^(sata|nvme)$" { print $1 }'); do
if [[ ${disk_excludes[$disk]} ]]; then
continue
fi
- case $(cat $disk/queue/rotational) in
+ case $(cat /sys/block/$disk/queue/rotational) in
0) ssds+=(/dev/$disk) ;;
1) hdds+=(/dev/$disk) ;;
*) echo "$0: error: unknown /sys/block/$disk/queue/rotational: \
for dev in ${short_devs[@]}; do
if $partition; then break; fi
y=$(readlink -f $dev)
- arr=($y[0-9])
- [[ ${#arr[@]} == "$lastn" ]] || partition=true
- for (( i=1; i <= lastn; i++ )); do
- [[ -e ${dev}$i ]] || partition=true
- done
+ arr=($y?*)
+ if (( ${#arr[@]} != lastn )); then
+ partition=true
+ fi
# On one system, blkid is missing some partitions.
# maybe we need a flag, like FUZZY_BLKID or something, so we
# can check that at least some exist.
fi
boot_space=0
-first=false
+first=true
boot_devs=()
for dev in ${devs[@]}; do
if ifclass frodo; then
sed -nr "s#^/dev/[^:]+:([0-9]+).*#\1#p") - 1))
boot_devs+=($(bootdev))
fi
- if [[ $boot_devs && $first ]]; then
+ if $first && [[ $boot_devs ]]; then
+ first_efi=$(efidev)
first_grub_extdev=$(grub_extdev)
first=false
fi
done
+first_boot_dev=${boot_devs[0]}
+even_raid=false
if ifclass RAID0 || (( ${#boot_devs[@]} == 1 )); then
raid_level=0
elif ifclass RAID1 || (( ${#boot_devs[@]} <= 3 )); then
+ if (( ${#boot_devs[@]} == 2 )); then
+ even_raid=true
+ fi
raid_level=1
else
raid_level=10
exit 1
fi
fi
-first_boot_dev=${boot_devs[0]}
bpart() { # btrfs a partition
# 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)
+ x=$(add-part $i)
[[ -e $x ]] || continue
count_down=10
# wipefs has failed, manual run works, google suggests timing issue
fi
### end wipefs
+
+ if $even_raid; then
+ for dev in ${devs[@]}; do
+ cur_mib=$(dev-mib)
+ if [[ ! $disk_mib ]] || (( cur_mib < disk_mib )); then
+ disk_mib=$cur_mib
+ fi
+ done
+ fi
+
for dev in ${devs[@]}; do
if [[ $SPECIAL_DISK ]]; then
dev=$(devbyid $SPECIAL_DISK)
#
# 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))
+ if ! $even_raid; then
+ disk_mib=$(dev-mib)
+ fi
root_end=$(( disk_mib - swap_mib - boot_mib / ${#boot_devs[@]} ))
swap_end=$(( root_end + swap_mib))
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 ext3 524MiB ${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
$pcmd name $swapn swap
$pcmd mkpart primary "" ${swap_end}MiB ${disk_mib}MiB
$pcmd name $bootn boot
+ # eufi = bloated, half a gig gimme a break.
+ $pcmd mkpart primary "fat32" 12MiB 524MiB
+ $pcmd name $efin efi
+ $pcmd set $efin esp on
+ # note, this is shown here: https://support.system76.com/articles/bootloader/
+ # but not mentioned https://wiki.archlinux.org/index.php/EFI_system_partition
+ # probably not needed
+ $pcmd set $bootn boot on
# 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.
sleep 1
secs=$((secs +1))
done
+
+ mkfs.fat -F32 $(efidev)
+
# Holds just a single file, rarely written, so
# use ext2, like was often used for the /boot partition.
# This exists because grub can only persist data to a non-cow fs.
if [[ $DISTRO == debianbuster_bootstrap ]]; then
cat > /tmp/fai/fstab <<EOF
$first_boot_dev / btrfs noatime,subvol=$boot_vol 0 0
+$first_efi /boot/efi vfat nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s 0 0
EOF
cat >/tmp/fai/disk_var.sh <<EOF
BOOT_DEVICE="${short_devs[@]}"
else
# note, fai creates the mountpoints listed here
cat > /tmp/fai/fstab <<EOF
-$first_root_crypt / btrfs noatime,subvol=root_$DISTRO$mopts 0 0
-$first_root_crypt /mnt/root btrfs nofail,noatime,subvolid=0$mopts 0 0
-$first_boot_dev /boot btrfs nofail,noatime,subvol=$boot_vol 0 0
-$first_boot_dev /mnt/boot btrfs nofail,noatime,subvolid=0 0 0
+$first_root_crypt / btrfs x-systemd.device-timeout=90s,x-systemd.mount-timeout=90s,noatime,subvol=root_$DISTRO$mopts 0 0
+$first_root_crypt /mnt/root btrfs nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s,noatime,subvolid=0$mopts 0 0
+$first_boot_dev /boot btrfs nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s,noatime,subvol=$boot_vol 0 0
+$first_efi /boot/efi vfat nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s 0 0
+$first_boot_dev /mnt/boot btrfs nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s,noatime,subvolid=0 0 0
EOF
swaps=()
rm -f /tmp/fai/crypttab
$(swap-cryptname) $(swapdev) /dev/urandom swap,cipher=aes-xts-plain64,size=256,hash=ripemd160
EOF
cat >> /tmp/fai/fstab <<EOF
-$(swap-cryptdev) none swap nofail,sw 0 0
+$(swap-cryptdev) none swap nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s,sw 0 0
EOF
done
SWAPLIST=\${SWAPLIST:-"${swaps[@]}"}
EOF
fi
+
+# initial setup of extra data fs, mounted,
+# btrfs subvol create nocow
+# chattr +C nocow
+# chown iank.iank nocow
+
+if [[ $HOSTNAME == kd ]]; then
+ cat >>/tmp/fai/crypttab <<EOF
+crypt_dev_ata-Samsung_SSD_870_QVO_8TB_S5VUNG0N900656V-part6 /dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5VUNG0N900656V-part6 none keyscript=decrypt_keyctl,discard,luks,initramfs
+crypt_dev_ata-TOSHIBA_MD04ACA500_84R2K773FS9A-part1 /dev/disk/by-id/ata-TOSHIBA_MD04ACA500_84R2K773FS9A-part1 keyscript=decrypt_keyctl,discard,luks,initramfs
+EOF
+ cat >> /tmp/fai/fstab <<EOF
+/dev/mapper/crypt_dev_ata-Samsung_SSD_870_QVO_8TB_S5VUNG0N900656V-part6 /d btrfs nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s,noatime,compress=zstd,subvol=nocow 0 0
+# r6 = root partition6
+/dev/mapper/crypt_dev_ata-Samsung_SSD_870_QVO_8TB_S5VUNG0N900656V-part6 /mnt/r6 btrfs nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s,noatime,compress=zstd,subvolid=0 0 0
+/dev/mapper/crypt_dev_ata-TOSHIBA_MD04ACA500_84R2K773FS9A-part1 /mnt/rust btrfs nofail,x-systemd.device-timeout=30s,x-systemd.mount-timeout=30s,noatime,compress=zstd,subvolid=0 0 0
+EOF
+fi