#!/bin/sh # System initialization sequence: # # /init # | # +--(1) /etc/01_prepare.sh # | # +--(2) /etc/02_overlay.sh (this file) # | # +-- /etc/03_init.sh # | # +-- /sbin/init # | # +--(1) /etc/04_bootscript.sh # | | # | +-- /etc/autorun/* (all scripts) # | # +--(2) /bin/sh (Alt + F1, main console) # | # +--(2) /bin/sh (Alt + F2) # | # +--(2) /bin/sh (Alt + F3) # | # +--(2) /bin/sh (Alt + F4) # Create the new mountpoint in RAM. mount -t tmpfs none /mnt # Create folders for all critical file systems. mkdir /mnt/dev mkdir /mnt/sys mkdir /mnt/proc mkdir /mnt/tmp mkdir /mnt/var echo "Created folders for all critical file systems." # Copy root folders in the new mountpoint. echo -e "Copying the root file system to \\e[94m/mnt\\e[0m." cp -a bin etc lib lib64 root sbin src usr var /mnt 2>/dev/null setvar DEFAULT_OVERLAY_DIR = ""/tmp/minimal/overlay"" setvar DEFAULT_UPPER_DIR = ""/tmp/minimal/rootfs"" setvar DEFAULT_WORK_DIR = ""/tmp/minimal/work"" echo "Searching available devices for overlay content." for DEVICE in /dev/* { setvar DEV = $(echo "${DEVICE##*/}") setvar SYSDEV = $(echo "/sys/class/block/$DEV") case (DEV) { *loop* { continue } } if test ! -d $SYSDEV { continue } mkdir -p /tmp/mnt/device setvar DEVICE_MNT = '/tmp/mnt/device' setvar OVERLAY_DIR = """" setvar OVERLAY_MNT = """" setvar UPPER_DIR = """" setvar WORK_DIR = """" mount $DEVICE $DEVICE_MNT 2>/dev/null if test -d $DEVICE_MNT/minimal/rootfs -a -d $DEVICE_MNT/minimal/work { # folder echo -e " Found \\e[94m/minimal\\e[0m folder on device \\e[31m$DEVICE\\e[0m." touch $DEVICE_MNT/minimal/rootfs/minimal.pid 2>/dev/null if test -f $DEVICE_MNT/minimal/rootfs/minimal.pid { # read/write mode echo -e " Device \\e[31m$DEVICE\\e[0m is mounted in read/write mode." rm -f $DEVICE_MNT/minimal/rootfs/minimal.pid setvar OVERLAY_DIR = "$DEFAULT_OVERLAY_DIR" setvar OVERLAY_MNT = "$DEVICE_MNT" setvar UPPER_DIR = "$DEVICE_MNT/minimal/rootfs" setvar WORK_DIR = "$DEVICE_MNT/minimal/work" } else { # read only mode echo -e " Device \\e[31m$DEVICE\\e[0m is mounted in read only mode." setvar OVERLAY_DIR = "$DEVICE_MNT/minimal/rootfs" setvar OVERLAY_MNT = "$DEVICE_MNT" setvar UPPER_DIR = "$DEFAULT_UPPER_DIR" setvar WORK_DIR = "$DEFAULT_WORK_DIR" } } elif test -f $DEVICE_MNT/minimal.img { #image echo -e " Found \\e[94m/minimal.img\\e[0m image on device \\e[31m$DEVICE\\e[0m." mkdir -p /tmp/mnt/image setvar IMAGE_MNT = '/tmp/mnt/image' setvar LOOP_DEVICE = $(losetup -f) losetup $LOOP_DEVICE $DEVICE_MNT/minimal.img mount $LOOP_DEVICE $IMAGE_MNT if test -d $IMAGE_MNT/rootfs -a -d $IMAGE_MNT/work { touch $IMAGE_MNT/rootfs/minimal.pid 2>/dev/null if test -f $IMAGE_MNT/rootfs/minimal.pid { # read/write mode echo -e " Image \\e[94m$DEVICE/minimal.img\\e[0m is mounted in read/write mode." rm -f $IMAGE_MNT/rootfs/minimal.pid setvar OVERLAY_DIR = "$DEFAULT_OVERLAY_DIR" setvar OVERLAY_MNT = "$IMAGE_MNT" setvar UPPER_DIR = "$IMAGE_MNT/rootfs" setvar WORK_DIR = "$IMAGE_MNT/work" } else { # read only mode echo -e " Image \\e[94m$DEVICE/minimal.img\\e[0m is mounted in read only mode." setvar OVERLAY_DIR = "$IMAGE_MNT/rootfs" setvar OVERLAY_MNT = "$IMAGE_MNT" setvar UPPER_DIR = "$DEFAULT_UPPER_DIR" setvar WORK_DIR = "$DEFAULT_WORK_DIR" } } else { umount $IMAGE_MNT rm -rf $IMAGE_MNT } } if test $OVERLAY_DIR != "" -a $UPPER_DIR != "" -a $WORK_DIR != "" { mkdir -p $OVERLAY_DIR mkdir -p $UPPER_DIR mkdir -p $WORK_DIR mount -t overlay -o lowerdir=$OVERLAY_DIR:/mnt,upperdir=$UPPER_DIR,workdir=$WORK_DIR none /mnt 2>/dev/null setvar OUT = ""$? if test ! $OUT = "0" { echo -e " \\e[31mMount failed (probably on vfat).\\e[0m" umount $OVERLAY_MNT 2>/dev/null rmdir $OVERLAY_MNT 2>/dev/null rmdir $DEFAULT_OVERLAY_DIR 2>/dev/null rmdir $DEFAULT_UPPER_DIR 2>/dev/null rmdir $DEFAULT_WORK_DIR 2>/dev/null } else { # All done, time to go. echo -e " Overlay data from device \\e[31m$DEVICE\\e[0m has been merged." break } } else { echo -e " Device \\e[31m$DEVICE\\e[0m has no proper overlay structure." } umount $DEVICE_MNT 2>/dev/null rm -rf $DEVICE_MNT 2>/dev/null } # Move critical file systems to the new mountpoint. mount --move /dev /mnt/dev mount --move /sys /mnt/sys mount --move /proc /mnt/proc mount --move /tmp /mnt/tmp echo -e "Mount locations \\e[94m/dev\\e[0m, \\e[94m/sys\\e[0m, \\e[94m/tmp\\e[0m and \\e[94m/proc\\e[0m have been moved to \\e[94m/mnt\\e[0m." # The new mountpoint becomes file system root. All original root folders are # deleted automatically as part of the command execution. The '/sbin/init' # process is invoked and it becomes the new PID 1 parent process. echo "Switching from initramfs root area to overlayfs root area." exec switch_root /mnt /etc/03_init.sh echo "(/etc/02_overlay.sh) - there is a serious bug..." # Wait until any key has been pressed. read -n1 -s