X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=fai%2Fconfig%2Ffiles%2Fboot%2Fchboot%2FDEFAULT;h=8a093d9e32287de91e36266bd87bcb65fae7fc3f;hb=d29d21017de635db1d05769144db56f44addd055;hp=b90b9261187bd5ab6aaff97110a88cb819ad822e;hpb=cfe7d2a4eb0e0af4cd59df420f76ea4d5ee755fd;p=automated-distro-installer diff --git a/fai/config/files/boot/chboot/DEFAULT b/fai/config/files/boot/chboot/DEFAULT index b90b926..8a093d9 100755 --- a/fai/config/files/boot/chboot/DEFAULT +++ b/fai/config/files/boot/chboot/DEFAULT @@ -16,8 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -set -eE -o pipefail -trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR +x="$(readlink -f "$BASH_SOURCE")"; source "${x%/*}/bash-trace" [[ $EUID == 0 ]] || exec sudo "$BASH_SOURCE" "$@" @@ -28,7 +27,24 @@ Set grub to boot into a different distro, and reboot unless -r With no argument, print available distros DISTRO_NAME is based on the partition names in /boot. -For example debianjessie for the partitionn boot_debianjessie. +For example, boot_debianjessie. + +For a system without libreboot, which is failing completely to +boot on one distro, here is how I did a chboot for it: +# arch-pxe had been run previously +pxe-server treetowl arch +# reboot treetowl into arch live env +pxe-server # disable pxe server +ssh root@treetowl +lsblk # identify boot dev. if boot dev is a raid, this could be repeated on all boot devs. +mount /dev/sdd3 /mnt +mount_point=/mnt/boot_debiantesting # the subvol i want to chboot to +boot_disk=/dev/sdd +grub-bios-setup -d $mount_point/grub/i386-pc -s -m $mount_point/grub/device.map $boot_disk +reboot + +todo: figure out if it's possible to make a multi-distro grub like I have with libreboot +for non-libreboot systems -r Do not reboot. -d Enable debug output. @@ -59,10 +75,15 @@ done distro=$1 +mnt=/boot +if ! mountpoint $mnt &>/dev/null; then + mnt=/ +fi + if [[ ! $distro ]]; then echo "available distros:" - cur=$(btrfs subvol show /boot| sed -rn 's/^.*Name:\s*(\S*).*/\1/p') - btrfs subvolume list /boot | awk '{print $9}' | sed "s/$cur/$cur (current)/" + cur=$(btrfs subvol show $mnt| sed -rn 's/^.*Name:\s*(\S*).*/\1/p') + btrfs subvolume list $mnt | awk '{print $9}' | sed "s/$cur/$cur (current)/" exit 0 fi @@ -71,9 +92,9 @@ fi #### begin initial error checking ##### -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 +if ! btrfs subvolume list $mnt | grep "$distro$" &>/dev/null; then + echo "$0: error: $distro not found in btrfs subvolume list $mnt:" + btrfs subvolume list $mnt exit 1 fi @@ -81,11 +102,11 @@ fi e() { echo "$@"; "$@"; } -boot_dev=$(mount | sed -rn "s#^(\S+) on /boot .*#\1#p") +boot_dev=$(mount | sed -rn "s#^(\S+) on $mnt .*#\1#p") mount_point=$(mktemp -d) -e mount -o subvol=boot_$distro $boot_dev $mount_point +e mount -o subvol=$distro $boot_dev $mount_point boot_disk=${boot_dev%%[0-9]*} @@ -94,12 +115,10 @@ boot_disk=${boot_dev%%[0-9]*} # 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 -# todo, mount_point needs subvolid=0 - e umount $mount_point e mount $boot_disk$grub_extn $mount_point -e grub-editenv $mount_point/grubenv set last_boot=/boot_$distro +e grub-editenv $mount_point/grubenv set last_boot=/$distro e grub-editenv $mount_point/grubenv set did_fai_check=true e umount $mount_point e rmdir $mount_point