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