Initial commit

This commit is contained in:
david 2020-12-05 17:36:51 +00:00
commit 8b218188c6
3 changed files with 150 additions and 0 deletions

116
_do_self_checks.sh Executable file
View File

@ -0,0 +1,116 @@
#!/bin/bash
set -Eeuo pipefail
# Used to check environment variables have been set.
# In use it is called by do_chroot.sh and do_umount.sh
#
# Works safely, but not expected to be run independently.
# It mounts the FILE_SYSTEM_DIR specified in ARM_root.sh.
# If necessary, you can run do_umount.sh to unmount it.
# Define chroot mounts, without a leading /.
# Needed by do_chroot.sh.
# Used as $i in:
# mount --bind /$i ./$i
# umount ./$i
export CHROOT_MOUNT_SET="dev dev/pts proc sys"
#
# Check environment variables, then mount the filesystem.
#
main(){
local CONFIG_FILE="${1}"
check_config_file_is_specified "$CONFIG_FILE"
check_config_file_exists "$CONFIG_FILE"
check_config_file_is_executable "$CONFIG_FILE"
. $CONFIG_FILE
check_for_unset_variables "$CONFIG_FILE"
mount_filesystem_if_not_mounted "$CONFIG_FILE"
}
check_config_file_is_specified() {
local CONFIG_FILE="${1}"
if [ -z "$CONFIG_FILE" ]; then
echo "Error: CONFIG_FILE not specified."
exit 1
fi
}
check_config_file_exists() {
local CONFIG_FILE="${1}"
if [ ! -f "$CONFIG_FILE" ]; then
cat <<-!
Error: $CONFIG_FILE is missing.
Expecting $CONFIG_FILE to set FILE_SYSTEM_DIR and POOL_PREFIX,
perhaps something like:
export FILE_SYSTEM_DIR=/space/amd64/devuan/beowulf/tasmotizer
# On our zfs, /space/amd64/... is the mount of rpool/amd64/...
# RPOOL_ROOT is specified to convert from one to the other.
export POOL_PREFIX=/space
export RPOOL_ROOT=rpool
!
exit 1
fi
}
check_config_file_is_executable() {
local CONFIG_FILE="${1}"
if [ ! -x "$CONFIG_FILE" ]; then
echo "Error: $CONFIG_FILE is not executable."
exit 2
fi
}
check_for_unset_variables() {
local CONFIG_FILE="${1}"
# Check for unset variables. Allow unset variables here.
set +u;
if [ -z "$FILE_SYSTEM_DIR" ]; then
echo "Error: FILE_SYSTEM_DIR was not set in $CONFIG_FILE."
exit 3
fi;
set -u
# Check for unset variables. Allow unset variables here.
set +u;
if [ -z "$POOL_PREFIX" ]; then
echo "Error: POOL_PREFIX was not set in $CONFIG_FILE."
exit 4
fi;
set -u
# Check for unset variables. Allow unset variables here.
set +u;
if [ -z "$RPOOL_ROOT" ]; then
echo "Error: RPOOL_ROOT was not set in $CONFIG_FILE."
exit 5
fi;
set -u
}
mount_filesystem_if_not_mounted() {
local CONFIG_FILE="${1}"
check_for_unset_variables $CONFIG_FILE
# On our zfs, /space/amd64/... is the mount of rpool/amd64/...
# Get the pool name (change POOL_PREFIX for RPOOL_ROOT).
local RPOOL=${FILE_SYSTEM_DIR/${POOL_PREFIX}/${RPOOL_ROOT}}
# Mount if not mounted
if [ -z "$(grep "${RPOOL} " /proc/mounts)" ]; then
sudo zfs mount $RPOOL
fi
}
# Entry point.
main ./ARM_root.sh

14
do_chroot.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
set -Eeuo pipefail
# Check and set environment, and mount file system.
. ./_do_self_checks.sh
cd $FILE_SYSTEM_DIR
if [ ! -z "$CHROOT_MOUNT_SET" ]; then
for i in $CHROOT_MOUNT_SET; do
sudo mount --bind /$i ./$i
done
fi
sudo /usr/sbin/chroot . /bin/bash

20
do_umount.sh Normal file
View File

@ -0,0 +1,20 @@
# Deliberately not executable. Run as:
# bash ./do_umount
# Check the environment and mount the file system if it is not mounted (to be
# sure it makes sense to umount it, rather than be umounting something else).
. ./_do_self_checks.sh
(
# If the file system had been mounted before _do_self_checks.sh, above,
# the umounts might fail for being busy, so allow errors.
set +Ee
cd $FILE_SYSTEM_DIR
for i in $CHROOT_MOUNT_SET; do
sudo umount --lazy ./$i
done 2>/dev/null
exit 0
)
sudo umount $FILE_SYSTEM_DIR