X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=chboot;fp=chboot;h=37d2516bb1cf941753a949b6ff9a0259b4592470;hb=e6da963744f05fc92ba515f1544fbbc0773f4d2f;hp=0000000000000000000000000000000000000000;hpb=9ff459d81a21b8154340752d20288104c50b798c;p=automated-distro-installer 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