From cfe7d2a4eb0e0af4cd59df420f76ea4d5ee755fd Mon Sep 17 00:00:00 2001 From: Ian Kelling Date: Tue, 22 Nov 2016 19:03:50 -0800 Subject: [PATCH] install chboot to /boot in case its needed --- README | 1 + chboot | 111 +-------------------------- fai/config/files/boot/chboot/DEFAULT | 110 ++++++++++++++++++++++++++ fai/config/scripts/GRUB_PC/11-ian | 1 + install-chboot | 44 +++++++++++ 5 files changed, 157 insertions(+), 110 deletions(-) mode change 100755 => 120000 chboot create mode 100755 fai/config/files/boot/chboot/DEFAULT create mode 100755 install-chboot diff --git a/README b/README index a3b16b7..def4fb5 100644 --- a/README +++ b/README @@ -39,6 +39,7 @@ Main scripts meant to be called interactively: arch-init-remote # install arch (after it's been booted into it's setup env) chboot # Set grub to boot into a different distro (installed earlier) +install-chboot # reinstall chboot to /boot subvols, for when it changes dsfull # install & setup a new fai distro (if data partition already synced) eboot # reboot and keep disks encrypted fai-kexec # kexec to fai tftp server that pxe would normally point to diff --git a/chboot b/chboot deleted file mode 100755 index b90b926..0000000 --- a/chboot +++ /dev/null @@ -1,110 +0,0 @@ -#!/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 diff --git a/chboot b/chboot new file mode 120000 index 0000000..b311a15 --- /dev/null +++ b/chboot @@ -0,0 +1 @@ +fai/config/files/boot/chboot/DEFAULT \ No newline at end of file diff --git a/fai/config/files/boot/chboot/DEFAULT b/fai/config/files/boot/chboot/DEFAULT new file mode 100755 index 0000000..b90b926 --- /dev/null +++ b/fai/config/files/boot/chboot/DEFAULT @@ -0,0 +1,110 @@ +#!/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 diff --git a/fai/config/scripts/GRUB_PC/11-ian b/fai/config/scripts/GRUB_PC/11-ian index a10efef..7650340 100755 --- a/fai/config/scripts/GRUB_PC/11-ian +++ b/fai/config/scripts/GRUB_PC/11-ian @@ -24,6 +24,7 @@ EOF apt-get install -y pxe-kexec EOFOUTER +fcopy -r /boot # -r = recursive # note: # fcopy -i = ignore nonmatching class error, always return 0. # this is also done by FABASE/10-misc by default. fcopy -ir /root diff --git a/install-chboot b/install-chboot new file mode 100755 index 0000000..838c0ae --- /dev/null +++ b/install-chboot @@ -0,0 +1,44 @@ +#!/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. + +[[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@" + +set -eE -o pipefail +trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR + +# usage install-chboot: isntalls chboot to all /boot subvols, +# in case there is an issue booting and it is needed. +# Run this when chboot changes. + +cd "${BASH_SOURCE%/*}" + +e() { echo "$@"; "$@"; } + +boot_dev=$(mount | sed -rn "s#^(\S+) on /boot .*#\1#p") +mount_point=$(mktemp -d) +e mount -o subvolid=0 $boot_dev $mount_point + +shopt -s nullglob +for dir in $mount_point/*; do + btrfs subvol show $dir &>/dev/null || continue + if [[ -e $dir/boot ]]; then + dir=$dir/boot + fi + e install -m 755 -o root -g root chboot $dir +done +e umount $mount_point +e rmdir $mount_point -- 2.30.2