fix bugs, support multiple distros via subvolumes
authorIan Kelling <ian@iankelling.org>
Sun, 21 Feb 2016 00:04:45 +0000 (16:04 -0800)
committerIan Kelling <ian@iankelling.org>
Mon, 6 Feb 2017 06:21:41 +0000 (22:21 -0800)
arch-init
arch-init-remote
arch-pxe
chboot [new file with mode: 0755]
fai/config/class/50-host-classes
fai/config/hooks/partition.DEFAULT
pxe-server

index a7420bedeeb09937041a3724ecfdc56ca3ccf166..aae184f99e3d31a4054cf2c0573767bea651bec6 100755 (executable)
--- a/arch-init
+++ b/arch-init
@@ -65,10 +65,10 @@ export swapn=2
 sed -ri '/^crypt_dev/d' /tmp/fai/crypttab
 mount -o subvol=root_$DISTRO /dev/mapper/crypt_dev_?da$rootn /mnt
 mkdir -p /mnt/{q,home}
-mount -o subvol=/q /dev/mapper/crypt_dev_?da$rootn /mnt/q
-mount -o subvol=/home_$DISTRO /dev/mapper/crypt_dev_?da$rootn /mnt/home
+mount -o subvol=q /dev/mapper/crypt_dev_?da$rootn /mnt/q
+mount -o subvol=home_$DISTRO /dev/mapper/crypt_dev_?da$rootn /mnt/home
 mkdir -p /mnt/boot
-mount /dev/?da$bootn /mnt/boot
+mount -o subvol=boot_$DISTRO /dev/?da$bootn /mnt/boot
 
 # https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Keyfiles
 cp /root/luks/host-$hostname /mnt/crypto_keyfile.bin
@@ -125,8 +125,6 @@ UUID=dd67766f-93c5-4ce3-9877-a1d9841dd4a4  none  swap  sw  0  0
 EOF
         ;;
     *)
-        echo "$0: 2nd fstab:"
-        cat /mnt/etc/fstab
         cp -r .ssh /mnt/root
         cp -r /root/distro-install-common /mnt/root
         ;;&
@@ -144,7 +142,7 @@ rm -f /mnt/etc/resolv.conf
 ln -s /run/systemd/resolve/resolv.conf /mnt/etc/resolv.conf
 
 # not necsesary, but makes reboot go fast.
-umount -R /mnt
+umount -R /mnt; sleep 1
 
 # causes 255 exit code, so doing this from the caller script.
 # reboot now
index 82fdedbd04342f961d4bf87f9064ec88ec7e7532..c7f6110ac3323aabef7404a8c5f486a3447577df 100755 (executable)
@@ -26,8 +26,7 @@ sudo scp -r /a/bin/fai/arch-init{,-chroot} \
 # and extract it from the shadow file.
 ssh root@$host bash -x ./arch-init "'$(cat /p/shadow/standard)'" $host $url
 ssh root@$host reboot now || [[ $? == 255 ]]
-# we need to wait for reboot and input encryption password,
-# so no doing this now.
+# next up is:
 # ssh $host /a/bin/distro-begin
 
 killall darkhttpd
index 5a5b5464360e214b2e1543639cb149661385da71..03ec659949e17470d26951236cc3796dc15f10c4 100755 (executable)
--- a/arch-pxe
+++ b/arch-pxe
@@ -1,6 +1,7 @@
 #!/bin/bash -lx
 
-# manually download image to /a/opt, and set it's name below.
+# Setup arch pxe boot server from the base image.
+# Requires manually downloading image to /a/opt, and set it's name below.
 
 set -eE -o pipefail
 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?"' ERR
diff --git a/chboot b/chboot
new file mode 100755 (executable)
index 0000000..37d2516
--- /dev/null
+++ b/chboot
@@ -0,0 +1,48 @@
+#!/bin/bash -x
+
+# Set grub to boot into a different distro, and reboot unless -r
+# $0 DISTRO_NAME
+
+# DISTRO_NAME is based on the partition names in /boot. eg boot_debianjessie
+
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?"' ERR
+
+[[ $EUID == 0 ]] || exec sudo "$BASH_SOURCE" "$@"
+
+reboot=true
+while [[ $1 == -* ]]; do
+    case $1 in
+        -r) reboot=false; shift ;;
+        --) break ;;
+    esac
+done
+
+
+distro=$1
+
+###### end command line parsing #####
+
+if ! btrfs subvolume list /boot | grep "_$distro$" &>/dev/null; then
+    echo "$0: error: _$distro$ not found in btrfs subvolume list /boot:"
+    btrfs subvolume list /boot
+    exit 1
+fi
+
+e() { echo "$@"; "$@"; }
+
+boot_dev=$(mount | sed -rn "s#^(\S+) on /boot .*#\1#p")
+
+mount_point=$(mktemp -d)
+
+e mount -o subvol=boot_$distro $boot_dev $mount_point
+
+boot_disk=${boot_dev%%[0-9]*}
+
+# arch doesn't have $mount_point/grub/device.map, accoring to the grub manual,
+# it just generates one if the file doesn't exist.
+# https://www.gnu.org/software/grub/manual/html_node/Device-map.html
+e grub-bios-setup -d $mount_point/grub/i386-pc -s -m $mount_point/grub/device.map $boot_disk
+
+e umount $mount_point
+e rmdir $mount_point
index 61ed2576110c35272700044664ce918faa2f9f2e..6540dfcd78e88d37d31c148ea33ccff852dc3cfe 100755 (executable)
@@ -10,7 +10,7 @@ case $HOSTNAME in
     demohost)
         echo "FAIBASE DEBIAN DESKTOP TWO_DISK STABLE" ;;
     x2)
-        echo "FAIBASE DEBIAN DESKTOP ONE_DISK" ;;
+        echo "FAIBASE DEBIAN DESKTOP ONE_DISK STABLE" ;;
     tp)
         echo "FAIBASE DEBIAN DESKTOP TWO_DISK" ;;
     # faiserver)
index 0dbc3769d3388219e49143253f79c19a9bc97c7b..81475f2055d48533b8cff7799caadd28f0c61ea8 100755 (executable)
@@ -10,11 +10,12 @@ skiptask partition || ! type skiptask # for running not in fai
 
 #### begin configuration
 
+partition=false # change to true to force a full wipe
 bootn=3
 rootn=1
 swapn=2
 bios_grubn=4
-boot_mib=750
+boot_mib=1500
 lastn=$bios_grubn
 
 if ifclass VM; then
@@ -57,7 +58,6 @@ devs=(${letters[@]/#//dev/${d}})
 crypt_devs=(${letters[@]/#//dev/mapper/crypt_dev_${d}})
 first_boot_dev=${devs[0]}$bootn
 
-partition=true # hardcoded for now
 
 # somewhat crude detection of whether to partition
 for dev in ${devs[@]}; do
@@ -72,8 +72,6 @@ for dev in ${devs[@]}; do
     done
 done
 
-#partition=true # for temporarily override
-
 # keyfiles generated like:
 # head -c 2048 /dev/urandom | od | s dd of=/q/root/luks/host-demohost
 luks_dir=${LUKS_DIR:-/var/lib/fai/config/distro-install-common/luks}
@@ -98,7 +96,7 @@ swap_mib=$(( $(grep ^MemTotal: /proc/meminfo | \
 # Otherwise we would pass in -0 for the end argument for the last partition.
 disk_mib=$(( $(parted -m ${devs[0]} unit MiB print | \
                       sed -nr "s#^${devs[0]}:([0-9]+).*#\1#p") - 1))
-root_end=$(( disk_mib - swap_mib - boot_mib ))
+root_end=$(( disk_mib - swap_mib - boot_mib /  ${#devs[@]} ))
 swap_end=$(( root_end + swap_mib))
 
 mkdir -p /tmp/fai
@@ -174,22 +172,23 @@ cd /mnt
 for x in q home_$DISTRO root_$DISTRO; do
     btrfs subvolume list . | grep "$x$" >/dev/null || btrfs subvolume create $x
 done
+mkdir -p /mnt/root_$DISTRO/boot
 for x in root/a q/a; do
     mkdir -p $x
     chown 1000:1000 $x
     chmod 755 $x
 done
-btrfs subvolume set-default \
-      $(btrfs subvolume list . | grep "root_$DISTRO$" | awk '{print $2}') .
-chattr -Rf +C root
+# could set default like this, but no reason to.
+# btrfs subvolume set-default \
+#       $(btrfs subvolume list . | grep "root_$DISTRO$" | awk '{print $2}') .
+chattr -Rf +C root_$DISTRO
 cd /
 umount /mnt
-mount $first_boot_dev /mnt
+mount -o subvolid=0 $first_boot_dev /mnt
 cd /mnt
+btrfs subvolume set-default 0 /mnt
 [[ ! -e /mnt/boot_$DISTRO ]] || btrfs subvolume delete /mnt/boot_$DISTRO
 btrfs subvolume create boot_$DISTRO
-btrfs subvolume set-default \
-      $(btrfs subvolume list . | grep "boot_$DISTRO$" | awk '{print $2}') .
 cd /
 umount /mnt
 ## end create subvols ##
index 2e8b2a40c267dcb6cdd8e79390b625e423a03583..4d18ccb742dcad33e9d9691372a0e711e4ac4ef8 100755 (executable)
@@ -1,5 +1,8 @@
 #!/bin/bash -x
 
+# Setup dhcp server to point to tftp server,
+# and depending on the type, setup the tftp server.
+
 # usage: $0 [TYPE]
 # default distro is the base debian/fedora type. others are fai &  arch