Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Feb 2014 21:22:58 -0700
From:      John Nielsen <lists@jnielsen.net>
To:        Darren Pilgrim <list_freebsd@bluerosetech.com>
Cc:        freebsd-fs <freebsd-fs@freebsd.org>, freebsd-questions <freebsd-questions@freebsd.org>
Subject:   Re: How to use zfs send -R without risking union mounts?
Message-ID:  <DD1ED7BB-3639-4CD5-8E2F-46E163C7150C@jnielsen.net>
In-Reply-To: <52D83909.3080809@bluerosetech.com>
References:  <52D83909.3080809@bluerosetech.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Jan 16, 2014, at 12:54 PM, Darren Pilgrim =
<list_freebsd@bluerosetech.com> wrote:

> When you send -R a filesystem, it very nicely retains all of the =
properties.  That also includes the mountpoint property.  Setting =
canmount=3Doff is the only safeguard against mounting a filesystem =
accidentally and it can't be inherited.  That means it's rather =
dangerous to send -R the filesystems on which the OS reside.
>=20
> I want to create a backup using a process like:
>=20
> Create the initial full backup:
>=20
> zpool create backup /dev/gpt/backup
> zfs create backup/tank
> zfs send -R tank@yesterday | zfs recv -F backup/tank
> zpool export backup
>=20
> Then do incremental backups:
>=20
> zpool import -N backup
> zfs send -R -I tank@yesterday tank@today | zfs recv -F backup/tank
> zpool export backup
>=20
> The problem I ran into is zfs can mount the contents of backup/tank. =
Normally if you try to mount a ZFS filesystem at a non-empty directory, =
it gives the error:
>=20
> mountpoint '/foo' exists and is not empty
>=20
> During testing, I inadvertently dropped the -N flag to zpool import =
and ZFS successfully mounted everything on the backup drive over top of =
the live systems!  I had two mounts for /, /var, /usr, /home, etc. =
Imagining the hell of that happening in production, with active =
filesystems, is an exercise for the reader.
>=20
> How do you force ZFS to never automatically mount a filesystem or any =
of its descendants?  You can't recursively set properties and canmount =
can't be inherited, so I'm stuck on how to enforce this critical bit of =
safety.

I've been working through this issue myself recently. My strategy is to =
always run "zfs receive" with '-u' so the received filesystems won't be =
mounted automatically, only use "zfs send -R" for the initial send", and =
thereafter change each dataset's "canmount" property to "off", a la
# zfs list -Ho name -r tank/backups/somehost | xargs -n 1 zfs set =
canmount=3Doff

I'd love to find a better solution, but that's been adequate so far.

JN




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?DD1ED7BB-3639-4CD5-8E2F-46E163C7150C>