kernel: some boottime sanitychecks
[minix.git] / etc / rc
blob597fa0948e90a05b5023255087d72979e562e4ef
1 # /etc/rc - System startup script run by init before going multiuser.
3 exec >/dev/log
4 exec 2>/dev/log
5 exec </dev/null
7 umask 022
8 FSTAB=/etc/fstab
9 TERM="${TERM-minix}"
10 PATH=/usr/local/bin:/bin:/usr/bin:/usr/sbin:/usr/pkg/bin:/usr/pkg/sbin:/sbin
11 RC_TZ=/etc/rc.timezone
12 export TERM PATH
14 usage()
16     echo >&2 "Usage: $0 [-saf] start|stop|down"
17     exec intr sh
20 up()
22     # Function to dynamically start a system service
23     opt=""
24     prefix=$(expr "$1 " : '\(-\)')
25     if [ "$prefix" = "-" ];
26     then
27          opt=$1
28          shift
29     fi
30     service=$1
31     shift
33     service $opt up /sbin/$service "$@"
36 edit()
38     # Function to dynamically edit system service settings
39     opt=""
40     prefix=$(expr "$1 " : '\(-\)')
41     if [ "$prefix" = "-" ];
42     then
43          opt=$1
44          shift
45     fi
46     service=$1
47     shift
49     # Assume binaries are always in /usr/sbin
50     service $opt edit /usr/sbin/$service -label $service "$@" 
53 # This function parses the deprecated minix shellscript-style 
54 # /etc/fstab, and fscks and mounts its filesystems.
55 mountfstab_poorman()
57     echo "WARNING: old fstab format, please upgrade!"
59     # /etc/fstab lists the root, home, and usr devices.
60     . $FSTAB
62     intr fsck.mfs $fsckopts $usr
63     if [ ! -z "$home" ]
64     then intr fsck.mfs $fsckopts $home
65     fi
67     # mount /usr
68     mount $bin_img $usr /usr
70     if [ ! -z "$home" ]
71     then mount $bin_img $home /home || echo "WARNING: couldn't mount $home on /home"
72     fi
75 while getopts 'saf' opt
77     case $opt in
78     s)  sflag=t ;;      # Single user
79     a)  aflag=t ;;      # Ask for /usr
80     f)  fflag=-f ;;     # Force a full file system check
81     *)  usage
82     esac
83 done
84 shift `expr $OPTIND - 1`
86 case "$#:$1" in
87 1:start|1:stop|1:down)
88     action=$1
89     ;;
90 *)  usage
91 esac
93 case $action in
94 start)
96     # National keyboard?
97     test -f /etc/keymap && loadkeys /etc/keymap
99     # options for fsck. default is -r, which prompts the user for repairs.
100     optname=fsckopts
101     fsckopts=-p
102     if sysenv $optname >/dev/null
103     then       fsckopts="`sysenv $optname`"
104     fi
106     if [ "`sysenv debug_fkeys`" != 0 ]
107     then
108         up -n is -period 5HZ
109     fi
111     # Set timezone.
112     export TZ=GMT0
113     if [ -f "$RC_TZ" ]
114     then . "$RC_TZ"
115     fi
117     # Try to read the hardware real-time clock, otherwise do it manually.
118     readclock || intr date -q
120     # Initialize files.
121     printroot >/etc/mtab                # /etc/mtab keeps track of mounts
122     >/etc/utmp                          # /etc/utmp keeps track of logins
124     # Use MFS binary only from kernel image?
125     if [ "`sysenv bin_img`" = 1 ]
126     then
127         bin_img="-i "
128     fi
130     # Are we booting from CD?
131     bootcd="`/bin/sysenv bootcd`"
133     # If booting from CD, mounting is a special case.
134     # We know what to do - only /usr is mounted and it's readonly.
135     if [ "$bootcd" = 1 ]
136     then        usrdev="$cddev"p2
137                 echo "/usr on cd is $usrdev"
138                 mount -r $usrdev /usr
139     else        
140     # If we're not booting from CD, fsck + mount using /etc/fstab.
141                 read <$FSTAB fstabline
142                 if [ "$fstabline" = "# Poor man's File System Table." ]
143                 then    mountfstab_poorman      # Old minix /etc/fstab
144                 else    fsck -x / $fflag $fsckopts
145                         mount -a
146                 fi
147     fi
149     # Unmount and free now defunct ramdisk
150     umount /dev/imgrd > /dev/null || echo "Failed to unmount boot ramdisk"
151     ramdisk 0 /dev/imgrd || echo "Failed to free boot ramdisk"
153     # Edit settings for boot system services
154     if [ "`sysenv skip_boot_config`" != 1 ]
155     then
156         edit rs
157         edit vm
158         edit pm
159         edit sched
160         edit vfs
161         edit ds
162         edit tty
163         edit memory
164         edit -p log
165         edit -c pfs
166         edit init
167     fi
169     # This file is necessary for above 'shutdown -C' check.
170     # (Silence stderr in case of running from cd.)
171     touch /usr/adm/wtmp /etc/wtmp 2>/dev/null
173     if [ "$sflag" ]
174     then
175         echo "Single user. Press ^D to resume multiuser startup."
176         intr sh
177         echo
178     fi
180     echo "Multiuser startup in progress ..."
182     case "`printroot -r`":$bootcd in
183     /dev/ram:)
184         # Remove boot-only things to make space,
185         # unless booting from CD, in which case we need them.
186         rm -rf /boot
187         # put the compiler on ram
188         cp /usr/lib/em* /usr/lib/cpp* /lib
189     esac
191     echo -n "Starting hotplugging infrastructure... "
192     rm -f /var/run/devmand.pid
193     devmand -d /etc/devmand -d /usr/pkg/etc/devmand &
194     echo "done."
196     # Things should be alright now.
197     ;;
198 down|stop)
199     sync
200     if [ -f /var/run/devmand.pid ]
201     then
202         kill -INT `cat /var/run/devmand.pid`
203         # without this delay the following will 
204         # be printed in the console
205         # RS: devman not running?
206         sleep 1
207     fi
208     #
209     # usbd needs to be stopped exactly 
210     # at this stage(before stopping devman
211     # and after stopping the services
212     # stated by devmand)
213     if [ -x /usr/pkg/etc/rc.d/usbd ]
214     then 
215         /usr/pkg/etc/rc.d/usbd stop
216     fi
217     # Tell RS server we're going down.
218     service shutdown
219     ;;
220 esac
222 # Further initialization.
223 test -f /usr/etc/rc && sh /usr/etc/rc $action
224 test -f /usr/local/etc/rc && sh /usr/local/etc/rc $action
226 # Any messages?
227 test "$action" = start -a -f /etc/issue && cat /etc/issue
229 exit 0