#!/bin/sh # vim: set sw=4 ts=4 sts=4 et : SUBVOLUMES=' /var /var/log /var/tmp /etc ' cleanup() { if [ -n "${tmpdir}" ] && [ "${tmpdir}" != / ]; then if mountpoint -q "${tmpdir}"; then umount "${tmpdir}" fi rm -rf "${tmpdir}" unset tmpdir fi } copy_var() { dev="$1" echo 'Copying /var contents to data volume' mount -o subvol=var "${dev}" "${tmpdir}" || exit cp -acuv /var/. "${tmpdir}" || exit umount "${tmpdir}" } format_dev() { dev="$1" printf 'Creating BTRFS filesystem on %s\n' "${dev}" mkfs.btrfs "${dev}" || exit mount "${dev}" "${tmpdir}" || exit for vol in ${SUBVOLUMES}; do mkdir -p "${tmpdir}${vol%/*}" || exit btrfs subvolume create "${tmpdir}${vol}" || exit done relabel_all umount "${dev}" || exit } has_fs() { dev="$1" fstype=$(blkid -o value -s TYPE "${dev}") [ -n "${fstype}" ] } relabel_all() { selinuxtype=$(. /etc/selinux/config && echo ${SELINUXTYPE}) find "${tmpdir}" | \ setfiles \ -v \ -F \ -m \ -r "${tmpdir}" \ -s \ /etc/selinux/${selinuxtype}/contexts/files/file_contexts } setup_etc() { dev="$1" echo 'Initializing writable paths in /etc' mount -o subvol=etc "${dev}" "${tmpdir}" || exit if [ ! -f "${tmpdir}"/shadow ]; then cp -ca /etc/shadow "${tmpdir}"/shadow || exit fi mount -o bind "${tmpdir}"/shadow /etc/shadow || exit if [ -f /etc/aimee-os/writable-etc ]; then while read type path; do if [ ! -e "${tmpdir}/${path}" ]; then if [ -e /etc/"${path}" ]; then cp -ca /etc/"${path}" "${tmpdir}/${path}" elif [ "${type}" = d ]; then mkdir -p "${tmpdir}/${path}" elif [ "${type}" = f ]; then : > "${tmpdir}/${path}" else printf 'Invalid path type %s for %s\n' \ "${type}" \ "${path}" \ >&2 continue fi fi mount -o bind "${tmpdir}/${path}" /etc/"${path}" done < /etc/aimee-os/writable-etc fi umount "${tmpdir}" } datapart=$(findfs $(awk '$2=="/var"{print $1}' /etc/fstab)) if [ -b "${datapart}" ]; then printf 'Found data partition: %s\n' "${datapart}" else echo 'Could not identify data partition' >&2 exit 1 fi trap cleanup INT TERM QUIT EXIT tmpdir=/run/storinit mkdir -p "${tmpdir}" if ! has_fs "${datapart}"; then format_dev "${datapart}" fi setup_etc "${datapart}" copy_var "${datapart}"