mount gets into a state where it won't set/unset ZFS properties
(atime, exec, setuid)
Scot Hetzel
swhetzel at gmail.com
Thu Aug 9 10:07:10 PDT 2007
While checking out a problem with mount unsetting noatime on a UFS
system, I tested mount with both a UFS and ZFS filesystems. The ZFS
filesystem had several problems:
hp010# uname -a
FreeBSD hp010.hetzel.org 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Wed Aug
8 10:38:34 CDT 2007
root at hp010.hetzel.org:/usr/src/7x/sys/amd64/compile/GENERIC.debug
amd64
hp010# umount /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
hp010# zfs mount -a
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
hp010# mount -u -o noexec,nosuid /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec off temporary
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local,
noexec, nosuid)
Why doesn't the setuid property change to 'temporary' for
rootpool/usr/ports/distfiles?
hp010# mount -u -o exec,suid /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec off temporary
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local,
noexec, nosuid)
mount can't get rid of these options.
hp010# mount -u -o noatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime off temporary
rootpool/usr/ports/distfiles exec off temporary
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local,
noatime, noexec, nosuid)
hp010# mount -u -o atime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime off temporary
rootpool/usr/ports/distfiles exec off temporary
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local,
noatime, noexec, nosuid)
Same problem with getting rid of noatime. I would have expected mount
to be able to be able to change the zfs properties of atime, exec back
to on.
hp010# zfs inherit -r atime rootpool/usr/ports/distfiles
hp010# zfs inherit -r exec rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
hp010# zfs set setuid=off rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid off local
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
We have now set everything back to the default mount options using 'zfs inherit'
hp010# mount -u -o noatime,noexec,nosuid /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
Now mount can't set noatime or noexec.
hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
Back to the defaults again.
This last part gets a bit strange, without umounting
/usr/ports/distfiles, I tried the following:
hp010# mount -u -o nosuid /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
hp010# zfs set setuid=off rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid off local
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
hp010# mount -u -o noatime,noexec,nosuid /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec off temporary
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local,
noexec, nosuid)
hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles
hp010# zfs inherit -r exec rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
hp010# mount -u -o noatime,noexec,nosuid /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec off temporary
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local,
noexec, nosuid)
It won't set noatime when noexec and nosuid are specified.
hp010# mount -u -o noatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
Now it removed noexec, and didn't set noatime.
hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
Lets try setting noatime again:
hp010# mount -u -o noatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
mount shows nosuid. Lets unset if with zfs inherit:
hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
nosuid is gone, lets see if we can now set noatime:
hp010# mount -u -o noatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
Again mount is showing nosuid:
hp010# mount -u -o nonoatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
hp010# mount -u -o nonosuid /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, nosuid)
Try nonoatime and nonosuid, but mount still showing nosuid. Using zfs
inherit gets rid of nosuid:
hp010# zfs inherit -r setuid rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
Give up, and umount the filesystem:
hp010# umount /usr/ports/distfiles
hp010# zfs mount -a
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
hp010# mount -u -o noatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime off temporary
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noatime)
We can now set noatime, try nonoatime to unset it:
hp010# mount -u -o nonoatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime off temporary
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noatime)
That didn't work, does atime work:
hp010# mount -u -o atime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime off temporary
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noatime)
Reset atime to defaults with zfs inherit:
hp010# zfs inherit -r atime rootpool/usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
Does nonoatime have any side efects now:
hp010# mount -u -o nonoatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
No side effect, lets try setting noatime:
hp010# mount -u -o noatime /usr/ports/distfiles
hp010# zfs get atime,exec,setuid rootpool/usr/ports/distfiles ; mount
| grep distfiles
NAME PROPERTY VALUE SOURCE
rootpool/usr/ports/distfiles atime on default
rootpool/usr/ports/distfiles exec on default
rootpool/usr/ports/distfiles setuid on default
rootpool/usr/ports/distfiles on /usr/ports/distfiles (zfs, local)
hp010#
Now mount can't set noatime.
Scot
--
DISCLAIMER:
No electrons were mamed while sending this message. Only slightly bruised.
More information about the freebsd-current
mailing list