X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=fai%2Fconfig%2Ffiles%2Fboot%2Fchboot%2FDEFAULT;h=adfbe1c31d71661d685b64abca31137f6bc0617a;hb=HEAD;hp=4dda460dbae5d3117860495dc940159b8ccdfe54;hpb=47b51938ae090a2717cb2ec3f9e547a76e7b2ae7;p=automated-distro-installer diff --git a/fai/config/files/boot/chboot/DEFAULT b/fai/config/files/boot/chboot/DEFAULT index 4dda460..6b0e964 100755 --- a/fai/config/files/boot/chboot/DEFAULT +++ b/fai/config/files/boot/chboot/DEFAULT @@ -16,32 +16,35 @@ # 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 -E "${BASH_SOURCE[0]}" "$@" + -[[ $EUID == 0 ]] || exec sudo "$BASH_SOURCE" "$@" +if ! test "$BASH_VERSION"; then echo "error: shell is not bash" >&2; exit 1; fi +shopt -s inherit_errexit 2>/dev/null ||: # ignore fail in bash < 4.4 +set -eE -o pipefail +trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" exit status: $?, PIPESTATUS: ${PIPESTATUS[*]}" >&2' ERR usage() { - cat </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)/" - exit 0 + echo "available distros:" + 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 ###### end command line parsing ##### @@ -88,38 +95,45 @@ 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 - exit 1 +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 #### end initial error checking ##### e() { echo "$@"; "$@"; } -boot_dev=$(mount | sed -rn "s#^(\S+) on /boot .*#\1#p") +for boot_dev in $(btrfs fil show $mnt | sed -nr 's#.*path\s+(\S+)$#\1#p'); do -mount_point=$(mktemp -d) + 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]*} + 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 + # 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 +done -e umount $mount_point +if [[ $(blockdev --getsize64 ${boot_disk}4) == 8388608 ]]; then + # old partition scheme + grub_dev=${boot_disk}4 +elif [[ $(blockdev --getsize64 ${boot_disk}5) == 8388608 ]]; then + grub_dev=${boot_disk}5 +else + grub_dev=${boot_disk}7 +fi -e mount $boot_disk$grub_extn $mount_point -e grub-editenv $mount_point/grubenv set last_boot=/boot_$distro +e mount $grub_dev $mount_point +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 - if $reboot; then - touch /tmp/keyscript-off - reboot now + touch /tmp/keyscript-off + reboot now fi