[bug] ZFS zvol dev entry disappearing upon reboot
serenity at exscape.org
Thu Jul 23 08:12:10 UTC 2009
On Jul 23, 2009, at 09:31, Thomas Backman wrote:
> On Jul 18, 2009, at 19:27, McLone wrote:
>> Hell Low.
>> As downloading torrent files from many peers to ZFS
>> imposes fragmentation (and there's no way to defragment
>> ZFS volume - what a pity! How come now-a-days FS can
>> go like this?), i created zvol with UFS2 on it last time
>> i wanted to watch some old sci-fi. I had plans to
>> move sci-fi from UFS2/zvol to ZFS when it'll be complete,
>> but forgot it, and rebooted machine. After reboot
>> rtorrent said sci-fi is marked as complete, but it
>> can not find files. I wasn't surprised, as i haven't modified
>> my /etc/fstab, so i entered "mount /dev/zvol" and pressed
>> Tab in hope of tcsh (eek) autocomplete.
>> It just beeped on me.
>> I've done "ls /dev" and there was no directory there named zvol.
>> Then i've done "zfs list" and my zvol was there.
>> Puzzled, i've done "zfs snapshot" and then a little dance of
>> "zfs send | zfs recv" to a new volume. Now dev entries appeared
>> (both for newly created snapshot of an old zvol and for new zvol).
>> I rebooted, and there was no /dev/zvol again.
>> I looked at my uname -v output (it was HEAD/amd64 from Jul 1)
>> and decided to update. Updating didn't solved this problem.
>> Strangely, simple "zfs rename zpool/zvol zpool/newzvol"
>> cures this woe, but i think this is a bug.
>> Steps to reproduce:
>> zfs create -V 1g zpool/zvol
>> [newfs /dev/zvol/zpool/zvol]
>> ls /dev
>> zfs rename zpool/zvol zpool/newzvol
>> mount /dev/zvol/zpool/zvol /mnt
> OK, I've found the problem we have here... Or, rather, I've found
> the *reason* (and this shows why I previously said I couldn't
> reproduce). I haven't found it in source, though.
> UFS filesystems in fstab are mounted *before* the /dev/zvol
> directory is populated, at least on my system!
> If I remove the entry from fstab, everything boots fine, and the
> directory exists when the boot is complete. If its IN fstab, init
> gives me a root prompt because it couldn't find /dev/zvol/x/y.
> Remove it, and again it works on the next boot.
> And, as you said, renaming it while in single user creates /dev/zvol
> and thus resolves the issue for that boot and allows me to boot into
> multiuser with the ZVOL working.
> Anyone with a clue in these areas know if there's an easy fix to
> this (i.e. easy enough that we could have it in 8.0)? I'm guessing /
> etc/rc.d/zfs simply starts too late in the boot process?
So, my solution:
Edit /etc/rc.d/zfs, and replace "#REQUIRE: mountcritlocal" with
/ is mounted before any of these runs anyway, right? And / contains /
sbin/zfs and everything it needs:
# ldd /sbin/zfs
libzfs.so.2 => /lib/libzfs.so.2 (0x800656000)
libgeom.so.5 => /lib/libgeom.so.5 (0x80078a000)
libbsdxml.so.4 => /lib/libbsdxml.so.4 (0x80088f000)
libsbuf.so.5 => /lib/libsbuf.so.5 (0x8009b2000)
libm.so.5 => /lib/libm.so.5 (0x800ab4000)
libnvpair.so.2 => /lib/libnvpair.so.2 (0x800bd3000)
libuutil.so.2 => /lib/libuutil.so.2 (0x800cdc000)
libutil.so.8 => /lib/libutil.so.8 (0x800de5000)
libc.so.7 => /lib/libc.so.7 (0x800ef5000)
Works for me(tm) (with MBR, ZFS root and UFS /boot), the ZVOL mounts
just fine and I get no errors during boot. Another way would probably
(haven't tested) to run "zfs volinit" in mountcritlocal, but then I
suppose there'd have to be a check for zfs_enable="YES" in there too.
More information about the freebsd-current