xref: /dflybsd-src/initrd/etc/rc (revision 775db7a9d40446c2b74629e655ceb34867b1184d)
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