diff options
Diffstat (limited to 'etc')
-rw-r--r-- | etc/defaults/rc.conf | 1 | ||||
-rwxr-xr-x | etc/rc.d/mountcritlocal | 38 |
2 files changed, 37 insertions, 2 deletions
diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf index fbe18db..4c0e899 100644 --- a/etc/defaults/rc.conf +++ b/etc/defaults/rc.conf @@ -84,6 +84,7 @@ geli_autodetach="YES" # Automatically detach on last close. #geli_mirror_home_flags="-k /etc/geli/home.keys" root_rw_mount="YES" # Set to NO to inhibit remounting root read-write. +root_hold_delay="30" # Time to wait for root mount hold release. fsck_y_enable="NO" # Set to YES to do fsck -y if the initial preen fails. fsck_y_flags="" # Additional flags for fsck -y background_fsck="YES" # Attempt to run fsck in the background where possible. diff --git a/etc/rc.d/mountcritlocal b/etc/rc.d/mountcritlocal index 06bf464..1513ec7 100755 --- a/etc/rc.d/mountcritlocal +++ b/etc/rc.d/mountcritlocal @@ -15,7 +15,7 @@ stop_cmd=sync mountcritlocal_start() { - local err + local err holders waited # Set up the list of network filesystem types for which mounting # should be delayed until after network initialization. @@ -35,8 +35,42 @@ mountcritlocal_start() 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 [ $? -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 @@ -44,7 +78,7 @@ mountcritlocal_start() ;; *) echo 'Mounting /etc/fstab filesystems failed,' \ - ' startup aborted' + 'startup aborted' stop_boot true ;; esac |