working raid + luks + btrfs disk setup
authorIan Kelling <ian@iankelling.org>
Sun, 17 Jan 2016 07:56:48 +0000 (23:56 -0800)
committerIan Kelling <ian@iankelling.org>
Mon, 6 Feb 2017 06:21:40 +0000 (22:21 -0800)
fai/config/disk_config/demohost [deleted file]
fai/config/hooks/extrbase.demohost [new file with mode: 0755]
fai/config/hooks/instsoft.demohost [new file with mode: 0755]
fai/config/hooks/partition.demohost [new file with mode: 0755]

diff --git a/fai/config/disk_config/demohost b/fai/config/disk_config/demohost
deleted file mode 100644 (file)
index 38e0f6f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-disk_config vda
-primary   -          20GiB   -      -
-primary   -           4GiB   -      -
-
-disk_config vdb
-primary   -          20GiB   -      -
-primary   -           4GiB   -      -
-
-disk_config raid
-raid1     /      vda1,vdb1   ext3   rw
-raid1     swap   vda2,vdb2   swap   sw
diff --git a/fai/config/hooks/extrbase.demohost b/fai/config/hooks/extrbase.demohost
new file mode 100755 (executable)
index 0000000..3f5e25c
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+chattr -Rf +C /target
diff --git a/fai/config/hooks/instsoft.demohost b/fai/config/hooks/instsoft.demohost
new file mode 100755 (executable)
index 0000000..f0f1bc2
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+f=$target/root/keyscript
+cat > $f <<EOFOUTER
+#!/bin/sh
+cat <<'EOF'
+$(cat /tmp/fai/crypt_dev_*)
+EOF
+EOFOUTER
+
+chmod +x $f
diff --git a/fai/config/hooks/partition.demohost b/fai/config/hooks/partition.demohost
new file mode 100755 (executable)
index 0000000..7208465
--- /dev/null
@@ -0,0 +1,104 @@
+#!/bin/bash -x
+
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?"' ERR
+
+# # fai's setup-storage won't do btrfs on luks,
+# # so we do it ourself :)
+skiptask partition
+
+repartition=true
+
+letters=(a)
+
+if ifclass VM; then
+    d=/dev/vd
+    letters=(a b)
+else
+    d=/dev/sd
+fi
+
+
+boot_end=504
+
+! ifclass tp || letters=(a b)
+
+devs=()
+
+# 1.5 x based on https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-disk-partitioning-setup-x86.html#sect-custom-partitioning-x86
+swap_end=$(( $(grep ^MemTotal: /proc/meminfo| awk '{print $2}') * 3/(${#letters[@]} * 2 ) / 1000 + boot_end ))MiB
+
+if $repartition; then
+    mkdir -p /tmp/fai
+    for letter in ${letters[@]}; do
+        dev=$d$letter
+        devs+=($dev)
+        [[ -e $dev[0-9] ]] && for x in $dev[0-9]; do wipefs -a $x; done
+        parted -s $dev mklabel gpt
+        # gpt ubuntu cloud image uses ~4. fai uses 1 MiB. ehh, i'll do 4.
+        parted -s $dev mkpart primary "ext3" 4MB ${boot_end}MiB
+        parted -s $dev set 1 boot on
+        parted -s $dev mkpart primary "linux-swap" ${boot_end}MiB $swap_end
+        parted -s -- $dev mkpart primary "" $swap_end -0
+        parted -s $dev set 3 raid on
+        parted -s $dev mkpart primary "" 1MiB 4MiB
+        parted -s $dev set 4 bios_grub on
+        # the mkfs failed randomly on a vm, so I threw a sleep in here.
+        sleep .1
+        mkfs.ext4 -F ${dev}1
+    done
+    if ((${#devs[@]} > 1)); then
+        crypt=md0
+        yes | mdadm --create /dev/$crypt --level=raid0 --force --run \
+              --raid-devices=${#devs[@]} ${devs[@]/%/3} || [[ $? == 141 ]]
+    else
+        crypt=${dev##/dev/}3
+    fi
+    head -c 2048 /dev/urandom | od > /tmp/fai/crypt_dev_$crypt
+    yes YES | cryptsetup luksFormat /dev/$crypt /tmp/fai/crypt_dev_$crypt \
+                         -c aes-cbc-essiv:sha256 -s 256 || [[ $? == 141 ]]
+    yes $(cat /var/lib/fai/config/distro-install-common/luks/traci) | \
+        cryptsetup luksAddKey --key-file \
+                   /tmp/fai/crypt_dev_$crypt /dev/$crypt || [[ $? == 141 ]]
+    # this would remove the keyfile. we will do that manually later.
+    #    yes 'test' | cryptsetup luksRemoveKey /dev/... \
+        #                            /key/file || [[ $? == 141 ]]
+    cryptsetup luksOpen /dev/$crypt crypt_dev_$crypt --key-file \
+               /tmp/fai/crypt_dev_$crypt
+    parted ${devs[0]} set 1 boot on
+    mkfs.btrfs -f /dev/mapper/crypt_dev_$crypt
+    mount /dev/mapper/crypt_dev_$crypt /mnt
+    cd /mnt
+    btrfs subvolume create a
+    btrfs subvolume create root
+    btrfs subvolume set-default $(btrfs subvolume list . | grep 'root$' | awk '{print $2}') .
+    cd /
+    umount /mnt
+else
+    /var/lib/fai/config/distro-install-common/reset-btrfs-root
+fi
+
+cat > /tmp/fai/crypttab <<EOF
+crypt_dev_$crypt  /dev/$crypt  none  keyscript=/root/keyscript,discard,luks
+EOF
+
+for dev in ${devs[@]}; do
+    cat >> /tmp/fai/crypttab <<EOF
+swap ${dev}2  /dev/urandom  swap,cipher=aes-xts-plain64,size=256,hash=ripemd160
+EOF
+done
+
+# this is duplicated in arch-init
+cat > /tmp/fai/fstab <<EOF
+/dev/mapper/crypt_dev_$crypt  /  btrfs  noatime,subvol=/root  0 0
+/dev/mapper/crypt_dev_$crypt  /a  btrfs  noatime,subvol=/a  0 0
+${devs[0]}1  /boot  ext4  noatime  0 2
+EOF
+
+
+cat >/tmp/fai/disk_var.sh <<EOF
+ROOT_PARTITION=\${ROOT_PARTITION:-/dev/mapper/crypt_dev_$crypt}
+BOOT_PARTITION=\${BOOT_PARTITION:-${devs[0]}1}
+BOOT_DEVICE=\${BOOT_DEVICE:-"${devs[0]}"}
+SWAPLIST=\${SWAPLIST:-"${devs[@]/%/2}"}
+EOF