- <title><indexterm><primary>Quotas</primary><secondary>enabling disk</secondary></indexterm>Enabling Disk Quotas</title>
- <para>Prior to Lustre 2.4.0, enabling quota involved a full filesystem scan via <literal>lfs quotacheck</literal>. All filesystems formatted with Lustre 2.4.0 or newer no longer require quotacheck to be run since up-to-date accounting information are now always maintained by the OSD layer, regardless of the quota enforcement status. Although quota enforcement is managed by Lustre itself, each OSD implementation relies on the backend filesystem to maintain per-user/group block and inode usage:</para>
- <itemizedlist>
- <listitem>
- <para>For ldiskfs backend, mkfs.lustre now creates empty quota files and enables the QUOTA feature flag in the superblock which turns quota accounting on at mount time automatically. e2fsck was also modified to fix the quota files when the QUOTA feature flag is present.</para>
- </listitem>
- <listitem>
- <para>For ZFS backend, accounting ZAPs are created and maintained by the ZFS filesystem itself. While ZFS tracks per-user and group block usage, it does not handle inode accounting. The ZFS OSD implements its own support for inode tracking. Two options are available:</para>
- <orderedlist>
- <listitem>
- <para> The ZFS OSD can estimate the number of inodes in-use based on the number of blocks used by a given user or group. This mode can be enabled by running the following command on the server running the target: <literal>lctl set_param osd-zfs.${FSNAME}-${TARGETNAME}.quota_iused_estimate=1</literal>.</para>
- </listitem>
- <listitem>
- <para> Similarly to block accounting, dedicated ZAPs are also created the ZFS OSD to maintain per-user and group inode usage. This is the default mode which corresponds to <literal>quota_iused_estimate</literal> set to 0.</para>
- </listitem>
- </orderedlist>
- </listitem>
- </itemizedlist>
- <para>As a result, <literal>lfs quotacheck</literal> is now deprecated and not required any more when running Lustre 2.4 on the servers.</para>
- <para>Lustre filesystems formatted with a Lustre version prior to 2.4.0 can be still safely upgraded to 2.4.0, but won't have functional space usage report until <literal>tunefs.lustre --quota</literal> is run against all targets. This command sets the QUOTA feature flag in the superblock and runs e2fsck (as a result, the target must be offline) to build the per-UID/GID disk usage database. </para>
-
- <caution>
- <para>Lustre 2.4 and beyond requires a version of e2fsprogs that supports quota (i.e. newer or equal to 1.42.3.wc1) to be installed on the server nodes using ldiskfs backend (e2fsprogs isn't needed with ZFS backend). In general, we recommend to use the latest e2fsprogs version available on http://downloads.whamcloud.com/public/e2fsprogs.</para>
- <para>The ldiskfs OSD relies on the standard Linux quota to maintain accounting information on disk. As a consequence, the Linux kernel running on the Lustre servers using ldiskfs backend must have <literal>CONFIG_QUOTA</literal>, <literal>CONFIG_QUOTACTL</literal> and <literal>CONFIG_QFMT_V2</literal> enabled.</para>
- </caution>
-
- <para>As of Lustre 2.4.0, quota enforcement is thus turned on/off independently of space accounting which is always enabled. <literal>lfs quota<replaceable>on|off</replaceable></literal> as well as the per-target <literal>quota_type</literal> parameter are deprecated in favor of a single per-filesystem quota parameter controlling inode/block quota enforcement. Like all permanent parameters, this quota parameter can be set via <literal>lctl conf_param</literal> on the MGS via the following syntax:</para>
- <screen>lctl conf_param <replaceable>fsname</replaceable>.quota.<replaceable>ost|mdt</replaceable>=<replaceable>u|g|ug|none</replaceable></screen>
- <itemizedlist>
- <listitem>
- <para><literal>ost</literal> -- to configure block quota managed by OSTs</para>
- </listitem>
- <listitem>
- <para><literal>mdt</literal> -- to configure inode quota managed by MDTs</para>
- </listitem>
- <listitem>
- <para><literal>u</literal> -- to enable quota enforcement for users only</para>
- </listitem>
- <listitem>
- <para><literal>g</literal> -- to enable quota enforcement for groups only</para>
- </listitem>
- <listitem>
- <para><literal>ug</literal> -- to enable quota enforcement for both users and groups</para>
- </listitem>
- <listitem>
- <para><literal>none</literal> -- to disable quota enforcement for both users and groups</para>
- </listitem>
- </itemizedlist>
-
- <para>Examples:</para>
- <para>To turn on user and group quotas for block only on filesystem testfs1, run:</para>
- <screen>$ lctl conf_param testfs1.quota.ost=ug</screen>
- <para>To turn on group quotas for inodes on filesystem testfs2, run:</para>
- <screen>$ lctl conf_param testfs2.quota.mdt=g</screen>
- <para>To turn off user and group quotas for both inode and block on filesystem testfs3, run:</para>
- <screen>$ lctl conf_param testfs3.quota.ost=none</screen>
- <screen>$ lctl conf_param testfs3.quota.mdt=none</screen>
-
- <para>Once the quota parameter set on the MGS, all targets which are part of the filesystem will be notified of the new quota settings and enable/disable quota enforcement as needed. The per-target enforcement status can still be verified by running the following command on the Lustre servers:</para>
- <screen>$ lctl get_param osd-*.*.quota_slave.info
+ <title>
+ <indexterm>
+ <primary>Quotas</primary>
+ <secondary>enabling disk</secondary>
+ </indexterm>Enabling Disk Quotas</title>
+ <para>The design of quotas on Lustre has management and enforcement
+ separated from resource usage and accounting. Lustre software is
+ responsible for management and enforcement. The back-end file
+ system is responsible for resource usage and accounting. Because of
+ this, it is necessary to begin enabling quotas by enabling quotas on the
+ back-end disk system. Because quota setup is dependent on the Lustre
+ software version in use, you may first need to run
+ <literal>lctl get_param version</literal> to identify
+ <xref linkend="whichversion"/> you are currently using.
+ </para>
+ <section>
+ <title>Enabling Disk Quotas (Lustre Software Prior to Release 2.4)
+ </title>
+ <para>
+ For Lustre software releases older than release 2.4,
+ <literal>lfs quotacheck</literal> must be first run from a client node to
+ create quota files on the Lustre targets (i.e. the MDT and OSTs).
+ <literal>lfs quotacheck</literal> requires the file system to be quiescent
+ (i.e. no modifying operations like write, truncate, create or delete
+ should run concurrently). Failure to follow this caution may result in
+ inaccurate user/group disk usage. Operations that do not change Lustre
+ files (such as read or mount) are okay to run.
+ <literal>lfs quotacheck</literal> performs a scan on all the Lustre
+ targets to calculates the block/inode usage for each user/group. If the
+ Lustre file system has many files,
+ <literal>quotacheck</literal> may take a long time to complete. Several
+ options can be passed to
+ <literal>lfs quotacheck</literal>:</para>
+ <screen>
+# lfs quotacheck -ug /mnt/testfs
+</screen>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>u</literal>-- checks the user disk quota information</para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>g</literal>-- checks the group disk quota information</para>
+ </listitem>
+ </itemizedlist>
+ <para>By default, quota is turned on after
+ <literal>quotacheck</literal> completes. However, this setting isn't
+ persistent and quota will have to be enabled again (via
+ <literal>lfs quotaon</literal>) if one of the Lustre targets is
+ restarted.
+ <literal>lfs quotaoff</literal> is used to turn off quota.</para>
+ <para>To enable quota permanently with a Lustre software release older
+ than release 2.4, the
+ <literal>quota_type</literal> parameter must be used. This requires
+ setting
+ <literal>mdd.quota_type</literal> and
+ <literal>ost.quota_type</literal>, respectively, on the MDT and OSTs.
+ <literal>quota_type</literal> can be set to the string
+ <literal>u</literal> (user),
+ <literal>g</literal> (group) or
+ <literal>ug</literal> for both users and groups. This parameter can be
+ specified at
+ <literal>mkfs</literal> time (
+ <literal>mkfs.lustre --param mdd.quota_type=ug</literal>) or with
+ <literal>tunefs.lustre</literal>. As an example:</para>
+ <screen>
+tunefs.lustre --param ost.quota_type=ug $ost_dev
+</screen>
+ <para>When using
+ <literal>mkfs.lustre --param mdd.quota_type=ug</literal> or
+ <literal>tunefs.lustre --param ost.quota_type=ug</literal>, be sure to
+ run the command on all OSTs and the MDT. Otherwise, abnormal results may
+ occur.</para>
+ <warning>
+ <para>
+ In Lustre software releases before 2.4, when new OSTs are
+ added to the file system, quotas are not automatically propagated to
+ the new OSTs. As a workaround, clear and then reset quotas for each
+ user or group using the
+ <literal>lfs setquota</literal> command. In the example below, quotas
+ are cleared and reset for user
+ <literal>bob</literal> on file system
+ <literal>testfs</literal>:
+ <screen>
+$ lfs setquota -u bob -b 0 -B 0 -i 0 -I 0 /mnt/testfs
+$ lfs setquota -u bob -b 307200 -B 309200 -i 10000 -I 11000 /mnt/testfs
+</screen></para>
+ </warning>
+ </section>
+ <section remap="h3" condition="l24">
+ <title>Enabling Disk Quotas (Lustre Software Release 2.4 and
+ later)</title>
+ <para>Quota setup is orchestrated by the MGS and <emphasis>all setup
+ commands in this section must be run on the MGS and project quotas need
+ lustre Relase 2.10 and later</emphasis>. Once setup, verification of the
+ quota state must be performed on the MDT. Although quota enforcement is
+ managed by the Lustre software, each OSD implementation relies on the
+ back-end file system to maintain per-user/group/project block and inode
+ usage. Hence, differences exist when setting up quotas with ldiskfs or
+ ZFS back-ends:</para>
+ <itemizedlist>
+ <listitem>
+ <para>For ldiskfs backends,
+ <literal>mkfs.lustre</literal> now creates empty quota files and
+ enables the QUOTA feature flag in the superblock which turns quota
+ accounting on at mount time automatically. e2fsck was also modified
+ to fix the quota files when the QUOTA feature flag is present. The
+ project quota feature is disabled by default, and
+ <literal>tune2fs</literal> needs to be run to enable every target
+ manually.</para>
+ </listitem>
+ <listitem>
+ <para>For ZFS backend, <emphasis>the project quota feature is not
+ supported yet.</emphasis> Accounting ZAPs are created and maintained
+ by the ZFS file system itself. While ZFS tracks per-user and group
+ block usage, it does not handle inode accounting for ZFS versions
+ prior to zfs-0.7.0. The ZFS OSD implements its own support for inode
+ tracking. Two options are available:</para>
+ <orderedlist>
+ <listitem>
+ <para>The ZFS OSD can estimate the number of inodes in-use based
+ on the number of blocks used by a given user or group. This mode
+ can be enabled by running the following command on the server
+ running the target:
+ <literal>lctl set_param
+ osd-zfs.${FSNAME}-${TARGETNAME}.quota_iused_estimate=1</literal>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Similarly to block accounting, dedicated ZAPs are also
+ created the ZFS OSD to maintain per-user and group inode usage.
+ This is the default mode which corresponds to
+ <literal>quota_iused_estimate</literal> set to 0.</para>
+ </listitem>
+ </orderedlist>
+ </listitem>
+ </itemizedlist>
+ <note>
+ <para>Lustre file systems formatted with a Lustre release prior to 2.4.0
+ can be still safely upgraded to release 2.4.0, but will not have
+ functional space usage report until
+ <literal>tunefs.lustre --quota</literal> is run against all targets. This
+ command sets the QUOTA feature flag in the superblock and runs e2fsck (as
+ a result, the target must be offline) to build the per-UID/GID disk usage
+ database.</para>
+ <para condition="l2A">Lustre filesystems formatted with a Lustre release
+ prior to 2.10 can be still safely upgraded to release 2.10, but will not
+ have project quota usage reporting functional until
+ <literal>tune2fs -O project</literal> is run against all ldiskfs backend
+ targets. This command sets the PROJECT feature flag in the superblock and
+ runs e2fsck (as a result, the target must be offline). See
+ <xref linkend="quota_interoperability"/> for further important
+ considerations.</para>
+ </note>
+ <caution>
+ <para>Lustre software release 2.4 and later requires a version of
+ e2fsprogs that supports quota (i.e. newer or equal to 1.42.13.wc5,
+ 1.42.13.wc6 or newer is needed for project quota support) to be
+ installed on the server nodes using ldiskfs backend (e2fsprogs is not
+ needed with ZFS backend). In general, we recommend to use the latest
+ e2fsprogs version available on
+ <link xl:href="http://downloads.whamcloud.com/e2fsprogs/">
+ http://downloads.whamcloud.com/public/e2fsprogs/</link>.</para>
+ <para>The ldiskfs OSD relies on the standard Linux quota to maintain
+ accounting information on disk. As a consequence, the Linux kernel
+ running on the Lustre servers using ldiskfs backend must have
+ <literal>CONFIG_QUOTA</literal>,
+ <literal>CONFIG_QUOTACTL</literal> and
+ <literal>CONFIG_QFMT_V2</literal> enabled.</para>
+ </caution>
+ <para>As of Lustre software release 2.4.0, quota enforcement is thus
+ turned on/off independently of space accounting which is always enabled.
+ <literal>lfs quota
+ <replaceable>on|off</replaceable></literal> as well as the per-target
+ <literal>quota_type</literal> parameter are deprecated in favor of a
+ single per-file system quota parameter controlling inode/block quota
+ enforcement. Like all permanent parameters, this quota parameter can be
+ set via
+ <literal>lctl conf_param</literal> on the MGS via the following
+ syntax:</para>
+ <screen>
+lctl conf_param <replaceable>fsname</replaceable>.quota.<replaceable>ost|mdt</replaceable>=<replaceable>u|g|p|ugp|none</replaceable>
+</screen>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>ost</literal> -- to configure block quota managed by
+ OSTs</para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>mdt</literal> -- to configure inode quota managed by
+ MDTs</para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>u</literal> -- to enable quota enforcement for users
+ only</para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>g</literal> -- to enable quota enforcement for groups
+ only</para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>p</literal> -- to enable quota enforcement for projects
+ only</para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>ugp</literal> -- to enable quota enforcement for all users,
+ groups and projects</para>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>none</literal> -- to disable quota enforcement for all users,
+ groups and projects</para>
+ </listitem>
+ </itemizedlist>
+ <para>Examples:</para>
+ <para>To turn on user, group, and project quotas for block only on
+ file system
+ <literal>testfs1</literal>, <emphasis>on the MGS</emphasis> run:</para>
+ <screen>$ lctl conf_param testfs1.quota.ost=ugp
+</screen>
+ <para>To turn on group quotas for inodes on file system
+ <literal>testfs2</literal>, on the MGS run:</para>
+ <screen>$ lctl conf_param testfs2.quota.mdt=g
+</screen>
+ <para>To turn off user, group, and project quotas for both inode and block
+ on file system
+ <literal>testfs3</literal>, on the MGS run:</para>
+ <screen>$ lctl conf_param testfs3.quota.ost=none
+</screen>
+ <screen>$ lctl conf_param testfs3.quota.mdt=none
+</screen>
+ <section>
+ <title>
+ <indexterm>
+ <primary>Quotas</primary>
+ <secondary>verifying</secondary>
+ </indexterm>Quota Verification</title>
+ <para>Once the quota parameters have been configured, all targets
+ which are part of the file system will be automatically notified of the
+ new quota settings and enable/disable quota enforcement as needed. The
+ per-target enforcement status can still be verified by running the
+ following <emphasis>command on the MDS(s)</emphasis>:</para>
+ <screen>
+$ lctl get_param osd-*.*.quota_slave.info