#!/bin/bash # Copyright (C) 2016 Ian Kelling # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # 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 [[ $EUID == 0 ]] || exec sudo "$BASH_SOURCE" "$@" usage() { cat </dev/null; then echo "$0: error: _$distro$ not found in btrfs subvolume list /boot:" btrfs subvolume list /boot exit 1 fi #### end initial error checking ##### 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 # 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 did_fai_check=true e umount $mount_point e rmdir $mount_point if $reboot; then touch /tmp/keyscript-off reboot now fi