minix/etc/rc.minix
David van Moolenbroek 325ce30bcc Initial import of NetBSD rc system
IMPORTANT: this change has a docs/UPDATING entry!

This patch performs an initial import of the infrastructure and a
subset of the NetBSD set of rc startup and shutdown scripts.  The
"initial" refers to the fact that this is not yet a full switch to the
NetBSD rc system: the MINIX ramdisk rc script, which (typically) runs
as the first thing, is kept as is.  After mounting the root file
system, the ramdisk rc script will start the NetBSD rc infrastructure
by invoking /etc/rc, however.  The regular MINIX startup-and-shutdown
script has been moved from /etc/rc to /etc/rc.minix, and is now
invoked as part of the NetBSD rc infrastructure through a bridge rc
script /etc/rc.d/minixrc.  /etc/rc.minix invokes /usr/etc/rc as before.

Switching over the ramdisk to the NetBSD system and decomposing the
MINIX rc.minix script into smaller components are left to future work.
Also, the current pkgsrc etc/rc.d auto-start functionality is left as
is, even though it should be removed (see the etc/usr/rc comment).

Change-Id: Ia96cae7c426e94b85c67978dc1307dacc4b09fc5
2017-02-23 14:08:39 +00:00

249 lines
5.4 KiB
Plaintext
Executable File

# /etc/rc.minix - MINIX system startup script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
# The normal system boot situation is that init(8) invokes the ramdisk RC
# script, which invokes the NetBSD rc infrastructure, which in turn calls this
# script through /etc/rc.d/minixrc. With a boot ramdisk (x86_ramimage), the
# ramdisk RC is bypassed altogether, but stored as /etc/rc.ramdisk. We then
# have to invoke it here (for startup only!) to let it perform its tasks first.
if sysenv bootramdisk >/dev/null
then
[ "$1" = "start" ] && sh /etc/rc.ramdisk "$@"
fi
# Same settings as in the default /etc/profile. We do not source this file
# as the system administrator may decide to change those values for his users.
RC_TZ=/etc/rc.timezone
# Are we booting from CD?
bootcd="`/bin/sysenv bootcd`"
# Set TERM to minix if not present.
TERM="${TERM-minix}"
export TERM PATH
# Local variables
ARCH="`sysenv arch`"
usage()
{
echo >&2 "Usage: $0 [-saf] [start|stop]"
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
minix-service $opt up /service/$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 /service or /usr/pkg/service
binlocation=/service/$service
if [ ! -x $binlocation ]
then binlocation=/usr/pkg/service/$service
fi
# Mostly to find init...
if [ ! -x $binlocation ]
then binlocation=/sbin/$service
fi
minix-service $opt edit $binlocation -label $service "$@"
}
set -- `sysenv bootopt` "$@"
while getopts 'saf' opt
do
case $opt in
s) sflag=t ;; # Single user
a) aflag=t ;; # Ask for /usr
f) fflag=-f ;; # Force a full file system check
*) usage
esac
done
shift `expr $OPTIND - 1`
case "$#:$1" in
1:start|1:stop)
action=$1
;;
*) usage
esac
case $action in
start)
# If booting from CD, we want some directories to be ramdisks
if [ ! -z "$bootcd" ]
then
. /etc/rc.cd
fi
# National keyboard?
test -f /etc/keymap && loadkeys /etc/keymap
# options for fsck. default is -r, which prompts the user for repairs.
optname=fsckopts
fsckopts=-p
if sysenv $optname >/dev/null
then fsckopts="`sysenv $optname`"
fi
if [ "`sysenv debug_fkeys`" != 0 ]
then
up -n is -period 5HZ
fi
# Set timezone.
export TZ=GMT0
if [ -f "$RC_TZ" ]
then
. "$RC_TZ"
fi
# Start real time clock driver & set system time, otherwise default date.
up readclock.drv
readclock -q || date 201301010000
# We are not shutting down.
if [ -f /etc/nologin ]
then
rm -f /etc/nologin
fi
# Use MFS binary only from kernel image?
if [ "`sysenv bin_img`" = 1 ]
then
bin_img="-i "
fi
# fsck + mount using /etc/fstab.
fsck -x / $fflag $fsckopts
mount -a
if [ -z "`sysenv bootramdisk`" ]
then
# Unmount and free now defunct ramdisk
umount /dev/imgrd > /dev/null || echo "Failed to unmount boot ramdisk"
ramdisk 0 /dev/imgrd || echo "Failed to free boot ramdisk"
fi
# Initialize files.
>/var/run/utmp # /etc/utmp keeps track of logins
>/var/run/utmpx # /etc/utmpx keeps track of logins
# 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 mib
edit pfs
edit init
#
# Keep a copy around to recover the root FS from crashes
#
rootline=`cat /etc/mtab | grep "on / "`
rootfs=fs_`echo "$rootline" | cut -d' ' -f1 | cut -d'/' -f3`
[ "$rootfs" = "fs_bootramdisk" ] && rootfs=fs_imgrd
roottype=`echo "$rootline" | cut -d' ' -f5`
minix-service -c edit /service/$roottype -label $rootfs
fi
if [ "$sflag" ]
then
echo "Single user. Press ^D to resume multiuser startup."
intr sh
echo
fi
echo "Multiuser startup in progress ..."
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
echo -n "Starting hotplugging infrastructure... "
rm -f /var/run/devmand.pid
devmand -d /etc/devmand -d /usr/pkg/etc/devmand &
echo "done."
# Things should be alright now.
;;
stop)
sync
if [ -f /var/run/devmand.pid ]
then
kill -INT `cat /var/run/devmand.pid`
# without this delay the following will
# be printed in the console
# RS: devman not running?
sleep 1
fi
#
# usbd needs to be stopped exactly
# at this stage(before stopping devman
# and after stopping the services
# stated by devmand)
if [ -x /usr/pkg/etc/rc.d/usbd ]
then
/usr/pkg/etc/rc.d/usbd stop
fi
if [ -x /service/usbd ]
then
minix-service down usbd
fi
# Tell RS server we're going down.
minix-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?
if [ "$action" = start ]
then if [ -f /etc/issue ]
then cat /etc/issue
fi
fi
exit 0