1e79a303fSAaron LI#!/bin/sh 2e79a303fSAaron LI 3e79a303fSAaron LIexport PATH=/bin:/sbin 4e79a303fSAaron LIexport HOME=/var/home 5*775db7a9SSascha Wildnerexport TERM=cons25 6e79a303fSAaron LI 7e79a303fSAaron LI# Where to mount the real root partition 8e79a303fSAaron LIexport NEW_ROOT=/new_root 9e79a303fSAaron LI 10e79a303fSAaron LIrescue_shell() { 11e79a303fSAaron LI echo "Starting the recovery shell ..." 12e79a303fSAaron LI cat /etc/motd 13e79a303fSAaron LI exec sh 14e79a303fSAaron LI exit 0 15e79a303fSAaron LI} 16e79a303fSAaron LI 17e79a303fSAaron LIif [ ! -d "$NEW_ROOT" ]; then 18e79a303fSAaron LI echo "WARNING: trying to remount / RW and create $NEW_ROOT ..." 19e79a303fSAaron LI mount -u -w / && 20e79a303fSAaron LI mkdir $NEW_ROOT || 21e79a303fSAaron LI rescue_shell 22e79a303fSAaron LIfi 23e79a303fSAaron LI 24e79a303fSAaron LIecho "Setting up /var directories ..." 25e79a303fSAaron LImount_tmpfs tmpfs /var 26e79a303fSAaron LImkdir /var/db /var/empty /var/home /var/run /var/tmp 278506a14bSSascha Wildnertouch /var/run/utmpx 28e79a303fSAaron LI 29e79a303fSAaron LIecho "Starting udevd for LVM ..." 30e79a303fSAaron LIudevd 31e79a303fSAaron LI 32e79a303fSAaron LIecho "Executing additional rc scripts ..." 33e79a303fSAaron LIfor rcs in /etc/rc.*; do 34e79a303fSAaron LI if [ -x "$rcs" ]; then 35e79a303fSAaron LI . $rcs 36e79a303fSAaron LI fi 37e79a303fSAaron LIdone 38e79a303fSAaron LI 39e79a303fSAaron LIecho "Mounting real root partition at $NEW_ROOT ..." 40e79a303fSAaron LI 41e79a303fSAaron LIIFS=':' 42e79a303fSAaron LIREAL_ROOT=$(sysctl -n vfs.real_root) 43e79a303fSAaron LIif [ $? -ne 0 ]; then 44e79a303fSAaron LI echo "ERROR: vfs.real_root sysctl no exist. The kernel is too old." 45e79a303fSAaron LI rescue_shell 46e79a303fSAaron LIfi 47e79a303fSAaron LIif [ -z "${REAL_ROOT}" ]; then 48e79a303fSAaron LI echo "ERROR: vfs.real_root sysctl not set." 49e79a303fSAaron LI rescue_shell 50e79a303fSAaron LIfi 51e79a303fSAaron LIset -- $REAL_ROOT 52e79a303fSAaron LIunset IFS 53e79a303fSAaron LI 54e79a303fSAaron LITYPE=$1 55e79a303fSAaron LIif [ "$TYPE" = "local" ]; then 56e79a303fSAaron LI FSTYPE=$2 57e79a303fSAaron LI MOUNTFROM="/dev/${3#/dev/}" 58e79a303fSAaron LI echo "Executing: mount -t $FSTYPE $4 $MOUNTFROM $NEW_ROOT" 59e79a303fSAaron LI mount -o ro -t $FSTYPE $4 $MOUNTFROM $NEW_ROOT || 60e79a303fSAaron LI rescue_shell 61e79a303fSAaron LIelif [ -x "/etc/rcmount_${TYPE}" ]; then 62e79a303fSAaron LI . /etc/rcmount_${TYPE} "$@" || 63e79a303fSAaron LI rescue_shell 64e79a303fSAaron LIelse 65e79a303fSAaron LI echo "ERROR: Unsupported root filesystem type: $TYPE." 66e79a303fSAaron LI rescue_shell 67e79a303fSAaron LIfi 68e79a303fSAaron LI 69e79a303fSAaron LIecho "Stopping udevd ..." 70e79a303fSAaron LIkill $(cat /var/run/udevd.pid) 71e79a303fSAaron LI 72e79a303fSAaron LIecho "Cleaning up and umounting /var ..." 73e79a303fSAaron LIrm -rf /var/* 74ea93a0d3SAaron LIcd / 75e79a303fSAaron LIumount /var 76e79a303fSAaron LI 77e79a303fSAaron LIecho "Mounting devfs on real root ..." 78e79a303fSAaron LI#mount_devfs $NEW_ROOT/dev 79e79a303fSAaron LImount_null /dev $NEW_ROOT/dev 80