Re: boot fails "Can't stat /dev/da0a: No such file or directory"

From: Edward Tomasz Napierała <trasz_at_FreeBSD.org>
Date: Thu, 5 May 2016 13:41:23 +0200
On 0505T1847, Graham Menhennitt wrote:
> On 3/05/2016 07:59 PM, Edward Tomasz Napierała wrote:
> > On 0503T1922, Graham Menhennitt wrote:
> >> On 3/05/2016 06:42 PM, Edward Tomasz Napierała wrote:
> >>> On 0502T0643, Graham Menhennitt wrote:
> >>>> On 30/04/2016 06:53 PM, Graham Menhennitt wrote:
> >>>>> Hi all,
> >>>>>
> >>>>> I have a USB disk that I use for backup. Up till now, it's mounted
> >>>>> without any problems at boot time. After updating to -current as of
> >>>>> yesterday, it doesn't mount and causes the boot to fail.
> >>>>>
> >>>>> My /etc/fstab looks like:
> >>>>>
> >>>>>     # Device    Mountpoint    FStype    Options    Dump    Pass#
> >>>>>
> >>>>>     /dev/ada0s1a    /        ufs    rw    1    1
> >>>>>     /dev/ada0s1b    none        swap    sw    0    0
> >>>>>     /dev/da0a    /backup        ufs    rw,late    1    1
> >>>>>
> >>>>>
> >>>>> I tried adding the "late" to fix the problem, but it doesn't help.
> >>>>>
> >>>>> The error message is:
> >>>>>
> >>>>>     /dev/ada0s1a: clean...
> >>>>>     Can't stat /dev/da0a: No such file or directory
> >>>>>     Unknown error; help!
> >>>>>     ERROR: ABORTING BOOT (sending SIGTERM to parent)!
> >>>>>
> >>>>>
> >>>>> (hand transcribed - maybe typos)
> >>>>>
> >>>>> Can anybody help, please.
> >>>>>
> >>>>> Thanks,
> >>>>>     Graham
> >>>> Sorry, I forgot to mention...
> >>>>
> >>>> I commented out that line from fstab which allows the boot to complete.
> >>>> I can then manually mount it without any problems. It looks like the
> >>>> device doesn't get created early enough.
> >>> Have you run mergemaster after upgrade?  In particular, do you have
> >>> the current version of /etc/rc.d/mountcritlocal?
> >>>
> >> Thanks for replying, Edward. Yes I've installed that file. The delay
> >> that Dave told me about has fixed the problem.
> > Still, it would be nice if this worked by default.  The updated
> > mountcritlocal script should wait for USB to release root tokens
> > if the mount initially fails,
> >
> Ok, I tried to do a bit of diagnosis here. I took out the delay from
> /boot/loader.conf and I added "set -x" to the top of
> /etc/rc.d/mountcritlocal (before the start of the mountcritlocal_start()
> function definition). I then rebooted. I didn't see any shell command
> output from the "set -x" before the error occurred. That means that the
> error is happening before /etc/rc.d/mountcritlocal is being read.
> 
> When I put the delay back in and boot, I see the shell commands after
> the filesystems are mounted (and, hence, after the error would have
> occurred if the delay wasn't there). So I don't think mountcritlocal is
> going to help me.
> 
> I'm not sure what else to try. if you have any suggestions, I can do
> some experimenting. Is there a simple way to capture the output from the
> rc.d scripts?

Huh, you've nailed it - it was a different script, /etc/rc.d/fsck; it
runs before mountcritlocal.  Could you try the following patch?  You can
apply it directly to /etc/rc.d:

Index: etc/rc.d/fsck
===================================================================
--- etc/rc.d/fsck	(revision 299115)
+++ etc/rc.d/fsck	(working copy)
_at__at_ -14,6 +14,35 _at__at_ desc="Run file system checks"
 start_cmd="fsck_start"
 stop_cmd=":"
 
+# 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.
+root_hold_wait()
+{
+	waited=0
+	while true; 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} -ge ${root_hold_delay} ]; then
+			echo
+			break
+		fi
+		sleep 1
+		waited=$(($waited + 1))
+	done
+}
+
 fsck_start()
 {
 	if [ "$autoboot" = no ]; then
_at__at_ -31,7 +60,21 _at__at_ fsck_start()
 			fsck -p
 		fi
 
-		case $? in
+		err=$?
+		if [ ${err} -eq 3 ]; then
+			echo "Warning! Some of the devices might not be" \
+			    "available; retrying"
+			root_hold_wait
+			check_startmsgs && echo "Restarting file system checks:"
+			if checkyesno background_fsck; then
+				fsck -F -p
+			else
+				fsck -p
+			fi
+			err=$?
+		fi
+
+		case ${err} in
 		0)
 			;;
 		2)
Received on Thu May 05 2016 - 09:41:30 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:04 UTC