ZFS is auto-mounting in wrong order

Trond Endrestøl trond.endrestol at ximalas.info
Wed Apr 24 07:35:19 UTC 2019


On Thu, 18 Apr 2019 16:33-0700, Jim Long wrote:

> I have a system that boots from ZFS.  I recently upgraded it from
> FreeBSD 11.2-STABLE to 12.0-STABLE:
> 
> FreeBSD electron 12.0-STABLE FreeBSD 12.0-STABLE r346293 GENERIC  amd64
> 
> I'm seeing certain directories as empty, when they should have lots of
> content.  The problem can be worked around by unmounting key
> filesystems, and re-mounting them in the proper order.

We are both experiencing some unforeseen side-effects of r345578,
https://svnweb.freebsd.org/base?view=revision&revision=345578.

I first observed this odd behaviour when upgrading from r345628 to 
r346220. I assumed some of the ZFS changes between these revision were 
to blame, i.e. r346126, r346128, and/or r346130, but alas, r346125 
exhibits the same symptoms as r346220.

I mistook this issue for being deterministic, but it isn't. I have 
rebooted my system now running r346269 a couple of times today, and 
sometimes the parallel mounting succeeds and sometimes it doesn't.

In my particular case it's better to mount all filesystems belonging 
to my root pool in sequential order before mounting in parallel the 
remaining filesystems from the other pools.

Afterall, I only have about 135 filesystems to mount.

I will open a PR suggesting parallel mounting be made optional for us 
who don't have thousands of filesystems to be mounted at boot time. 
Maybe doing the root pool before other pools is the way forward.

See the discussion I initiated on -stable@, 
https://lists.freebsd.org/pipermail/freebsd-stable/2019-April/090898.html

I did make one change today. /var/db from the root pool is no longer a 
separate filesystem. Its contents were moved aside to a directory on 
the root filesystem, /var/db1, the canmount property was set to off, 
and the new directory assumed the correct name of /var/db.

For now, I boot my affected system in single-user mode and run my 
remount shell script saved as /remount-filesystems.sh before exiting 
to multiuser mode:

#!/bin/sh

# To be run while in singleuser mode,
# preferably (re)booted directly to singleuser mode.

PATH="/bin:/sbin:/usr/bin:/usr/sbin:/rescue"
export PATH

killall devd
killall local-unbound
killall moused
killall wpa_supplicant

umount /usr/compat/linux/dev/fd
umount /usr/compat/linux/dev
umount /usr/compat/linux/proc
umount /usr/compat/linux/sys

zfs unmount -a

mount -uw /

for fs in `zfs list -Hro canmount,name enterprise_zroot | egrep -v '(^off)|(enterprise_zroot$)|(enterprise_zroot/ROOT)|(enterprise_zroot/do-not-destroy)' | awk '{print $2}'`; do
  zfs mount ${fs}
done

for fs in `zfs list -Hro canmount,name enterprise_zdata | egrep -v '(^off)|(enterprise_zdata$)|(enterprise_zdata/do-not-destroy)' | awk '{print $2}'`; do
  zfs mount ${fs}
done

mount -al

echo "You may now attempt to exit to multiuser mode ..."

# EOF

-- 
Trond.


More information about the freebsd-questions mailing list