From: Ian Kelling Date: Sun, 21 Feb 2016 00:04:45 +0000 (-0800) Subject: fix bugs, support multiple distros via subvolumes X-Git-Url: https://iankelling.org/git/?a=commitdiff_plain;h=e6da963744f05fc92ba515f1544fbbc0773f4d2f;p=automated-distro-installer fix bugs, support multiple distros via subvolumes --- diff --git a/arch-init b/arch-init index a7420be..aae184f 100755 --- 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 diff --git a/arch-init-remote b/arch-init-remote index 82fdedb..c7f6110 100755 --- a/arch-init-remote +++ b/arch-init-remote @@ -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 diff --git a/arch-pxe b/arch-pxe index 5a5b546..03ec659 100755 --- 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 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 diff --git a/fai/config/class/50-host-classes b/fai/config/class/50-host-classes index 61ed257..6540dfc 100755 --- a/fai/config/class/50-host-classes +++ b/fai/config/class/50-host-classes @@ -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) diff --git a/fai/config/hooks/partition.DEFAULT b/fai/config/hooks/partition.DEFAULT index 0dbc376..81475f2 100755 --- a/fai/config/hooks/partition.DEFAULT +++ b/fai/config/hooks/partition.DEFAULT @@ -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 ## diff --git a/pxe-server b/pxe-server index 2e8b2a4..4d18ccb 100755 --- a/pxe-server +++ b/pxe-server @@ -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