#!/bin/sh # # $FreeBSD$ # # PROVIDE: mountcritlocal # REQUIRE: root hostid_save mdconfig # KEYWORD: nojail shutdown . /etc/rc.subr name="mountcritlocal" desc="Mount critical local filesystems" start_cmd="mountcritlocal_start" stop_cmd=sync mountcritlocal_start() { local err holders waited # Set up the list of network filesystem types for which mounting # should be delayed until after network initialization. case ${extra_netfs_types} in [Nn][Oo]) ;; *) netfs_types="${netfs_types} ${extra_netfs_types}" ;; esac # Mount everything except nfs filesystems. check_startmsgs && echo -n 'Mounting local filesystems:' mount_excludes='no' for i in ${netfs_types}; do fstype=${i%:*} mount_excludes="${mount_excludes}${fstype}," done mount_excludes=${mount_excludes%,} # Originally, root mount hold had to be released before mounting # the root filesystem. This delayed the boot, so it was changed # to only wait if the root device isn't readily available. This # can result in this script executing before all the devices - such # as graid(8) - are available. Thus, should the mount fail, # we will wait for the root mount hold release and retry. mount -a -t ${mount_excludes} err=$? if [ ${err} -ne 0 ]; then echo echo 'Mounting /etc/fstab filesystems failed,' \ 'will retry after root mount hold release' waited=0 while [ ${waited} -lt ${root_hold_delay} ]; do holders="$(sysctl -n vfs.root_mount_hold)" if [ -z "${holders}" ]; then break; fi if [ ${waited} -eq 0 ]; then echo -n "Waiting ${root_hold_delay}s" \ "for the root mount holders: ${holders}" else echo -n . fi if [ ${waited} -eq ${root_hold_delay} ]; then break 2 fi sleep 1 waited=$(($waited + 1)) done mount -a -t ${mount_excludes} err=$? fi check_startmsgs && echo '.' case ${err} in 0) ;; *) echo 'Mounting /etc/fstab filesystems failed,' \ 'startup aborted' stop_boot true ;; esac } load_rc_config $name run_rc_command "$1"