much cheering ensues!
2009/3/31 Matthew Ahrens <matthew.ahr...@sun.com>: > FYI, I filed this PSARC case yesterday, and expect to integrate into > OpenSolaris in April. Your comments are welcome. > > http://arc.opensolaris.org/caselog/PSARC/2009/204/ > > --matt > > > ---------- Forwarded message ---------- > From: Matthew Ahrens <ahr...@dm-eng-01.sfbay.sun.com> > To: psarc-...@sun.com > Date: Mon, 30 Mar 2009 20:39:05 -0700 (PDT) > Subject: ZFS user/group quotas & space accounting [PSARC/2009/204 FastTrack > timeout 04/08/2009] > > Template Version: @(#)sac_nextcase 1.68 02/23/09 SMI > This information is Copyright 2009 Sun Microsystems > 1. Introduction > 1.1. Project/Component Working Name: > ZFS user/group quotas & space accounting > 1.2. Name of Document Author/Supplier: > Author: Matthew Ahrens > 1.3 Date of This Document: > 30 March, 2009 > 4. Technical Description > ZFS user/group space accounting > > A. SUMMARY > > This case adds support to ZFS for user/group quotas & per-uid/gid space > tracking. > > B. PROBLEM > > Enterprise customers often want to know who is using space, based on > what uid and gid owns each file. > > Education customers often want to apply per-user quotas to hundreds of > thousands of users. In these situations, the number of users and/or > existing infrastructure prohibits using one filesystem per user and > setting filesystem-wide quotas. > > C. PROPOSED SOLUTION > > 1. Overview > > Each filesystem keeps track of how much space inside it is owned by each > user (uid) and group (gid). This is the amount of space "referenced", > so relationships between filesystems, descendents, clones, and snapshots > are ignored, and each tracks their "user used" and "group used" > independently. This is the same policy behind the "referenced", > "refquota", and "refreservation" properties. The amount of space > charged is the amount of space reported by struct stat's st_blocks and > du(1). > > Both POSIX ids (uid & gid) and untranslated SIDs are supported (eg, when > sharing filesystems over SMB without a name service translation set up). > > ZFS will now enforce quotas on the amount of space referenced by files > owned by particular users and groups. Enforcement may be delayed by > several seconds. In other words, users may go a bit over their quota > before the system notices that they are over quota and begins to refuse > additional writes with EDQUOT. This decision was made to get the > feature to market in a reasonable time, with a minimum of engineering > resources expended. The design and implementation do not preclude > implementing strict enforcement at a later date. > > User space accounting and quotas "stick with" each dataset (snapshot, > filesystem, and clone). This means that user quotas (and space > accounting) are not inherited. They will be "copied" to a new snapshot, > and keep the values they had at the time the snapshot was taken. > Likewise, user quotas will be "copied" to a clone (from its origin > snapshot), and they will be copied with "zfs send" (even without -R). > (User accounting and quota information is not actually copied to > snapshots and clones, just referenced and copied-on-write like other > filesystem contents.) > > The user space accounting and quotas is reported by the new > userused@<user>, groupused@<group>, userquota@<user>, and > groupquota@<group> properties, and by the new "zfs userspace" and "zfs > groupspace" subcommands, which are detailed below. > > 2. Version Compatibility > > To use these features, the pool must be upgraded to a new on-disk > version (15). Old filesystems must have their space accounting > information initialized by running "zfs userspace <fs>" or upgrading the > old filesystem to a new on-disk version (4). To set user quotas, the > pool and filesystem must both be upgraded. > > 3. Permissions > > Setting or changing user quotas are administrative actions, subject to > the same privilege requirements as other zfs subcommands. There are new > "userquota" and "groupquota" permissions which can be granted with "zfs > allow", to allow those properties to be viewed and changed. > > Unprivileged users can only view their own userquota and userused, and > the groupquota and groupused of any groups they belong to. The new > "userused" and "groupused" permissions can be granted with "zfs allow" > to permit users to view these properties. > > The existing "version" permission (granted with "zfs allow") permits the > accounting information to be initialized by "zfs userspace". > > 4. New Properties > > user/group space accounting information and quotas can be manipulated > with 4 new properties: > > zfs get userused@<user> <fs|snap> > zfs get groupused@<group> <fs|snap> > > zfs get userquota@<user> <fs|snap> > zfs get groupquota@<group> <fs|snap> > > zfs set userquota@<user>=<quota> <fs> > zfs set groupquota@<user>=<quota> <fs> > > The <user> or <group> is specified using one of the following forms: > posix name (eg. ahrens) > posix numeric id (eg. 126829) > sid name (eg. ahr...@sun) > sid numeric id (eg. S-1-12345-12423-125829) > > For "zfs set", if a nonexistent name is specified, an error is > generated. Any numeric ID is permitted. For "zfs get", if a > nonexistent name is specified, "-" is printed for the value, indicating > that there is no value available (like "zfs get nonexistent:userproperty"). > > As with filesystem quotas ("quota" and "refquota" properties), user > quotas can be set to a value larger than the available space. > > User quotas can also be set to a value less than the amount of space > used by that user, effectively forcing that user to reduce their space > utilization. > > These new properties are not printed by "zfs get all", since that could > generate a huge amount of output, which would not be very well > organized. The new "zfs userspace" subcommand should be used instead. > > 5. New Subcommands > > Two new subcommands are added: "zfs userspace" and "zfs groupspace": > > zfs {user|group}space [-hniHp] [-o field[,...]] [-sS field] ... > [-t type [,...]] <filesystem|snapshot> > > Typical output is like this: > TYPE NAME USED QUOTA > POSIX User ahrens 14M 1G > POSIX User george 56.5M none > POSIX User lling 258M 500M > SMB User ma...@sun 103M none > > Option flags: > > -h Show help message and exit. > > -n Print numeric ID instead of user/group name (like "ls -n") > > -i Translate SID to POSIX ID. The POSIX ID may be ephemeral if no > mapping exists. Normal POSIX interfaces (eg, stat(2), "ls -l") > perform this translation, so the -i option allows the output > from "zfs userspace" to be compared directly with those > utilities. However, -i may lead to confusion if some files were > created by a SMB user before a SMB -> POSIX name mapping was > established. In that case some files are owned by the SMB > entity and some by the POSIX entity. The -i flag will report > that the POSIX entity has the total usage and quota for both > entities. > > -H Do not print headers, use tab-delimited output (like "zfs list/get > -H") > > -p Use exact (parsable) numeric output (like "zfs get -p") > > -o field[,...] > Print only the specified fields (like "zfs list/get -o"), from > the following set: type,name,used,quota. The default is to > print all fields. > > -s field > Sort output by this field (like "zfs list -s"). The -s (and -S) > flag may be specified multiple times to sort first by one field, > then by another. The default is "-s type -s name". > > -S field > Sort by this field in reverse order, see -s. > > -t type[,...] > Print only the specified types (like "zfs list -t"), from the > following set: all,posixuser,smbuser,posixgroup,smbgroup. The > default for "zfs userspace" is "-t posixuser,smbuser". The > default for "zfs groupspace" is "-t posixgroup,smbgroup". This > is the only difference between the two subcommands, and in fact > "zfs userspace -t posixgroup" is perfectly valid. > > 6. Stability > > This case requests patch/micro release binding. The new interfaces are > committed. > > > 6. Resources and Schedule > 6.4. Steering Committee requested information > 6.4.1. Consolidation C-team Name: > ON > 6.5. ARC review type: FastTrack > 6.6. ARC Exposure: open > > _______________________________________________ > zfs-discuss mailing list > zfs-discuss@opensolaris.org > http://mail.opensolaris.org/mailman/listinfo/zfs-discuss > > _______________________________________________ zfs-discuss mailing list zfs-discuss@opensolaris.org http://mail.opensolaris.org/mailman/listinfo/zfs-discuss