# Local filesystem mounting -*- shell-script -*- # # This script overrides local_mount_root() in /scripts/local # and mounts root as a read-only filesystem with a temporary (rw) # overlay filesystem. # . /scripts/local local_mount_root() { echo 'using startos initramfs module' local_top local_device_setup "${ROOT}" "root file system" ROOT="${DEV}" # Get the root filesystem type if not set if [ -z "${ROOTFSTYPE}" ]; then FSTYPE=$(get_fstype "${ROOT}") else FSTYPE=${ROOTFSTYPE} fi local_premount # CHANGES TO THE ORIGINAL FUNCTION BEGIN HERE # N.B. this code still lacks error checking modprobe ${FSTYPE} checkfs ${ROOT} root "${FSTYPE}" echo 'mounting startos' mkdir /startos ROOTFLAGS="$(echo "${ROOTFLAGS}" | sed 's/subvol=\(next\|current\)//' | sed 's/^-o *$//')" if [ "${FSTYPE}" != "unknown" ]; then mount -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /startos else mount ${ROOTFLAGS} ${ROOT} /startos fi if [ -d /startos/images ]; then if [ -h /startos/config/current.rootfs ] && [ -e /startos/config/current.rootfs ]; then image=$(readlink -f /startos/config/current.rootfs) else image="$(ls -t1 /startos/images/*.rootfs | head -n1)" fi if ! [ -f "$image" ]; then >&2 echo "image $image not available to boot" exit 1 fi else if [ -f /startos/config/upgrade ] && [ -d /startos/next ]; then oldroot=/startos/next elif [ -d /startos/current ]; then oldroot=/startos/current elif [ -d /startos/prev ]; then oldroot=/startos/prev else >&2 echo no StartOS filesystem found exit 1 fi mkdir -p /startos/config/overlay/etc mv $oldroot/etc/fstab /startos/config/overlay/etc/fstab mv $oldroot/etc/machine-id /startos/config/overlay/etc/machine-id mv $oldroot/etc/ssh /startos/config/overlay/etc/ssh mkdir -p /startos/images mv $oldroot /startos/images/legacy.rootfs rm -rf /startos/next /startos/current /startos/prev ln -rsf /startos/images/old.squashfs /startos/config/current.rootfs image=$(readlink -f /startos/config/current.rootfs) fi mkdir /lower /upper if [ -d "$image" ]; then mount -r --bind $image /lower elif [ -f "$image" ]; then modprobe loop modprobe squashfs mount -r $image /lower else >&2 echo "not a regular file or directory: $image" exit 1 fi modprobe overlay || insmod "/lower/lib/modules/$(uname -r)/kernel/fs/overlayfs/overlay.ko" # Mount a tmpfs for the overlay in /upper mount -t tmpfs tmpfs /upper mkdir /upper/data /upper/work mkdir -p /startos/config/overlay # Mount the final overlay-root in $rootmnt mount -t overlay \ -olowerdir=/startos/config/overlay:/lower,upperdir=/upper/data,workdir=/upper/work \ overlay ${rootmnt} mkdir -m 750 -p ${rootmnt}/media/startos mkdir -p ${rootmnt}/media/startos/config mount --bind /startos/config ${rootmnt}/media/startos/config mkdir -p ${rootmnt}/media/startos/images mount --bind /startos/images ${rootmnt}/media/startos/images mkdir -p ${rootmnt}/media/startos/root mount -r --bind /startos ${rootmnt}/media/startos/root mkdir -p ${rootmnt}/media/startos/current mount -r --bind /lower ${rootmnt}/media/startos/current }