minix/etc/rc
2010-08-18 16:07:54 +00:00

231 lines
4.8 KiB
Plaintext
Executable file

# /etc/rc - System startup script run by init before going multiuser.
exec >/dev/log
exec 2>/dev/log
exec </dev/null
umask 022
TERM="${TERM-minix}"
PATH=/usr/local/bin:/bin:/usr/bin:/usr/sbin:/usr/pkg/bin:/usr/pkg/sbin:/usr/llvm/bin:/sbin
RC_TZ=/etc/rc.timezone
export TERM PATH
usage()
{
echo >&2 "Usage: $0 [-saf] start|stop|down"
exec intr sh
}
up()
{
# Function to dynamically start a system service
opt=""
prefix=$(expr "$1 " : '\(-\)')
if [ "$prefix" = "-" ];
then
opt=$1
shift
fi
service=$1
shift
service $opt up /sbin/$service "$@"
}
edit()
{
# Function to dynamically edit system service settings
opt=""
prefix=$(expr "$1 " : '\(-\)')
if [ "$prefix" = "-" ];
then
opt=$1
shift
fi
service=$1
shift
# Assume binaries are always in /usr/sbin
service $opt edit /usr/sbin/$service -label $service "$@"
}
while getopts 'saf' opt
do
case $opt in
s) sflag=t ;; # Single user
a) aflag=t ;; # Ask for /usr
f) fflag=t ;; # Force a full file system check
*) usage
esac
done
shift `expr $OPTIND - 1`
case "$#:$1" in
1:start|1:stop|1:down)
action=$1
;;
*) usage
esac
case $action in
start)
echo -n "Multiuser startup in progress ..."
# National keyboard?
test -f /etc/keymap && loadkeys /etc/keymap
# options for fsck. default is -r, which prompts the user for repairs.
fsckopts="`sysenv fsckopts`"
if [ ! "$fsckopts" ]
then fsckopts=-r
fi
if [ "`sysenv debug_fkeys`" != 0 ]
then
up -n is -period 5HZ
fi
echo
# Set timezone.
export TZ=GMT0
if [ -f "$RC_TZ" ]
then . "$RC_TZ"
fi
# Try to read the hardware real-time clock, otherwise do it manually.
readclock || intr date -q
# Initialize files.
printroot >/etc/mtab # /etc/mtab keeps track of mounts
>/etc/utmp # /etc/utmp keeps track of logins
# /etc/fstab lists the root, tmp and usr devices.
. /etc/fstab
# Unmount now defunct ramdisk
umount /dev/imgrd > /dev/null || echo "Failed to unmount boot ramdisk"
# Use MFS binary only from kernel image?
if [ "`sysenv bin_img`" = 1 ]
then
bin_img="-i "
fi
# Are we booting from CD?
bootcd="`/bin/sysenv bootcd`"
# If booting from CD, /usr has to be mounted readonly.
# Also, $usr won't be specified correctly in the
# fstab (the CD could be anywhere), so we decide
# where it is based on sysenv (set by FS when probing for CD).
if [ "$bootcd" = 1 ]
then
#imagedev="`/bin/sysenv cdproberoot`"
#usrdev="`expr $imagedev + 1`"
usr_roflag="-r"
usr="$cddev"p2
echo "Setting /usr on cd is $usr"
fi
# Mount the /usr partition unless this is a single floppy Minix.
if [ ! -d /usr/bin ]
then
if [ "$aflag" -o "$usr" = unknown ]
then
# We need to ask what the /usr du jour is.
intr sh -c '
echo -n "Finish the name of device to mount as /usr: /dev/"
read usr
echo "usr=/dev/$usr" >/tmp/usr'
. /tmp/usr
fi
mount $bin_img $usr_roflag $usr /usr || {
echo "\
Please try to mount something else as /usr, then hit CTRL-D to continue startup.
Mount $usr /usr failed -- Single user."
intr sh
}
rm -f /tmp/usr
fi
# Check if the system crashed.
if shutdown -C
then
echo
echo "The system was not properly shut down. Checking file systems."
fflag=t
fi
if [ "$fflag" ]
then
umount $usr
echo "fsck.mfs / - $root"
intr fsck.mfs $fsckopts $root
echo "fsck.mfs /usr - $usr"
intr fsck.mfs $fsckopts $usr
if [ ! -z "$home" ]
then echo "fsck.mfs /home - $home"
intr fsck.mfs $fsckopts $home
fi
mount $bin_img $usr /usr
fi
# Edit settings for boot system services
if [ "`sysenv skip_boot_config`" != 1 ]
then
edit rs
edit vm
edit pm
edit sched
edit vfs
edit ds
edit tty
edit memory
edit -p log
edit -c pfs
edit init
fi
if [ ! -z "$home" ]
then mount $bin_img $home /home || echo "WARNING: couldn't mount $home on /home"
fi
# This file is necessary for above 'shutdown -C' check.
# (Silence stderr in case of running from cd.)
touch /usr/adm/wtmp 2>/dev/null
if [ "$sflag" ]
then
echo "Single user."
intr sh
fi
case "`printroot -r`":$bootcd in
/dev/ram:)
# Remove boot-only things to make space,
# unless booting from CD, in which case we need them.
rm -rf /boot
# put the compiler on ram
cp /usr/lib/em* /usr/lib/cpp* /lib
esac
# Things should be alright now.
;;
down|stop)
sync
# Tell RS server we're going down.
service shutdown
;;
esac
# Further initialization.
test -f /usr/etc/rc && sh /usr/etc/rc $action
test -f /usr/local/etc/rc && sh /usr/local/etc/rc $action
# Any messages?
test "$action" = start -a -f /etc/issue && cat /etc/issue
exit 0